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 网站上找到了第一本电能表手册:

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" 似乎适用于所有奇偶校验模式。

将库更新到 3.1.4 时问题已解决。