最近入手了一块LED显示屏,想着配合手里的AM401 PLC,简单做个数据展示,练练手。
一开始非常顺利。
通讯一连上,心里就有底了;
INT整型数据读写也很正常,基本没费什么劲。
当时还挺开心:
“这也不难嘛,分分钟搞定。”
结果一上 FLOAT(浮点数),直接翻车。
我写进去的是:12.34
显示出来的却是:一串完全对不上的数
然后我换用串口调试工具也是同样的问题,FLOAT数据完全不对。如下图:
![]()
当时第一反应是:
程序写错了?
于是开始一顿操作:
改地址、改数据类型、改换算方式……
能试的基本都试了一遍。
结果——全都不对。
就这样来来回回折腾了一周,最后才发现一个之前完全没在意的问题:
Modbus通讯不仅有“字节大小端”,还有“字序大小端”。
以前只听说过“大小端”,以为就是字节顺序的问题。
简单说就是:
一个数据拆成多个字节,到底是高位在前,还是低位在前。
但这次踩坑才知道,还有更隐蔽的一层:
一个float占2个寄存器,而这两个寄存器本身也有顺序!
也就是说:
不仅“字节顺序”可能反着来
连“寄存器顺序”都有可能是反的
这就相当于:
你拼一段数据,不只是字母顺序乱了,
连“单词顺序”都给你打乱了。
最后我尝试把“字序”从大端改成小端——
神奇的一幕出现了:
✔ 小数位完全正常
✔ 数值一一对应
✔ 一切恢复正常
那一刻真的有点想笑:
折腾了一周的问题,原来只是“顺序不对”。
![]()
这次最大的收获就是一句话:
float读错,往往不是数据错了,而是顺序错了。
如果你以后也遇到这种情况,可以少走很多弯路:
- 整型正常,但浮点数不对 优先怀疑“大小端”
- 数据看起来乱七八糟 很可能只是“拼错顺序”
做工程有时候就是这样:
你以为是个大问题,
结果只是一个“很基础但容易忽略”的细节。
但正是这些细节,最容易让人卡很久。
如果你也碰到过类似的坑,欢迎交流。
这种“看起来简单,实际很坑”的问题,真的挺多的
![]()
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.