STM32串口中断接收不定长报文介绍

功能实现背景介绍本项目中,需要使用stm32的usart6串口与fpga板(下位机)通信,需要发送和接收数据,有报文应答机制。
使用的报文规则如表格所示
板间报文的通信协议,校验使用的是和校验
u8 tx_checksum(u8 *buf, u8 len) //buf为数组,len为数组长度{ u8 i, ret = 0; for(i=0; i< len; i++) { ret += *(buf++); } ret = ~ret; return ret;}u8 rx_checksum(u8 *buf, u8 len) //buf为数组,len为数组长度{ u8 i, ret = 0; for(i=0; irxstate == hal_uart_state_ready) { if ((pdata == null) || (size == 0u)) { return hal_error; } /* process locked */ __hal_lock(huart); huart- >prxbuffptr = pdata; huart- >rxxfersize = size; huart- >rxxfercount = size; huart- >errorcode = hal_uart_error_none; huart- >rxstate = hal_uart_state_busy_rx; /* process unlocked */ __hal_unlock(huart); /* enable the uart parity error interrupt */ __hal_uart_enable_it(huart, uart_it_pe); /* enable the uart error interrupt: (frame error, noise error, overrun error) */ __hal_uart_enable_it(huart, uart_it_err); /* enable the uart data register not empty interrupt */ __hal_uart_enable_it(huart, uart_it_rxne); return hal_ok; } else { return hal_busy; }}这个函数本质上其实不是中断接收函数,只是配置函数,配置开启中断的信息,并且接收多少定长的数据结束本数据接收,串口的中断接收还是在中断中进行。
我们本次的长度虽然也是定长,但是有两种长度数据的接收,所以还是从设计接收不定长的数据为最终效果。
状态机的运用对于不定长数据的接收,使用了状态机,分两次中断来接收数据
void hal_uart_rxcpltcallback(uart_handletypedef *huart){ if(huart- >instance == usart6) // 判断是由哪个串口触发的中断 { if(statemachine_usart6) //状态机为1,都接收完毕,准备校验 { if(re_flag6 == 1) { uart6_rxcounter = 6; re_flag6 = 0; } else { len_counter6 = 2+5+uart6_rxbuffer[2]+(uart6_rxbuffer[3]< <8); if(uart6_rxbuffer[len_counter6 - 1] == 0x55 && uart6_rxbuffer[0] == 0xaa) { uart6_rxcounter = len_counter6; } else { memset(uart6_rxbuffer,0,0x400); uart6_rxcounter = 0; } } statemachine_usart6 = 0; //状态机为0 len_counter6 = 0; hal_uart_receive_it(&huart6,uart6_rxbuffer,5); } else //状态机为0,只接受到了前五个字节,继续接收后面的字节 { if(uart6_rxbuffer[0] == 0xaa) { statemachine_usart6 = 1; uart6_rxcounter = 5; if(uart6_rxbuffer[2] == 0 && uart6_rxbuffer[3] == 0) { hal_uart_receive_it(&huart6,(uint8_t*)&uart6_rxbuffer[5], 1); re_flag6 = 1; } else hal_uart_receive_it(&huart6,(uint8_t*)&uart6_rxbuffer[5], 2 + uart6_rxbuffer[2] + (uart6_rxbuffer[3] < < 8)); } else { memset(uart6_rxbuffer,0,0x400); uart6_rxcounter = 0; hal_uart_receive_it(&huart6,uart6_rxbuffer,5); } } }}核心思想就是先接收报文的头,根据头来判断后面的长度,把应答报文和音量数据报文区分开,不合格的报文直接舍去同时开启新的接收。

SKYLAB:室外定位靠卫星,室内定位靠什么呢?
飞思卡尔半导体三款新MCU电表和流量计量 具备高效、安全双保险
福日电子披露年报,公司2018年实现营业总收入109.9亿
华为狂砸钱:为Mate9买下一辆高铁!网友:华为P10又要涨价了!
英集芯科技IP5385移动电源单芯片荣获UFCS认证
STM32串口中断接收不定长报文介绍
简述电机传感器控制的各个层面
德国开发出一种新型固态电池 不到1个小时就能充足电
Celgard 宣布扩大韩国锂离子电池隔板厂的产能
电热鼓风干燥箱产品特点的简单描述
小米首款潮搭单品即将亮相,疑似采用圆形表盘设计的手表
自动化测试在国际软件测试中的应用
智能镜子显示屏将重新定义我们的家居生活
首发骁龙835的不是小米6也不是三星S8 而是索尼XZ Premium!
晶体管是如何工作的?BJT和MOSFET晶体管区别
大型工业区污水管PH传感器监测
一体成型电感的线材选型以及绕线工艺焊接工艺
plc控制柜功能
使用光学传感器检测颗粒
浅谈电线电缆编织层那些你所不知道的作用