2

我正在尝试编写 ac 程序来读取 Morningstar sunsaver MPPT 的数据。

这是我在net中找到的简单程序。但是我的程序无法从寄存器中读取数据。

#include <stdlib.h>
#include <errno.h>
#include "src/modbus.h"
int main(void)
{
    modbus_t *ctx;
    uint16_t tab_reg[64];
    int rc;
    int i;

    ctx = modbus_new_rtu("/dev/ttyS0", 115200, 'N',8,1);
    if (ctx == NULL) {
       fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
       modbus_free(ctx);
       return -1;
    }

    rc = modbus_read_registers(ctx, 0, 10, tab_reg);
    if (rc == -1) {
      fprintf(stderr, "%s\n", modbus_strerror(errno));
      return -1;
    }

    for (i=0; i < rc; i++) {
      printf("reg[%d]=%d (0x%X)\n", i, tab_reg[i], tab_reg[i]);
    }

    modbus_close(ctx);
    modbus_free(ctx);
}

它对我不起作用。我收到以下错误消息:

错误的文件描述符

4

2 回答 2

0

通过阅读LibModBus 的文档,我认为您错过了对modbus_connect的调用。

在读取寄存器之前尝试连接:

ctx = modbus_new_rtu("/dev/ttyS0", 115200, 'N',8,1);
if (ctx == NULL) {
   fprintf(stderr, "Creation failed: %s\n", modbus_strerror(errno));
   return -1;
}

if (modbus_connect(ctx) == -1) {
    fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
    modbus_free(ctx);
    return -1;
}

此外,由于进一步的错误条件,请记住在退出之前modbus_close和 您的上下文。modbus_free例如:

rc = modbus_read_registers(ctx, 0, 10, tab_reg);
if (rc == -1) {
  fprintf(stderr, "%s\n", modbus_strerror(errno));
  modbus_close(ctx);
  modbus_free(ctx);
  return -1;
}
于 2013-08-09T03:01:58.893 回答
0

原来是试图从错误的串行端口读取。

从 /dev/ttyS3 读取有效。

后来我意识到串口来自 /dev/ttyS0 .. /dev/ttyS9

于 2013-10-11T20:49:40.633 回答