Commit fa86846c39d80d5ecb332c123bfc2c726932e108
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.
Showing
2 changed files
with
10 additions
and
6 deletions
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); | ... | ... |