目录
串口数据收发流程(字符串)
1. 综述
STM32通过串口1和上位机对话,在接收到串口助手发送过来的字符串(以回车换行结束“\r\n”)后,会返回给串口助手。同时每隔一定时间,通过串口1输出一段信息,可以通过串口助手显示接收。
2. 串口接收数据
①调用函数HAL_UART_Receive_IT(),开启接收中断,同时设置接收的缓存区以及接收的数据量。
当接收到一个字符之后,系统调用中断处理函数USART1_IRQHandler。在函数HAL_UART_IRQHandler中执行中断处理逻辑,而中断控制逻辑则通过判断中断类型是否完成中断在其中的函数UART_Receive_IT中执行,该函数会把数据保存在串口句柄的成员变量pRxBuftPtr缓存中,同时 RxXferCount计数器减1。如果我们设置 RxXferSize=10,那么当接收到10个字符之后,RxXferCount 会由 10减到 0(RxXferCount 初始值等于 RxXfersize),这个时候再调用接收完成回调函数HAL_UART_RxCpltCallback 执行。
②UART_Receive_IT函数中自动失能中断,需要再次开启中断才能再次接收数据。
③接收协议设计:【 定义数组g_usart_rx_buf[]、接收状态寄存器g_usart_rx_sta(自行添加)实现对串口数据的收发管理 】当接收到从电脑发过来的数据,把接收到的数据保存在 g_usart_rx_buf[] 中,同时在接收状态寄存器(g_usart_rx_sta) 中计数接收到的有效数据个数,当收到回车(由2个字节组成:0X0D 和0X0A)的第一个字节0XOD时,计数器将不再增加,等待0X0A的到来,而如果 0X0A 没有来到,则认为这次接收失败,重新开始下一次接收。如果顺利接收到 OX0A,则标记 g_usart_rx_sta 的第15 位,这样完成一次接收,并等待该位被其他程序清除,从而开始下一次的接收,而如果迟迟没有收到OX0D,那么在接收数据超过g_usart_rx_buf长度的时候,则会丢弃前面的数据,重新接收。
3. 串口发送数据
首先判断全局变量 g_usart_rx_sta 的最高位是否为1,如果为1的话,那么代表前一次数据接收已经完成,接着将自定义缓冲区的数据发送到串口。
笔记还有较多遗漏,后期补充