首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过Modbus读取寄存器

通过Modbus读取寄存器
EN

Stack Overflow用户
提问于 2013-08-08 22:47:55
回答 2查看 3.6K关注 0票数 2

我正试图编写一个c程序来读取晨星太阳保护程序MPPT的数据。

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

代码语言:javascript
复制
#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);
}

这对我不管用。我收到以下错误消息:

坏文件描述符

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-11 20:49:40

结果是试图从错误的串口读取。

读取/dev/ttyS3 3的操作正常。

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

票数 0
EN

Stack Overflow用户

发布于 2013-08-09 03:01:58

通过阅读来自LibModBus的文档,我认为你错过了给连接的一个电话。

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

代码语言:javascript
复制
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_closemodbus_free上下文。例如:

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18137527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档