libmodbus довольно неплохая библиотека, но...
Моя железка при запуске пишет некоторые данные в UART. Которые принимаются на стороне PC. И программа запущенная после запуска моей железки не будет работать, т.к. в буфере будут данные и принимаемые пакеты будут неверными.
Выход в следующем:
сбросить буфера перед операцией чтения регистров или входов (_FC_READ_HOLDING_REGISTERS, _FC_READ_INPUT_REGISTERS... ).
Функция сброса присутствует (modbus_flush()), но она не сбрасывает буфер чтения как таковой.
Необходимо сделать следующие изменения в файле modbus-rtu.c:
int _modbus_rtu_flush(modbus_t *ctx)
{
#if defined(_WIN32)
modbus_rtu_t *ctx_rtu = ctx->backend_data;
ctx_rtu->w_ser.n_bytes = 0;
PurgeComm(ctx_rtu->w_ser.fd, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
return (FlushFileBuffers(ctx_rtu->w_ser.fd) == FALSE);
#else
return tcflush(ctx->s, TCIOFLUSH);
#endif
}
и в функциях чтения файла modbus.c добавить:
/* Reads the data from a remove device and put that data into an array */
static int read_registers(modbus_t *ctx, int function, int addr, int nb,
uint16_t *dest)
{
modbus_flush(ctx);
/* Reads the data from a remove device and put that data into an array */
static int read_registers(modbus_t *ctx, int function, int addr, int nb,
uint16_t *dest)
{
modbus_flush(ctx);