0

以下の c\c++ サンプル コードを使用して、libmodbus を使用して Modbus RTU データを読み取ります。私は 2 つの異なる Linux ベースのゲートウェイを持っています。一方には Raspbian GNU/Linux 10 (バスター) があり、もう一方には Yocto Dizzy Release があります。libmodbus lib を使用して、両方のゲートウェイで modbus tcp データを読み取ることができます。しかし、Raspbian GNU/Linux 10 (buster) for modbus rtu (RS485) の場合、バッファの読み取り中に接続タイムアウトが発生します。両方のゲートウェイにはもう 1 つの違いがあります。つまり、Raspbian GNU/Linux 10 (buster) は ttyUSB0 ポートを使用し、Yocto Dizzy Release は Linux の ttymxc2 ポートを使用します。

しかし、Raspbian GNU/Linux 10 (buster) で pymodbus を使って python でサンプルコードを試したところ、データを読み込むことができました。

C ++でRaspbian GNU / Linux 10(バスター)のlibmodbusを使用して、modbus rtu(RS485)の何が問題なのかを特定するのを手伝ってくれる人はいますか?

//Create a new RTU context with proper serial parameters (in this example,
//device name /dev/ttyUSB0, baud rate 9600, no parity bit, 8 data bits, 1 stop bit)
modbus_t *ctx = modbus_new_rtu("/dev/ttyUSB0", 9600, 'N', 8, 1);

if (!ctx) {
    printf("Failed to create the context: %s\n", modbus_strerror(errno));
    //exit(1);
}

if (modbus_connect(ctx) == -1) {
    printf("Unable to connect: %s\n", modbus_strerror(errno));
    modbus_free(ctx);
    //exit(1);
}

//Set the Modbus address of the remote slave (to 1)
modbus_set_slave(ctx, 1);


uint16_t reg[5];// will store read registers values

//Read 5 holding registers starting from address 10
int num = modbus_read_registers(ctx, 50001, 5, reg);
if (num != 5) {// number of read registers is not the one expected
    printf("Failed to read: %s\n", modbus_strerror(errno));
}
else
{
    for(int i=0; i < 5; i++)
    {
        printf("reg %d: %d\n", i,reg[i]);
    }
}
modbus_close(ctx);
modbus_free(ctx);
return 0;
4

0 に答える 0