ST的串口接收没有硬件FIFO,我一直使用的是接收非空中断(RXNE)中单字节读取的方式进行数据接收。用此方式进行数据接收会导致每一个字节都要进入中断处理,感觉上比较浪费资源,但好处是可以接收任意字长的数据(255以内)。
本次项目开发ST作为串口通讯的主机,因为知道返回数据的格式,可以很好的处理通讯不定字长的情况,因此我想尝试换成查询接收的方式,函数使用正点原子的HAL库函数HAL_UART_Receive(&USART2_RS485Handler,tx_buf,len,1000);,测试成功。
串口助手发送数据的截图
接收到数据的数组的截图
下面说下调试过程中遇到的坑。
1、只能接收到第一个字节的数据
采坑点:
1)在debug模式下监控了usart的寄存器,监控寄存器的操作会导致仿真器读取DR寄存器,读取之后DR寄存器清零并且SR寄存器的接收非空标志位RXNE清零,导致不能正确接收数据。
2)在主函数中设置全局变量,利用赋值的方式监控RXNE标志位,在把GET_FLAG标志位在Watch 1中监控。监控时根本监控不到该变量置1的的瞬间。原因是数据被清零太快,监控器捕捉不到。
3)把GET_FLAG标志位放在逻辑分析仪中进行监控,发现其也不能查看到信号的变化。原因猜测仍为数据清零太快,不能监测到。如果中间加入延时,是可以查看到变化的。