我正在尝试以不带奇偶校验的方式来轮询n施耐德电度表,并使用RS485到USB转换器将位停止为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,并且连接超时错误。
我错过了什么吗?
答案 0 :(得分:0)
您确定购物位应为2,且没有奇偶校验吗? Modbus规范确实声明RTU每个字符应该有11位,这意味着在不使用奇偶校验时应该有2个停止位。但是,以我的经验来看,许多供应商不遵守该规则。我从Schneider网站上找到了第一本电表手册:
在第47页上,有一条注释“停止位数= 1”似乎适用于所有奇偶校验模式。
答案 1 :(得分:0)
已解决将库更新到3.1.4的问题。