Prechádzať zdrojové kódy

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

Torello Querci 14 rokov pred
rodič
commit
fa86846c39
2 zmenil súbory, kde vykonal 10 pridanie a 6 odobranie
  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;
     return (WriteFile(ctx_rtu->w_ser.fd, req, req_length, &n_bytes, NULL)) ? n_bytes : -1;
 #else
 #else
     modbus_rtu_t *ctx_rtu = ctx->backend_data;
     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) {
         if (ctx->debug) {
             fprintf(stderr, "sending request using RTS signal\n");
             fprintf(stderr, "sending request using RTS signal\n");
         }
         }
 
 
         ssize_t size;
         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);
         usleep(TIME_BETWEEN_RTS_SWITCH);
 
 
         size = write(ctx->s, req, req_length);
         size = write(ctx->s, req, req_length);
         usleep(TIME_BETWEEN_RTS_SWITCH);
         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;
         return size;
     } else {
     } 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) {
     if (ctx->backend->backend_type == _MODBUS_BACKEND_TYPE_RTU) {
         modbus_rtu_t *ctx_rtu = ctx->backend_data;
         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;
             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;
             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_RS232 0
 #define MODBUS_RTU_RS485 1
 #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_set_serial_mode(modbus_t *ctx, int mode);
 int modbus_rtu_get_serial_mode(modbus_t *ctx);
 int modbus_rtu_get_serial_mode(modbus_t *ctx);