本帖最后由 电小龙 于 2018-9-6 16:36 编辑 在项目中经常会遇到接收一包数据,就比如0xaa,0x55,0xXX,0xXX,0x0a,0x0d。0xaa,0x55位包头,下一个为数据,再下一个为校验和,0x0a,0x0b为包尾。在串口接收中采用中断接收的方式。 我先说说我的做法:先定义一个uint8_t Buff和一个uint8_t Table[10];在接收中断函数里用HAL_UART_Receive_IT(&UART1_Handler, &Buff, 1)这个函数,每次在中断里面都判断Buff是不是0xaa,如果是则将数据存入到Table[0]中且继续接收下面的数据,都存入到Table的数组中,如果不是则继续进行判断。然后对Table进行判断,首先判断Table[0]和Table[1]分别为0xaa,0x55后,在进行判断Table[4]和Table[5]分别为0x0a,0x0d。在进行判断校验是否正确,正确后取出Table[2]的数据进行处理。 在这里面我有些疑问:如果我初始化时和接收中断里写的是HAL_UART_Receive_IT(&UART1_Handler, &Table, 6),是不是在串口接收到5个8位数据后才会进入到串口中断。如果是这样的话,使用这种方式会不会存在另一个问题,若最开始我接收到了一个8位的无效数据,如0xff,在后面再接收数据的话就会出现0xff,0xaa,0x55,0xXX,0xXX,0x0a,这样将会导致接收不到正确的数据帧。是不是还有超时的处理可以解决这问题,但是不知道该怎样加一个超时判断,当有一小段时间没有收到数据就清空缓存区。 这是我使用串口中断时的迷惑,有兴趣的可以一起讨论下,也借鉴一下各位的处理方法。 |
串口除了接收会产生中断,还有一个Idle中断,在接收中断中填充接收buff,然后在Idle中断中处理buff。
这样处理的话,字节的数量都不是问题(前提是没有溢出,一般buff预留大一点就行)
评分
查看全部评分
麻烦能告诉我一下这个Idle中断函数对应的是哪个吗?还有Idle中断是每接收一个8位的数据都会进入这个Idle中断吗?还是说如果我设置成HAL_UART_Receive_IT(&UART1_Handler, &Table, 6)就会在接收完6个字节的数据后才会进入这个idle中断、、
谢谢,我也百度了,IDLE中断确实是解决这个问题的利器、、
看看这个帖子
https://www.stmcu.org.cn/module/forum/thread-609561-1-14.html
HAL库UART的几个常用函数讲解+中断处理过程讲解
好的,谢谢