diff --git a/src/modbus-rtu.c b/src/modbus-rtu.c index 41ed941..c865972 100644 --- a/src/modbus-rtu.c +++ b/src/modbus-rtu.c @@ -265,19 +265,19 @@ ssize_t _modbus_rtu_send(modbus_t *ctx, const uint8_t *req, int req_length) return (WriteFile(ctx_rtu->w_ser.fd, req, req_length, &n_bytes, NULL)) ? n_bytes : -1; #else modbus_rtu_t *ctx_rtu = ctx->backend_data; - if (ctx_rtu->usage_rts == MODBUS_USE_RTS) { + if (ctx_rtu->usage_rts != MODBUS_NO_USE_RTS) { if (ctx->debug) { fprintf(stderr, "sending request using RTS signal\n"); } ssize_t size; - _modbus_rtu_setrts(ctx->s,1); + _modbus_rtu_setrts(ctx->s, (ctx_rtu->usage_rts == MODBUS_USE_RTS_UP ? 1 : 0)); usleep(TIME_BETWEEN_RTS_SWITCH); size = write(ctx->s, req, req_length); usleep(TIME_BETWEEN_RTS_SWITCH); - _modbus_rtu_setrts(ctx->s,0); + _modbus_rtu_setrts(ctx->s, (ctx_rtu->usage_rts == MODBUS_USE_RTS_UP ? 0 : 1)); return size; } else { @@ -794,8 +794,11 @@ int modbus_rtu_set_usage_rts(modbus_t *ctx, int mode) if (ctx->backend->backend_type == _MODBUS_BACKEND_TYPE_RTU) { modbus_rtu_t *ctx_rtu = ctx->backend_data; - if (mode == MODBUS_NO_USE_RTS || mode == MODBUS_USE_RTS ) { + if (mode == MODBUS_NO_USE_RTS || mode == MODBUS_USE_RTS_UP || mode == MODBUS_USE_RTS_DOWN) { ctx_rtu->usage_rts = mode; + + // Set the RTS bit in order to not reserve the RS485 bus + _modbus_rtu_setrts(ctx->s, (ctx_rtu->usage_rts == MODBUS_USE_RTS_UP ? 0 : 1)); return 0; } diff --git a/src/modbus-rtu.h b/src/modbus-rtu.h index 497b456..2526257 100644 --- a/src/modbus-rtu.h +++ b/src/modbus-rtu.h @@ -32,8 +32,9 @@ modbus_t* modbus_new_rtu(const char *device, int baud, char parity, #define MODBUS_RTU_RS232 0 #define MODBUS_RTU_RS485 1 -#define MODBUS_NO_USE_RTS 0 -#define MODBUS_USE_RTS 1 +#define MODBUS_NO_USE_RTS 0 +#define MODBUS_USE_RTS_UP 1 +#define MODBUS_USE_RTS_DOWN 2 int modbus_rtu_set_serial_mode(modbus_t *ctx, int mode); int modbus_rtu_get_serial_mode(modbus_t *ctx);