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 265 return (WriteFile(ctx_rtu->w_ser.fd, req, req_length, &n_bytes, NULL)) ? n_bytes : -1;
266 266 #else
267 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 269 if (ctx->debug) {
270 270 fprintf(stderr, "sending request using RTS signal\n");
271 271 }
272 272  
273 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 276 usleep(TIME_BETWEEN_RTS_SWITCH);
277 277  
278 278 size = write(ctx->s, req, req_length);
279 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 282 return size;
283 283 } else {
... ... @@ -794,8 +794,11 @@ int modbus_rtu_set_usage_rts(modbus_t *ctx, int mode)
794 794 if (ctx->backend->backend_type == _MODBUS_BACKEND_TYPE_RTU) {
795 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 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 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 32 #define MODBUS_RTU_RS232 0
33 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 39 int modbus_rtu_set_serial_mode(modbus_t *ctx, int mode);
39 40 int modbus_rtu_get_serial_mode(modbus_t *ctx);
... ...