以下の 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;