串口是STM32最为重要的资源,在平时的硬件调试和软件调试中都是不可或缺的工具,最近在测试一块板子的通信功能是否正常,我打算用板子A的串口USART1一直向串口发送数据,用板子B的串口1接收数据,并将接收到的数据经过处理后显示在LCD液晶上。所以就写了下面的串口发送程序,发送的是数组函数。
Main.c
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
u8 USART_fasong_Buf[8]={12,35,00,12,12,34,90,00}; // 接收缓冲区字节长度200
//u16 res=9;
void USART1_Send_Data(u8 *buf,u8 len);
/*************************方法2*******************
void USART_OUT(USART_TypeDef* USARTx, uint8_t *Data,...);
*********************************************/
int main(void)
{
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
LED_Init(); //LED端口初始化
KEY_Init(); //初始化与按键连接的硬件接口
while(1)
{
USART1_Send_Data(USART_fasong_Buf,8);
delay_ms(1000);
/***********************方法2**************/
// USART_OUT(USART1,"12");
// USART_OUT(USART1,"* STM32F103-USART1串口一直发送数据*rn");
// USART_OUT(USART1,"1234567890rn");
// USART_OUT(USART1,"fufufufu1019rn");
// USART_OUT(USART1,"rn");
// USART_OUT(USART1,"rn");
}
}
void USART1_Send_Data(u8 *buf,u8 len) //发送数据函数,带发送长度
{
u8 t;
for(t=0;t { while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); USART_SendData(USART1,buf[t]); } while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); } Usart.c char *itoa(int value, char *string, int radix); typedef struct __va_list { void *__ap; } va_list; /**************************************************************************** * 名 称:void USART_OUT(USART_TypeDef* USARTx, uint8_t *Data,...) * 功 能:格式化串口输出函数 * 入口参数:USARTx: 指定串口 Data: 发送数组 ...: 不定参数 * 出口参数:无 * 说 明:格式化串口输出函数 "r" 回车符 USART_OUT(USART1, "abcdefgr") "n" 换行符 USART_OUT(USART1, "abcdefgrn") "%s" 字符串 USART_OUT(USART1, "字符串是:%s","abcdefg") "%d" 十进制 USART_OUT(USART1, "a=%d",10) * 调用方法:无 ****************************************************************************/ void USART_OUT(USART_TypeDef* USARTx, uint8_t *Data,...) { const char *s; int d; char buf[16]; va_list ap; va_start(ap, Data); while(*Data!=0){ //判断是否到达字符串结束符 if(*Data==0x5c){ //'' switch (*++Data){ case 'r': //回车符 USART_SendData(USARTx, 0x0d); Data++; break; case 'n': //换行符 USART_SendData(USARTx, 0x0a); Data++; break; default: Data++; break; } } else if(*Data=='%'){ // switch (*++Data){ case 's': //字符串 s = va_arg(ap, const char *); for ( ; *s; s++) { USART_SendData(USARTx,*s); while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET); } Data++; break; case 'd': //十进制 d = va_arg(ap, int); itoa(d, buf, 10); for (s = buf; *s; s++) { USART_SendData(USARTx,*s); while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET); } Data++; break; default: Data++; break; } } else USART_SendData(USARTx, *Data++); while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET); } } /****************************************************** 整形数据转字符串函数 char *itoa(int value, char *string, int radix) radix=10 标示是10进制 非十进制,转换结果为0; 例:d=-379; 执行 itoa(d, buf, 10); 后 buf="-379" **********************************************************/ char *itoa(int value, char *string, int radix) { int i, d; int flag = 0; char *ptr = string; /* This implementation only works for decimal numbers. */ if (radix != 10) { *ptr = 0; return string; } if (!value) { *ptr++ = 0x30; *ptr = 0; return string; } /* if this is a negative value insert the minus sign. */ if (value < 0) { *ptr++ = '-'; /* Make the value positive. */ value *= -1; } for (i = 10000; i > 0; i /= 10) { d = value / i; if (d || flag) { *ptr++ = (char)(d + 0x30); value -= (d * i); flag = 1; } } /* Null terminate the string. */ *ptr = 0; return string; } /* NCL_Itoa */
上一篇:STM32f103之流水灯
下一篇:stm32f103串口实现重映射功能
推荐阅读最新更新时间:2024-03-16 16:27
设计资源 培训 开发板 精华推荐
- 零起点入门,带你动手做AVR开发板
- 夏末狂欢,观看TI 课程有好礼!
- 《美光2022台北国际电脑展主题演讲精选:数据中心专辑》,关注、评论赢固态硬盘等好礼!
- 【迎新迎国庆】dcexpert带你“全栈”动手搞:基于ESP8266可充电的触控创意LED灯
- 有奖直播|安森美高能效产品在 EV-Charger 市场的应用
- 直播已结束【最新 TI C2000实时控制芯片 — F28003X】
- 试用Vishay新型“IHLP磁芯损耗计算器”,抢楼赢好礼
- ADI有奖下载活动之6 ADI基于IEC61850的智能电子设备(IED)系统解决方案
- 【EEWORLD第三十六届】2012年03月社区明星人物揭晓!
- 为“ADI实验室电路”寻建议!