c - libmodbus : Unable to Poll modbus energy meter having stop bit as 2

标签 c embedded modbus

我正在尝试使用 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 个停止位。然而,根据我的经验,许多供应商并不遵守该规则。我从施耐德网站上找到了第一本电能表手册:

http://download.schneider-electric.com/files?p_enDocType=User+guide&p_File_Name=DOCA0005EN-10.pdf&p_Doc_Ref=DOCA0005EN

第 47 页上有一条注释“停止位数 = 1”,似乎适用于所有奇偶校验模式。

关于c - libmodbus : Unable to Poll modbus energy meter having stop bit as 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54705887/

相关文章:

c - 实时编程C性能困境

c99 中 float 的编译时间/宏交换

c++ - 用 C 或 C++ 编写引导加载程序?

embedded - 微 Controller 接口(interface)

c - Modbus RTU 从站未响应 Modbus RTU 主站

python - 是否可以并行运行以下网络查询?

algorithm - 将数字集拆分为定义的 "interval length"算法中尽可能少的子集

c++ - 为处理器执行除法和取模的最佳方法是什么?

c - C中各种const声明的区别

GCC for ARM -- ELF 输出文件段错位