【STM32】串口
一、 串口中断使能问题
错误:
串口只能接收一次数据,从串口助手发第二个数据时接收不到。
分析:
在UART_Receive_IT(huart)函数里,回调函数的上面有如下代码:
这几行代码的作用是关闭串口接收中断,也就是说,在一次串口中断接收过程的最后,即串口接收完一组数据之后会关闭串口接收中断。
解决:
在回调函数中实现接收到数据之后的操作(比如处理数据)并再次使能串口接收中断。
总结:
串口中断接收用法:
(1)指定一个缓存区(串口接收到的数据会全部堆到这个缓存区)
(2)使能串口接收中断,并把缓存区对应到串口
(3)在回调函数中实现接收到数据之后的操作(比如处理数据)并再次使能串口接收中断。
串口接收的流程:
(1)串口一个接一个的接收到数据填充到缓存区
(2)缓存区满(大小是用户定义的)程序几经辗转最后会调用到回调函数。
(3)执行用户在回调函数中实现的功能。
参考链接:
https://www.cnblogs.com/dongxiaodong/p/14275284.html
二、串口助手配置问题
错误:
从串口助手发送1个数据,经过取反后再次发送到上位机,得到了3个数据,且多的数据是F2和F5。
分析:
F2和F5的原数据是0A和0D,其对应的ASCII分别是换行符和回车符。这是由于我们在串口助手中勾选了“发送新行”,因此每次从上位机向单片机发送1个数据后,串口助手会自动换行,即加上\n和\r两个符号。
解决:
去勾选“发送新行”即可。
三、printf重定向
C语言中printf默认输出设备是显示器,但单片机并没有显示器,因此我们就用串口来打印数据,此时就需要将printf函数重定向一下。
printf函数底层是调用了fputc函数,而这个函数是一个弱化函数,所以我们只需要在usart.c中重写这个函数并使其作用于串口即可。这时候我们只需要包含stdio.h即可调用printf函数实现串口的发送功能。
以下两种重定向的方式均可。
int fputc(int ch,FILE *f) { HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,100); return ch; }
#include "stdio.h" #ifdef __GNUC__ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif PUTCHAR_PROTOTYPE { HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF); return ch; }