嵌入式学习小组
直播中

张婷

7年用户 198经验值
私信 关注

串口接收怎么判断一帧数据接收完毕的几种方式?

1.设定好通讯协议,如包头+长度+数据+校验+包尾,那么中断中每收到一个字节就判断,直到收到包尾为止。这是51时代用得比较多的状态机接收流程。
但如果由于接收中断被嵌套,或干扰等原因导致一帧数据的后部分丢失,就是说接收不到包尾,那么这个状态机如何能自动复位以便接收下一帧?
2.串口空闲中断也是用得比较多的一种方法,但是波特率较高的时候,空闲中断的触发时间相应变短,使得接收中断不被打断的要求变高,如果接收中断被耽误了,从而触发空闲中断,也是收不到完整数据。
3.定时器中断代替串口空闲中断,这个可以避免串口空闲中断时间不够的问题,因为这个定时器中断可以自己设置。但是一个串口需要搭配一个定时器使用,不爽。
4.串口接收只把数据放到缓存,此外不做任何事情。然后在另一个线程不断parse这个缓存,从头开始找其中有没有符合一帧的数据,如果有就是解析,同时将这一帧从缓存中删掉,如果没有就什么也不做。这样的程序就不用管一帧是否结束,可以较好的适应各种收不全、丢数据的问题。
问题是,这个思路我在PC上位机中用过没问题,但是在STM32要是我定义的缓存是一个固定大小字节数组,当我解析到了一帧数据后,如何这帧数据从缓存中去掉,即如何做一个动态数组的结构之类的?
大家有没有什么好的办法分享?

回帖(8)

王玉英

2020-3-25 08:06:55
顶!!
来自: 微社区
举报

李峰

2020-3-25 08:33:39
楼上,肯定是固定几十MS没收到下一个数据就判定接收完成啦,不过这种方法比较多个定时器中断而且比较频繁。
举报

h1654155275.5954

2020-3-25 08:50:05
动态数组结构用链表就可以了!查找,删除和插入都比较方便。
举报

王聪

2020-3-25 08:56:28
项目中都是4点全用的
1+4 由应用程序处理
2+3 由驱动处理,以提高驱动程序的效率,同时也要有一定的实时性。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分