Commit fa86846c39d80d5ecb332c123bfc2c726932e108

Authored by Torello Querci
Committed by Stéphane Raimbault
1 parent 8bb83590

Motified the RTS handling routine in order to manager when the

bit is used HIGH to able to transmit, or LOW.
src/modbus-rtu.c
@@ -265,19 +265,19 @@ ssize_t _modbus_rtu_send(modbus_t *ctx, const uint8_t *req, int req_length) @@ -265,19 +265,19 @@ ssize_t _modbus_rtu_send(modbus_t *ctx, const uint8_t *req, int req_length)
265 return (WriteFile(ctx_rtu->w_ser.fd, req, req_length, &n_bytes, NULL)) ? n_bytes : -1; 265 return (WriteFile(ctx_rtu->w_ser.fd, req, req_length, &n_bytes, NULL)) ? n_bytes : -1;
266 #else 266 #else
267 modbus_rtu_t *ctx_rtu = ctx->backend_data; 267 modbus_rtu_t *ctx_rtu = ctx->backend_data;
268 - if (ctx_rtu->usage_rts == MODBUS_USE_RTS) { 268 + if (ctx_rtu->usage_rts != MODBUS_NO_USE_RTS) {
269 if (ctx->debug) { 269 if (ctx->debug) {
270 fprintf(stderr, "sending request using RTS signal\n"); 270 fprintf(stderr, "sending request using RTS signal\n");
271 } 271 }
272 272
273 ssize_t size; 273 ssize_t size;
274 274
275 - _modbus_rtu_setrts(ctx->s,1); 275 + _modbus_rtu_setrts(ctx->s, (ctx_rtu->usage_rts == MODBUS_USE_RTS_UP ? 1 : 0));
276 usleep(TIME_BETWEEN_RTS_SWITCH); 276 usleep(TIME_BETWEEN_RTS_SWITCH);
277 277
278 size = write(ctx->s, req, req_length); 278 size = write(ctx->s, req, req_length);
279 usleep(TIME_BETWEEN_RTS_SWITCH); 279 usleep(TIME_BETWEEN_RTS_SWITCH);
280 - _modbus_rtu_setrts(ctx->s,0); 280 + _modbus_rtu_setrts(ctx->s, (ctx_rtu->usage_rts == MODBUS_USE_RTS_UP ? 0 : 1));
281 281
282 return size; 282 return size;
283 } else { 283 } else {
@@ -794,8 +794,11 @@ int modbus_rtu_set_usage_rts(modbus_t *ctx, int mode) @@ -794,8 +794,11 @@ int modbus_rtu_set_usage_rts(modbus_t *ctx, int mode)
794 if (ctx->backend->backend_type == _MODBUS_BACKEND_TYPE_RTU) { 794 if (ctx->backend->backend_type == _MODBUS_BACKEND_TYPE_RTU) {
795 modbus_rtu_t *ctx_rtu = ctx->backend_data; 795 modbus_rtu_t *ctx_rtu = ctx->backend_data;
796 796
797 - if (mode == MODBUS_NO_USE_RTS || mode == MODBUS_USE_RTS ) { 797 + if (mode == MODBUS_NO_USE_RTS || mode == MODBUS_USE_RTS_UP || mode == MODBUS_USE_RTS_DOWN) {
798 ctx_rtu->usage_rts = mode; 798 ctx_rtu->usage_rts = mode;
  799 +
  800 + // Set the RTS bit in order to not reserve the RS485 bus
  801 + _modbus_rtu_setrts(ctx->s, (ctx_rtu->usage_rts == MODBUS_USE_RTS_UP ? 0 : 1));
799 return 0; 802 return 0;
800 } 803 }
801 804
src/modbus-rtu.h
@@ -32,8 +32,9 @@ modbus_t* modbus_new_rtu(const char *device, int baud, char parity, @@ -32,8 +32,9 @@ modbus_t* modbus_new_rtu(const char *device, int baud, char parity,
32 #define MODBUS_RTU_RS232 0 32 #define MODBUS_RTU_RS232 0
33 #define MODBUS_RTU_RS485 1 33 #define MODBUS_RTU_RS485 1
34 34
35 -#define MODBUS_NO_USE_RTS 0  
36 -#define MODBUS_USE_RTS 1 35 +#define MODBUS_NO_USE_RTS 0
  36 +#define MODBUS_USE_RTS_UP 1
  37 +#define MODBUS_USE_RTS_DOWN 2
37 38
38 int modbus_rtu_set_serial_mode(modbus_t *ctx, int mode); 39 int modbus_rtu_set_serial_mode(modbus_t *ctx, int mode);
39 int modbus_rtu_get_serial_mode(modbus_t *ctx); 40 int modbus_rtu_get_serial_mode(modbus_t *ctx);