2013-08-08 2 views
2

morningstar sunsaver MPPT 용 데이터를 읽는 C 프로그램을 작성하려고합니다.Modbus를 통한 등록

이것은 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); 
} 

나를 위해 작동하지 않습니다. 나는 다음과 같은 오류 메시지가 얻을 다음 documentation from LibModBus을 읽어

잘못된 파일 기술자

+1

시스템에'는/dev/ttyS0' 파일 존재인가에서 깨닫게? – ouah

+0

예 선물합니다. – PRP

답변

0

잘못된 직렬 포트에서 읽으려는 것으로 나타났습니다.

/dev/ttyS3에서 읽기가 작동했습니다.

는 나중에 직렬 포트는/dev/ttyS0에 ..는/dev/ttyS9

0

을, 당신이 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_closemodbus_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; 
}