我正在尝试轮询n施耐德能量计在有奇偶校验为无和停止位为2使用RS485到USB的转换器。我收到连接超时错误。但当我尝试轮询相同的计量器时,奇偶校验为无,停止位为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和连接超时错误。
我错过了什么吗?
发布于 2019-02-20 14:35:40
已解决将库更新到3.1.4的问题。
发布于 2019-02-16 03:27:28
是否确定商店位应为2,不带奇偶校验?Modbus规范规定,RTU的每个字符应该有11位,这意味着当使用非奇偶校验时,应该有2个停止位。然而,根据我的经验,许多供应商并不遵守这一规则。我从施耐德的网站上拿到了我能找到的第一本电能表手册:
http://download.schneider-electric.com/files?p_enDocType=User+guide&p_File_Name=DOCA0005EN-10.pdf&p_Doc_Ref=DOCA0005EN
在第47页上有一条注释"number of stop bits = 1“,似乎适用于所有奇偶校验模式。
https://stackoverflow.com/questions/54705887
复制相似问题