标题: MCU串口如何接收不定长数据 [打印本页]

作者: wang元    时间: 2023-9-25 15:24
标题: MCU串口如何接收不定长数据
关于MCU串口的接收数据有这些问题想问一下各位:
1:在中断里通过验证帧头帧尾来判断是否接收到完整的一帧数据,传输数据时,数据帧里有一位和帧尾一样就无法正常传输了,应该如何解决?
2:用stm32有一个IDLE中断位来接收不定长的数据,他是怎么判断数据已经一帧了?我看网上的例程都是传字符串,我传一组16位数据包可以吗实现吗?(我一直无法实现)
3:有什么办法可以更好地接受固定帧头帧尾,不定长的数据的方法吗?
4:中断里是不是不可以有太复杂的程序要跑,要尽快出中断?
谢谢各位的指导与帮助。

作者: Hephaestus    时间: 2023-9-25 20:04
四个问题其实就是一个问题,如何定协议,如果走ASCII码,那么帧头帧尾的字符不应该出现在数据中间,比如“:P82373\r\n”,:是帧头,\r\n是帧尾,P82373是数据。再一种利用时间间隔,3.5个字节传输时间的总线空闲表示数据帧间隔,出现这么长时间的空闲,下面来的第一个字符就是帧头,出现这么长的空闲,刚才收到的最后一个字符就是帧尾,数据帧里面可以出现任何字符。ASCII码方式适合实时性不太好的场合,比如上位机就没啥实时性。时间间隔适合于实时性很强的设备,比如单片机到单片机通讯。
作者: LaoYuTou    时间: 2023-9-26 08:29
看看modbus是怎么解决这个问题的,modbus应该也算是定长的,但又是不定长的,就是每次发的帧长度不一定相同,但是他又要求每一帧数据的长度。固定帧头,定好协议,比方帧头后就是数据长度,数据长度是2个字节,那么后面跟着那么长的数据就完了。当然超时判断是最好有的。
作者: aking991    时间: 2023-9-26 08:32
先设定一种超时方法和设定缓存区,然后把接收到有数据时即存入到缓存区中,待超时后再去判断缓存区里的数据,这样就可以了
作者: fanwei326    时间: 2023-9-26 09:09
aking991 发表于 2023-9-26 08:32
先设定一种超时方法和设定缓存区,然后把接收到有数据时即存入到缓存区中,待超时后再去判断缓存区里的数据 ...

这种方法最实用
作者: bemc    时间: 2023-9-26 12:41
定通信协议,每次都要有数据长度的信息。
作者: zyftank    时间: 2023-9-26 13:06
可以加个空闲判断,在接收数据后,空闲XX毫秒结束一帧数据的传输。
作者: Hephaestus    时间: 2023-9-26 14:48
LaoYuTou 发表于 2023-9-26 08:29
看看modbus是怎么解决这个问题的,modbus应该也算是定长的,但又是不定长的,就是每次发的帧长度不一定相同 ...

我在沙发说的就是MODBUS,你该不会是不知道MODBUS有ASC和RTU两种模式吧?
作者: zhai1995    时间: 2023-9-26 16:39
定时器做个超时标志就可以嘞。
作者: ly1972001    时间: 2023-9-28 09:21
找一个成熟的协议,就能明白,怎么进行可靠稳定的通信。比如188协议。
作者: 人中狼    时间: 2023-9-28 10:06
纯粹的协议设计问题
作者: zh_junwei    时间: 2023-10-19 10:01
可以检测串口的空闲时间来判断一帧完成,只是要用个定时器
作者: 圣博朗西斯    时间: 2023-10-27 13:20
定义个贞的结尾数据,前一个为校验数据,接收到结尾数据进行校验,校验不对说明数据未接收完整继续接受
作者: @tangtangtan    时间: 2023-10-27 17:56
直接用空闲中断就可以




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1