找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2147|回复: 13
收起左侧

MCU串口如何接收不定长数据

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

使用道具 举报

ID:883242 发表于 2023-9-25 20:04 | 显示全部楼层
四个问题其实就是一个问题,如何定协议,如果走ASCII码,那么帧头帧尾的字符不应该出现在数据中间,比如“:P82373\r\n”,:是帧头,\r\n是帧尾,P82373是数据。再一种利用时间间隔,3.5个字节传输时间的总线空闲表示数据帧间隔,出现这么长时间的空闲,下面来的第一个字符就是帧头,出现这么长的空闲,刚才收到的最后一个字符就是帧尾,数据帧里面可以出现任何字符。ASCII码方式适合实时性不太好的场合,比如上位机就没啥实时性。时间间隔适合于实时性很强的设备,比如单片机到单片机通讯。
回复

使用道具 举报

ID:1080935 发表于 2023-9-26 08:29 | 显示全部楼层
看看modbus是怎么解决这个问题的,modbus应该也算是定长的,但又是不定长的,就是每次发的帧长度不一定相同,但是他又要求每一帧数据的长度。固定帧头,定好协议,比方帧头后就是数据长度,数据长度是2个字节,那么后面跟着那么长的数据就完了。当然超时判断是最好有的。
回复

使用道具 举报

ID:65956 发表于 2023-9-26 08:32 | 显示全部楼层
先设定一种超时方法和设定缓存区,然后把接收到有数据时即存入到缓存区中,待超时后再去判断缓存区里的数据,这样就可以了
回复

使用道具 举报

ID:404893 发表于 2023-9-26 09:09 | 显示全部楼层
aking991 发表于 2023-9-26 08:32
先设定一种超时方法和设定缓存区,然后把接收到有数据时即存入到缓存区中,待超时后再去判断缓存区里的数据 ...

这种方法最实用
回复

使用道具 举报

ID:285863 发表于 2023-9-26 12:41 | 显示全部楼层
定通信协议,每次都要有数据长度的信息。
回复

使用道具 举报

ID:74687 发表于 2023-9-26 13:06 | 显示全部楼层
可以加个空闲判断,在接收数据后,空闲XX毫秒结束一帧数据的传输。
回复

使用道具 举报

ID:883242 发表于 2023-9-26 14:48 | 显示全部楼层
LaoYuTou 发表于 2023-9-26 08:29
看看modbus是怎么解决这个问题的,modbus应该也算是定长的,但又是不定长的,就是每次发的帧长度不一定相同 ...

我在沙发说的就是MODBUS,你该不会是不知道MODBUS有ASC和RTU两种模式吧?
回复

使用道具 举报

ID:267932 发表于 2023-9-26 16:39 | 显示全部楼层
定时器做个超时标志就可以嘞。
回复

使用道具 举报

ID:236035 发表于 2023-9-28 09:21 | 显示全部楼层
找一个成熟的协议,就能明白,怎么进行可靠稳定的通信。比如188协议。
回复

使用道具 举报

ID:384109 发表于 2023-9-28 10:06 | 显示全部楼层
纯粹的协议设计问题
回复

使用道具 举报

ID:675287 发表于 2023-10-19 10:01 | 显示全部楼层
可以检测串口的空闲时间来判断一帧完成,只是要用个定时器
回复

使用道具 举报

ID:1097455 发表于 2023-10-27 13:20 | 显示全部楼层
定义个贞的结尾数据,前一个为校验数据,接收到结尾数据进行校验,校验不对说明数据未接收完整继续接受
回复

使用道具 举报

ID:817106 发表于 2023-10-27 17:56 | 显示全部楼层
直接用空闲中断就可以
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表