我正在尝试使用 RS485 到 USB 转换器轮询 n schneider Energymeter,使其奇偶校验为无,停止位为 2。我收到连接超时错误。但是,当我尝试以奇偶校验为无且停止位为 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));
}
在转换 errno 时,我总是收到 rc 为 -1 和连接超时错误。
我错过了什么吗?
最佳答案
您确定商店位应为 2,且无奇偶校验吗? Modbus 规范确实规定 RTU 每个字符应有 11 位,这意味着在不使用奇偶校验时应有 2 个停止位。然而,根据我的经验,许多供应商并不遵守该规则。我从施耐德网站上找到了第一本电能表手册:
第 47 页上有一条注释“停止位数 = 1”,似乎适用于所有奇偶校验模式。
关于c - libmodbus : Unable to Poll modbus energy meter having stop bit as 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54705887/