【发布时间】:2021-11-10 02:12:31
【问题描述】:
我正在制作一个应用程序,从 Modbus 协议获取数据。 它基本上返回带有整数的数组,我需要将其转换为字符串和整数。
即这应该是设备名称
[53440, 11714, 52701, 10449, 14157, 13876, 41, 0, 0, 0, 0, 0, 53440, 11714, 52701, 10449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
我正在使用 dart:convert 和以下方法
var deviceName = await client.readHoldingRegisters(0x90, 32)
var deviceStr = String.fromCharCodes(deviceName)
结果如下:
타ⷂ췝⣑㝍㘴)
也许我做错了什么或者是我需要翻译的真实设备名称
要获取设备操作系统版本,我使用以下代码
var version = await client.readHoldingRegisters(0x82, 2);
Result: [264, 0]
如果我将它转移到字符串中,我会得到这个
Ĉ
在 Dart 中将 Uint16List 转换为字符串/整数的正确方法是什么?
【问题讨论】:
-
Modbus 保持寄存器是 16 位字(即 0000-FFFF),
readHoldingRegisters将返回这些 16 位值的数组(您请求的每个寄存器一个)。这些值的含义取决于控制器(Modbus spec 中未涵盖),因此如果没有您正在与之通信的控制器的信息,实际上不可能告诉您如何解码(大多数会有一张表告诉您每个寄存器是什么)以及信息的编码方式)。 -
您的示例代码也看起来错误(您将数据放入
deviceName但不要再次使用该变量 - 您没有说device来自哪里)。 -
@Brits 这是一个错误类型,已修复;它在一张纸上写着 R16,所以它是 16 位只读的
-
“它在一张纸上写着 R16”——这并没有真正的帮助(Modbus 规范规定保持寄存器是 16 位)。如果没有控制器的详细信息,您正在尝试与之通信,它无法提供进一步帮助(我希望文档不仅仅说“R16”)。
-
@Brits 它说 2 个第一个寄存器包含 2 个 ASCII 符号,用 WIN-1251 编码,我需要更多信息来解码它吗?我也有 C# 中的工作代码,但它使用的是 Encode C# 库
标签: flutter dart modbus uint16