Modbus通信协议的数据接收 程序中,如何判断一次数据接受已经完毕?

我的数据接受程序采用中断方式运行,串口中断一次接受一个字符,在不知道发送数据长度的情况下,有必要判断数据是否接受完毕?... 我的数据接受程序采用中断方式运行,串口中断一次 接受一个字符,在不知道 发送数据长度的情况下,有必要判断数据是否接受完毕? 展开
 我来答
59分粑粑分享生活
高粉答主

2020-02-28 · 专注生活好物分享,解答日常方方面面的问题
59分粑粑分享生活
采纳数:326 获赞数:119835

向TA提问 私信TA
展开全部

无需关心数据是否接收完毕,只要有数据发过来,都收到自己的缓冲区当中。

应用层,打开一个任务以定期扫描缓冲区中的新数据。 如果有新数据,确定其是否为必需的协议帧。 通过帧头帧尾标识符还有校验等判断接收帧的正确性,如果正确再处理,不正确丢弃。

Modbus没有固定的帧头标记,长度也没有固定。 判断时,首先查找具有正确地址的字符,然后找出后续功能代码是否正确。 根据功能代码,确定后续数据有多长并进行校验。 如果验证正确,则说明帧是正确的。

扩展资料:

举例说明如下:

从站地址03,从0开始读取10个寄存器,则接收到的帧为03 03 00 00 00 0a xx xx,查找从站地址03的字节,找到后,以下功能码为03,符合功能码范围。 

该功能码的数据包括固定为8个字节的校验和,然后在其后没有8个字节时,表示其已被没收,然后在关闭后进行判断。 如果正确,则可以在应用层中正确处理该帧。

zhuri12
推荐于2018-03-08
知道答主
回答量:8
采纳率:100%
帮助的人:6.4万
展开全部
我做过modbus规约开发。你说的是驱动程序接收数据这一块,这部分无需关心数据是否接收完毕,只要有数据发过来,都收到自己的缓冲区当中。然后在应用层开启个任务定时扫描缓冲区中的新数据,如果有新数据则判断是否是需要的规约帧,通过帧头帧尾标识符还有校验等判断接收帧的正确性,如果正确再处理,不正确丢弃。
对于modbus没有固定的帧头标记,也没有固定长度。判断的时候先寻找地址正确的字符,找到后在判断后面的功能码是否正确,根据功能码判断后面的数据有多长并进行校验,如果校验也都对了那么这个帧就正确了。
例如从站地址03,读从0开始的寄存器10个,则接收到的帧为 03 03 00 00 00 0a xx xx,你寻找从站地址03的字节,找到后,后面的功能码是03,符合功能码范围。这个功能码的数据包括校验固定为8个字节,那么当后面没有8个字节时表示没收完,退出等收完再判断,收完后计算校验与收到的检验码比较,如果正确,则这帧接收正确进入应用层处理即可。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
abel78deng
2011-01-04
知道答主
回答量:10
采纳率:0%
帮助的人:0
展开全部
首先,在RTU方式下,MODBUS协议是根据3.5个字符时间内有没有接收数据来判断是否接受完成。
其次,在ASCII方式下,根据回车换行符来作为接受完成的标志。但是ASCII负载是RTU方式的两倍。
由于MODBUS是连续发生一串字符,一个字符中断一次的方法比较危险,很容易丢包,最好启动FIFO之类的硬件资源。如果是三星ARM,建议你用FIFO+DMA方式。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
LouxingLee
2011-01-04
知道答主
回答量:9
采纳率:0%
帮助的人:2.9万
展开全部
如果你采用ASCII 模式,以回车换行符作为结束符。如果是RTU模式,则是3.5个字符时间,具体时间跟你的波特率有关,自己算一下。不过,最好留点余量。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式