pcsms_qkPGovES 发表于 2019-4-27 17:30:09

MODBUS RTU协议数据处理问题

本帖最后由 pcsms_qkPGovES 于 2019-4-27 17:32 编辑

charresponse
shortread_data
//省略发送部分
INPORT(response, "MODBUS RTU Device", 21, return_value)//response[]储存从机返回的数据
SetData(response,"Local HMI", LW, 504,4)//观察用
read_data = response + (response << 8)//合并为16bit数据
read_data = response + (response << 8)
SetData(read_data,"Local HMI", LW, 506,2)//观察用

在触摸屏上放置两个数值显示元件,地址分别为LW504和LW506,数据格式设置为32bit HEX
按理说两者显示除了顺序应该完全相同,但是LW506高16bit始终比原始数据小1
如response接收到0X8780,在LW504读到0X8087,但是在LW506却读到0X8680
经多次验证,这种情况只在response大于等于0X80的情况下出现,如0X8000变为0XFF80;0XEEFE变为0XFDEE
而在response为0X7F,0X7E等都是正常的,这是什么奇怪的bug?是程序中的移位操作不对吗?求高手解答!

pcsms_qkPGovES 发表于 2019-4-28 15:01:23

难道是read_data = response + (response << 8)这里的加号加的是有符号数?之前说到0X80及以上都会错位,是因为把0X80的第一位当成了符号位?

pcsms_qkPGovES 发表于 2019-4-28 15:08:49

解决了!!!把char改成unsigned char后就不会有错位的问题了,之前的确没有想到char还有符号位的,帖子留给大家做参考,也当作自己的学习记录了。
页: [1]
查看完整版本: MODBUS RTU协议数据处理问题