Explorar o código

Motified the RTS handling routine in order to manager when the
bit is used HIGH to able to transmit, or LOW.

Torello Querci %!s(int64=14) %!d(string=hai) anos
pai
achega
fa86846c39
Modificáronse 2 ficheiros con 10 adicións e 6 borrados
  1. 7 4
      src/modbus-rtu.c
  2. 3 2
      src/modbus-rtu.h

+ 7 - 4
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;
         }
 

+ 3 - 2
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);