문제

I am trying to write a c program to read data for morningstar sunsaver MPPT.

This is the simple program I found in net. But my program is unable to read data from register.

#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);
}

It does not work for me. I get the following error message:

Bad file descriptor

도움이 되었습니까?

해결책 2

It turned out to be trying to read from wrong Serial port.

Reading from /dev/ttyS3 worked.

I later realize that serial port are from /dev/ttyS0 .. /dev/ttyS9

다른 팁

By reading the documentation from LibModBus, I think you're missing a call to modbus_connect.

Try connecting before reading registers:

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;
}

Also, remember to modbus_close and modbus_free your context before exiting due to further error conditions. For example:

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;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top