Эх сурвалжийг харах

Fix connection check for Windows RTU (closes #660, #662)

Stéphane Raimbault 2 жил өмнө
parent
commit
c726c9de78

+ 1 - 0
src/modbus-private.h

@@ -86,6 +86,7 @@ typedef struct _modbus_backend {
                                   const uint8_t *rsp,
                                   int rsp_length);
     int (*connect)(modbus_t *ctx);
+    unsigned int (*is_connected)(modbus_t *ctx);
     void (*close)(modbus_t *ctx);
     int (*flush)(modbus_t *ctx);
     int (*select)(modbus_t *ctx, fd_set *rset, struct timeval *tv, int msg_length);

+ 14 - 0
src/modbus-rtu.c

@@ -725,6 +725,19 @@ static int _modbus_rtu_connect(modbus_t *ctx)
     return 0;
 }
 
+// FIXME Temporary solution before rewriting Windows RTU backend
+static unsigned int _modbus_rtu_is_connected(modbus_t *ctx)
+{
+#if defined(_WIN32)
+    modbus_rtu_t *ctx_rtu = ctx->backend_data;
+
+    /* Check if file handle is valid */
+    return ctx_rtu->w_ser.fd != INVALID_HANDLE_VALUE;
+#else
+    return ctx->s >= 0;
+#endif
+}
+
 int modbus_rtu_set_serial_mode(modbus_t *ctx, int mode)
 {
     if (ctx == NULL) {
@@ -1043,6 +1056,7 @@ const modbus_backend_t _modbus_rtu_backend = {
     _modbus_rtu_check_integrity,
     _modbus_rtu_pre_check_confirmation,
     _modbus_rtu_connect,
+    _modbus_rtu_is_connected,
     _modbus_rtu_close,
     _modbus_rtu_flush,
     _modbus_rtu_select,

+ 7 - 0
src/modbus-tcp.c

@@ -449,6 +449,11 @@ static int _modbus_tcp_pi_connect(modbus_t *ctx)
     return 0;
 }
 
+static unsigned int _modbus_tcp_is_connected(modbus_t *ctx)
+{
+    return ctx->s >= 0;
+}
+
 /* Closes the network connection and socket in TCP mode */
 static void _modbus_tcp_close(modbus_t *ctx)
 {
@@ -816,6 +821,7 @@ const modbus_backend_t _modbus_tcp_backend = {
     _modbus_tcp_check_integrity,
     _modbus_tcp_pre_check_confirmation,
     _modbus_tcp_connect,
+    _modbus_tcp_is_connected,
     _modbus_tcp_close,
     _modbus_tcp_flush,
     _modbus_tcp_select,
@@ -838,6 +844,7 @@ const modbus_backend_t _modbus_tcp_pi_backend = {
     _modbus_tcp_check_integrity,
     _modbus_tcp_pre_check_confirmation,
     _modbus_tcp_pi_connect,
+    _modbus_tcp_is_connected,
     _modbus_tcp_close,
     _modbus_tcp_flush,
     _modbus_tcp_select,

+ 2 - 1
src/modbus.c

@@ -368,7 +368,7 @@ int _modbus_receive_msg(modbus_t *ctx, uint8_t *msg, msg_type_t msg_type)
         }
     }
 
-    if (ctx->s < 0) {
+    if (!ctx->backend->is_connected(ctx)) {
         if (ctx->debug) {
             fprintf(stderr, "ERROR The connection is not established.\n");
         }
@@ -1748,6 +1748,7 @@ int modbus_set_error_recovery(modbus_t *ctx, modbus_error_recovery_mode error_re
     return 0;
 }
 
+// FIXME Doesn't work under Windows RTU
 int modbus_set_socket(modbus_t *ctx, int s)
 {
     if (ctx == NULL) {