编写丢失数据帧的串口重映射(重定向)函数
- 在USART1.h里添加 #include <stdio.h> 头文件
- 编写串口重映射函数
1. int fputc(int Data, FILE *BUF) 2. { 3. USART_SendData(USART1, Data);//串口1发送数据Data 4. while ( USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);//USART_FLAG_TC标志位 运行不稳定 5. // while ( USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); 6. 7. return Data; 8. }
然后开启支持库,勾选 UseMicroLIB
然后在while(1)中直接调用printf()函数即可
1. #include "stm32f10x.h" // Device header 2. #include "Delay.h" 3. #include "LED.h" 4. #include "USART1.h" 5. 6. int main(void) 7. { 8. Delay_Init (72); 9. USART1_Init(115200); //串口1波特率:115200 10. 11. while(1) 12. { 13. printf("2023新年快乐!你要加油!\r\n"); 14. Delay_ms(1500); 15. } 16. } 17. 18. /***********************************END OF FILE***********************************/
连接USB转TTL
参考【STM32】串口通讯USART串口中断配置硬件接线
下载程序,打开串口,有可能出现这种乱码的情况
然后在编码设置里,更改成UTF-8编码格式即可
看实际效果
在串口调试助手中可以看到接收到的大部分数据是正常的,但是按下复位按键之后,就会有数据帧丢失!!!!!
效果不理想~_~
修改fputc()函数!
USART_FLAG_TC 和 USART_FLAG_TXE标志位有细微区别
代码里改成检测USART_FLAG_TXE标志位
这才是串口重定向函数!!!
1. int fputc(int Data, FILE *BUF) 2. { 3. USART_SendData(USART1, Data);//串口1发送数据Data 4. // while ( USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);//USART_FLAG_TC标志位 运行不稳定 5. // 如果==0,就一直在这循环等待,直到等于1才跳出循环,这个标志位是1的时候,代表发送完成了 6. while ( USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); 7. 8. return Data; 9. }
多按下复位按键,也没有数据帧丢失!检测USART_FLAG_TXE标志位,数据接收更加稳定!
串口打印标识符
效果如下
直接粘main.c代码
1. #include "stm32f10x.h" // Device header 2. #include "Delay.h" 3. #include "LED.h" 4. #include "USART1.h" 5. 6. char str[] = "2023年1月20日14:42:56"; 7. 8. int main(void) 9. { 10. Delay_Init (72); 11. USART1_Init(115200); //串口1波特率:115200 12. 13. printf("\r\n"); //换行 14. printf("%d\r\n", 255); //十进制输出255 15. printf("%x\r\n", 255); //十六进制方式输出255,小写的十六进制 ff 16. printf("%X\r\n", 255); //十六进制方式输出255,大写的十六进制 FF 17. printf("%#x\r\n", 255); //输出0xff 18. printf("%#X\r\n", 255); //输出0xFF 19. printf("%f\r\n", 255.0); //输出255.000000 20. printf("%.2f\r\n", 255.6666); //输出255.67 21. printf("%0.8d\r\n", 255); //蓝牙&红外遥控 输出完整信息 22. printf("%s\r\n","Stay hungry stay foolish!"); //注意结尾要输入英文状态下的感叹号 23. printf("2023新年快乐!你要加油呀!\r\n"); 24. printf("%s\r\n",str); 25. printf("\r\n"); //换行 26. 27. while(1) 28. { 29. // printf("2023新年快乐!你要加油呀!\r\n"); 30. // Delay_ms(1500); 31. } 32. } 33. 34. /***********************************END OF FILE***********************************/
最后验证USART_FLAG_TXE标志位状态
在while(1)获取USART_FLAG_TXE标志位状态即可
1. while(1) 2. { 3. // printf("2023新年快乐!你要加油呀!\r\n"); 4. printf("%d\r\n", USART_GetFlagStatus(USART1, USART_FLAG_TXE));//获取USART_FLAG_TXE标志位状态 5. Delay_ms(200); 6. }
可以发送完数据, USART_FLAG_TXE == 1,跳出fputc函数的while循环,即发送完成!