Przeglądaj źródła

1、修复设备级联读写指令多次下载可能导致串口失效的bug,修复级联其他bug。

liyuezong 1 rok temu
rodzic
commit
59abe95205
2 zmienionych plików z 49 dodań i 42 usunięć
  1. 45 38
      pro/src/cascade.c
  2. 4 4
      pro/src/cascade.h

+ 45 - 38
pro/src/cascade.c

@@ -219,17 +219,17 @@ static int slave_breaker_info(cascade_handle_t *cas)
             breaker->breaker_chn[cnt].breaker_status = temp->breaker_status;
             breaker->breaker_chn[cnt].breaker_chn = temp->breaker_chn;
             breaker->breaker_chn[cnt].breaker_id = temp->breaker_id;
-            strcpy(breaker->breaker_chn[cnt].breaker_gather_type, temp->breaker_gather_type);
-            strcpy(breaker->breaker_chn[cnt].breaker_com, temp->breaker_com);
-            strcpy(breaker->breaker_chn[cnt].breaker_switch_name, temp->breaker_switch_name);
-            strcpy(breaker->breaker_chn[cnt].breaker_chns_name, temp->breaker_chns_name);
+            strncpy(breaker->breaker_chn[cnt].breaker_gather_type, temp->breaker_gather_type,sizeof(breaker->breaker_chn[cnt].breaker_gather_type)-1);
+            strncpy(breaker->breaker_chn[cnt].breaker_com, temp->breaker_com,sizeof(breaker->breaker_chn[cnt].breaker_com)-1);
+            strncpy(breaker->breaker_chn[cnt].breaker_switch_name, temp->breaker_switch_name,sizeof(breaker->breaker_chn[cnt].breaker_switch_name)-1);
+            strncpy(breaker->breaker_chn[cnt].breaker_chns_name, temp->breaker_chns_name,sizeof(breaker->breaker_chn[cnt].breaker_chns_name)-1);
             cnt++;
         }
     }
     lock_s_release(LOCK_ID_BREAKER);
 
     breaker->cnt = cnt;
-    LOGD("___ slave_breaker_info, breaker_all: saddr=0x%x %d\n", (uint32_t)dm, cnt);
+    LOGD("___ slave_breaker_info, breaker_all:, cnt:  %d\n", cnt);
 
     return 0;
 }
@@ -675,7 +675,7 @@ static int mb_hdr(uint8_t *data, int datalen, mb_hdr_t *h)
 #define RW_TIMEOUT_MS 800
 #else
 #define SCAN_TIMEOUT_MS 200
-#define RW_TIMEOUT_MS 500
+#define RW_TIMEOUT_MS 200
 #endif
 
 static int mb_scan(cascade_handle_t *cas, int addr)
@@ -684,10 +684,10 @@ static int mb_scan(cascade_handle_t *cas, int addr)
     uint16_t tmp;
 
     pthread_mutex_lock(&cas->mutex3);
-    timeout = _mb_get_timeout(cas);
-    _mb_set_timeout(cas, SCAN_TIMEOUT_MS);
+   // timeout = _mb_get_timeout(cas);
+   // _mb_set_timeout(cas, SCAN_TIMEOUT_MS);
     r = _mb_scan(cas, addr);
-    _mb_set_timeout(cas, timeout);
+   // _mb_set_timeout(cas, timeout);
     pthread_mutex_unlock(&cas->mutex3);
 
     return r;
@@ -695,7 +695,7 @@ static int mb_scan(cascade_handle_t *cas, int addr)
 
 static int mb_read(cascade_handle_t *cas, int addr, data_t *d)
 {
-    int i, r = 0, finish = 0, timeout = 0;
+    int r = 0, finish = 0, timeout = 0;
     int rl, xlen, rlen = 0, oncelen = MB_MAX_LEN;
     uint16_t buff[MODBUS_RTU_MAX_ADU_LENGTH];
 
@@ -703,12 +703,11 @@ static int mb_read(cascade_handle_t *cas, int addr, data_t *d)
     {
         return -1;
     }
-
-    for (i = 0; i < 3; i++)
+    pthread_mutex_lock(&cas->mutex3);
+    //for (i = 0; i < 3; i++)
     {
-        pthread_mutex_lock(&cas->mutex3);
-        timeout = _mb_get_timeout(cas);
-        _mb_set_timeout(cas, RW_TIMEOUT_MS);
+       // timeout = _mb_get_timeout(cas);
+       // _mb_set_timeout(cas, RW_TIMEOUT_MS);
         r = 0;
         rlen = 0;
         while (1)
@@ -726,7 +725,7 @@ static int mb_read(cascade_handle_t *cas, int addr, data_t *d)
             rl = _mb_read(cas, addr, CASCADE_REG_READ, buff, xlen / 2);
             if (rl < 0)
             {
-                LOGE("___ _mb_read failed, %s, rlen: %d, retry: %d\n", modbus_strerror(errno), rlen, i);
+                LOGE("___ _mb_read failed, %s, rlen: %d,\n", modbus_strerror(errno), rlen);
                 r = -1;
                 break;
             }
@@ -748,19 +747,19 @@ static int mb_read(cascade_handle_t *cas, int addr, data_t *d)
                 break;
             }
         }
-        _mb_set_timeout(cas, timeout);
-        pthread_mutex_unlock(&cas->mutex3);
-        if (r == 0)
-        {
-            break;
-        }
-    }
+       // _mb_set_timeout(cas, timeout);
 
+     //   if (r == 0)
+       // {
+       //     break;
+      //  }
+    }
+    pthread_mutex_unlock(&cas->mutex3);
     return r;
 }
 static int mb_write(cascade_handle_t *cas, int addr, data_t *d)
 {
-    int i, r = 0, timeout = 0;
+    int r = 0, timeout = 0;
     int wl, xlen, wlen = 0, oncelen = MB_MAX_LEN;
     uint16_t buff[MODBUS_RTU_MAX_ADU_LENGTH];
 
@@ -768,12 +767,11 @@ static int mb_write(cascade_handle_t *cas, int addr, data_t *d)
     {
         return -1;
     }
-
-    for (i = 0; i < 3; i++)
+    pthread_mutex_lock(&cas->mutex3);
+   // for (i = 0; i < 3; i++)
     {
-        pthread_mutex_lock(&cas->mutex3);
-        timeout = _mb_get_timeout(cas);
-        _mb_set_timeout(cas, RW_TIMEOUT_MS);
+       // timeout = _mb_get_timeout(cas);
+       // _mb_set_timeout(cas, RW_TIMEOUT_MS);
         r = 0;
         wlen = 0;
 
@@ -793,7 +791,7 @@ static int mb_write(cascade_handle_t *cas, int addr, data_t *d)
             wl = _mb_write(cas, addr, CASCADE_REG_WRITE, buff, xlen / 2);
             if (wl < 0)
             {
-                LOGE("___ _mb_write failed, addr: %d, reg: %d, cnt: %d, %s, retry: %d\n", addr, CASCADE_REG_WRITE, xlen / 2, modbus_strerror(errno), i);
+                LOGE("___ _mb_write failed, addr: %d, reg: %d, cnt: %d, %s\n", addr, CASCADE_REG_WRITE, xlen / 2, modbus_strerror(errno));
                 r = -1;
                 break;
             }
@@ -808,13 +806,14 @@ static int mb_write(cascade_handle_t *cas, int addr, data_t *d)
             }
             wlen += xlen;
         }
-        _mb_set_timeout(cas, timeout);
-        pthread_mutex_unlock(&cas->mutex3);
-        if (r == 0)
-        {
-            break;
-        }
+       // _mb_set_timeout(cas, timeout);
+
+       // if (r == 0)
+       // {
+        //    break;
+       // }
     }
+    pthread_mutex_unlock(&cas->mutex3);
 
     return r;
 }
@@ -996,7 +995,7 @@ static int mb_receive(cascade_handle_t *cas)
         if (r > 0)
         {
             sendlen += h.regcnt * 2;
-            // LOGD("____  slave sendlen: %d, h.dlen: %d, r: %d\n", sendlen, h.dlen, r);
+             LOGD("____  slave sendlen: %d, h.dlen: %d, r: %d\n", sendlen, h.dlen, r);
         }
     }
     break;
@@ -1777,6 +1776,7 @@ static void *cascade_thread(void *arg)
     thread_handle_t *h = (thread_handle_t *)arg;
     cascade_handle_t *cas = (cascade_handle_t *)h->arg;
     ModbusInfo_t *info = &cas->mInfo;
+    cmd_data_t *cmd = &cas->cmd;
 
     LOGD("__ cascade %s\n", (info->mode == MODBUS_MASTER) ? "master" : "slave");
     while (h->quit == 0)
@@ -1784,7 +1784,11 @@ static void *cascade_thread(void *arg)
         if (info->mode == MODBUS_MASTER)
         { // 主模
             r = master_query(cas);
-            sleep(1);
+            if(cmd->cmd==CASCADE_CMD_QUERY_CH)
+            {
+                sleep(1);
+            }
+            else sleep(3);
         }
         else
         { // 从模式,等待主设备发起数据请�?
@@ -1954,6 +1958,9 @@ static int set_modbus(cascade_handle_t *cas, ModbusInfo_t *info)
         return -1;
     }
 
+     _mb_set_timeout(cas, SCAN_TIMEOUT_MS);
+
+
 #if (CHIP_TYPE == CHIP_T113s)
     cas->scanner_flag = 0;
 #endif

+ 4 - 4
pro/src/cascade.h

@@ -178,10 +178,10 @@ typedef struct{
     uint16_t breaker_status;
     uint16_t breaker_addrs;
     int breaker_id;
-    char breaker_gather_type[64];
-    char breaker_com[64];
-    char breaker_switch_name[64];
-    char breaker_chns_name[128];    //
+    char breaker_gather_type[16];
+    char breaker_com[8];
+    char breaker_switch_name[32];
+    char breaker_chns_name[64];    //
 }breaker_channel_info_t;