威纶通官方论坛

MODBUS RTU协议数据处理问题

[复制链接]
发表于 2019-4-27 17:30:09 | 显示全部楼层 |阅读模式
本帖最后由 pcsms_qkPGovES 于 2019-4-27 17:32 编辑

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

在触摸屏上放置两个数值显示元件,地址分别为LW504和LW506,数据格式设置为32bit HEX
按理说两者显示除了顺序应该完全相同,但是LW506高16bit始终比原始数据小1
如response[3-6]接收到0X8780,在LW504读到0X8087,但是在LW506却读到0X8680
经多次验证,这种情况只在response[5-6]大于等于0X80的情况下出现,如0X8000变为0XFF80;0XEEFE变为0XFDEE
而在response[5-6]为0X7F,0X7E等都是正常的,这是什么奇怪的bug?是程序中的移位操作不对吗?求高手解答!
 楼主| 发表于 2019-4-28 15:01:23 | 显示全部楼层
难道是read_data[0] = response[3] + (response[4] << 8)这里的加号加的是有符号数?之前说到0X80及以上都会错位,是因为把0X80的第一位当成了符号位?
 楼主| 发表于 2019-4-28 15:08:49 | 显示全部楼层
解决了!!!把char改成unsigned char后就不会有错位的问题了,之前的确没有想到char还有符号位的,帖子留给大家做参考,也当作自己的学习记录了。
您需要登录后才可以发帖 登录 | 注册

本版积分规则

回复帖子

Archiver|小黑屋|威纶通官网 ( 粤ICP备06054553号 )

GMT+8, 2024-11-24 06:15

Powered by Discuz! X3.4

© 2001-2023 Comsenz Inc.

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