最近入手了一块LED显示屏,想着配合手里的AM401 PLC,简单做个数据展示,练练手。

一开始非常顺利。
通讯一连上,心里就有底了;
INT整型数据读写也很正常,基本没费什么劲。

当时还挺开心:
“这也不难嘛,分分钟搞定。”

结果一上 FLOAT(浮点数),直接翻车。

我写进去的是:12.34
显示出来的却是:一串完全对不上的数

然后我换用串口调试工具也是同样的问题,FLOAT数据完全不对。如下图:

打开网易新闻 查看精彩图片

当时第一反应是:
程序写错了?

于是开始一顿操作:
改地址、改数据类型、改换算方式……
能试的基本都试了一遍。

结果——全都不对。

就这样来来回回折腾了一周,最后才发现一个之前完全没在意的问题:

Modbus通讯不仅有“字节大小端”,还有“字序大小端”。

以前只听说过“大小端”,以为就是字节顺序的问题。

简单说就是:
一个数据拆成多个字节,到底是高位在前,还是低位在前。

但这次踩坑才知道,还有更隐蔽的一层:

一个float占2个寄存器,而这两个寄存器本身也有顺序!

也就是说:
不仅“字节顺序”可能反着来
连“寄存器顺序”都有可能是反的

这就相当于:
你拼一段数据,不只是字母顺序乱了,
连“单词顺序”都给你打乱了。

最后我尝试把“字序”从大端改成小端——

神奇的一幕出现了:

✔ 小数位完全正常
✔ 数值一一对应
✔ 一切恢复正常

那一刻真的有点想笑:
折腾了一周的问题,原来只是“顺序不对”。

打开网易新闻 查看精彩图片

这次最大的收获就是一句话:

float读错,往往不是数据错了,而是顺序错了。

如果你以后也遇到这种情况,可以少走很多弯路:

  • 整型正常,但浮点数不对 优先怀疑“大小端”
  • 数据看起来乱七八糟 很可能只是“拼错顺序”

做工程有时候就是这样:

你以为是个大问题,
结果只是一个“很基础但容易忽略”的细节。

但正是这些细节,最容易让人卡很久。

如果你也碰到过类似的坑,欢迎交流。
这种“看起来简单,实际很坑”的问题,真的挺多的

打开网易新闻 查看精彩图片