libmodbus:无法轮询停止位为 2 的 modbus 电表
libmodbus : Unable to Poll modbus energy meter having stop bit as 2
我正在尝试使用 RS485 到 USB 转换器轮询 n schneider Energymeter 的奇偶校验位为 none,停止位为 2。我收到连接超时错误。但是,当我尝试以 none 的奇偶校验和 1 的停止位轮询同一个仪表时,我能够接收数据。
我用来轮询电表的代码片段如下
ctx = modbus_new_rtu("/dev/ttyUSB0",9600, 'N', 8, 2);
modbus_set_debug(ctx, TRUE);
if (modbus_connect(ctx) == -1) {
printf("Modbus Connection failed: %s", modbus_strerror(errno));
modbus_free(ctx);
return -1;
}
modbus_set_slave(ctx,2);
memset(tab_rp_registers, 0, 2 * sizeof(uint16_t));
rc = modbus_read_registers(ctx,3109,2,tab_rp_registers);
modbus_close(ctx);
modbus_free(ctx);
if (rc != -1) {
// actions performed
}
else {
free(tab_rp_registers);
printf("Error str is %s\n",modbus_strerror(errno));
}
我总是得到 rc 为 -1 并且在转换 errno 时出现连接超时错误。
我错过了什么吗?
您确定商店位应该是 2 且没有奇偶校验吗? Modbus 规范确实规定 RTU 每个字符应该有 11 位,这意味着在不使用奇偶校验时应该有 2 个停止位。然而,根据我的经验,许多供应商并不遵守该规则。我从 Schneider 网站上找到了第一本电能表手册:
第 47 页上有一条注释 "number of stop bits = 1" 似乎适用于所有奇偶校验模式。
将库更新到 3.1.4 时问题已解决。
我正在尝试使用 RS485 到 USB 转换器轮询 n schneider Energymeter 的奇偶校验位为 none,停止位为 2。我收到连接超时错误。但是,当我尝试以 none 的奇偶校验和 1 的停止位轮询同一个仪表时,我能够接收数据。
我用来轮询电表的代码片段如下
ctx = modbus_new_rtu("/dev/ttyUSB0",9600, 'N', 8, 2);
modbus_set_debug(ctx, TRUE);
if (modbus_connect(ctx) == -1) {
printf("Modbus Connection failed: %s", modbus_strerror(errno));
modbus_free(ctx);
return -1;
}
modbus_set_slave(ctx,2);
memset(tab_rp_registers, 0, 2 * sizeof(uint16_t));
rc = modbus_read_registers(ctx,3109,2,tab_rp_registers);
modbus_close(ctx);
modbus_free(ctx);
if (rc != -1) {
// actions performed
}
else {
free(tab_rp_registers);
printf("Error str is %s\n",modbus_strerror(errno));
}
我总是得到 rc 为 -1 并且在转换 errno 时出现连接超时错误。
我错过了什么吗?
您确定商店位应该是 2 且没有奇偶校验吗? Modbus 规范确实规定 RTU 每个字符应该有 11 位,这意味着在不使用奇偶校验时应该有 2 个停止位。然而,根据我的经验,许多供应商并不遵守该规则。我从 Schneider 网站上找到了第一本电能表手册:
第 47 页上有一条注释 "number of stop bits = 1" 似乎适用于所有奇偶校验模式。
将库更新到 3.1.4 时问题已解决。