evg
Пишу проект под Windows с использованием libmodbus 3.0.1 для организации обмена моей железки с PC посредством протокола MODBUS-RTU.
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);

Коментарии