作者 ookk303

2.12

  1 +/*********************************
  2 + *
  3 + * 极至接收数据处理
  4 + * 数据类型1
  5 + * 用于串口协议,大疆多通道接收协议
  6 + *
  7 + * ****************************************/
  8 +
  9 +#include <stdio.h>
  10 +#include "JZsdkLib.h"
  11 +#include "BaseConfig.h"
  12 +
  13 +/***************
  14 + *
  15 + *
  16 + * 极至串口协议的数据初步筛选
  17 + * 用于清空无效数据
  18 + * 以及将有效数据提取出来,放置到后续处理函数中
  19 + * 输入要 处理的原始数据data 以及 数据长度DataLen 还有输入的接口
  20 + * 返回值:未处理的长度数据
  21 + *
  22 + * 返回后在
  23 + * ********************/
  24 +int HalRecv_tpye1_PreliminaryScreeningOfData(unsigned char *Data, unsigned int DataLen, int Port)
  25 +{
  26 + int ResidualLength = 0; // 剩余数据长度
  27 +
  28 + switch (Port)
  29 + {
  30 + case UART_DEV_1:
  31 + //JZSDK_LOG_INFO("串口-设备1号,接受到数据+未处理数据的长度len: %d", DataLen);
  32 + break;
  33 +
  34 + case UART_DEV_2:
  35 + //JZSDK_LOG_INFO("串口-设备2号,接受到数据+未处理数据的长度len: %d", DataLen);
  36 + break;
  37 +
  38 + case UART_4G:
  39 + //JZSDK_LOG_INFO("串口-4G模块,接受到数据+未处理数据的长度len: %d", DataLen);
  40 + break;
  41 +
  42 + case HAL_DATA_TRANSMISSION:
  43 + //JZSDK_LOG_INFO("hal-数据传输,接受到数据+未处理数据的长度len: %d", DataLen);
  44 + break;
  45 +
  46 + /********** 未报备的接口 ************/
  47 + default:
  48 + ResidualLength = 0;
  49 + return ResidualLength;
  50 + break;
  51 + }
  52 +
  53 + //确保有数据传输进来
  54 + if (DataLen <= 0)
  55 + {
  56 + ResidualLength = 0;
  57 + return ResidualLength;
  58 + }
  59 +
  60 + int HaveReadLen = 0; // 已读长度
  61 + int HaveDealLen = 0; // 已处理长度
  62 + int FrameFlag = 0x00; // 帧标志
  63 + int FrameLen = 0;
  64 +
  65 + //将数据提取出来
  66 + for (HaveReadLen = 0; HaveReadLen <= (DataLen - 3); )
  67 + {
  68 + //查找是否存在 帧头
  69 + switch (Data[HaveReadLen])
  70 + {
  71 + case 0x5A:
  72 + {
  73 + if (Data[HaveReadLen + 1] == 0x5A && Data[HaveReadLen + 2] == 0x77)
  74 + {
  75 + FrameFlag = 0x5A;
  76 + }
  77 + else
  78 + {
  79 + FrameFlag = 0x00;
  80 + }
  81 + break;
  82 + }
  83 +
  84 + case 0x5B:
  85 + {
  86 + if (Data[HaveReadLen + 1] == 0x5B && Data[HaveReadLen + 2] == 0x77)
  87 + {
  88 + FrameFlag = 0x5B;
  89 + }
  90 + else
  91 + {
  92 + FrameFlag = 0x00;
  93 + }
  94 + break;
  95 + }
  96 +
  97 + case 0x6A:
  98 + {
  99 + if (Data[HaveReadLen + 1] == 0x6A && Data[HaveReadLen + 2] == 0x77)
  100 + {
  101 + FrameFlag = 0x6A;
  102 + }
  103 + else
  104 + {
  105 + FrameFlag = 0x00;
  106 + }
  107 + break;
  108 + }
  109 +
  110 + case 0x6B:
  111 + {
  112 + if (Data[HaveReadLen + 1] == 0x6B && Data[HaveReadLen + 2] == 0x77)
  113 + {
  114 + FrameFlag = 0x6B;
  115 + }
  116 + else
  117 + {
  118 + FrameFlag = 0x00;
  119 + }
  120 + }
  121 +
  122 + default:
  123 + FrameFlag = 0x00;
  124 + break;
  125 + }
  126 +
  127 + if (FrameFlag == 0x00)
  128 + {
  129 + if (HaveReadLen >= (DataLen - 5))
  130 + {
  131 + //JZSDK_LOG_INFO("没有找到帧头");
  132 + }
  133 + HaveReadLen++;
  134 + continue;
  135 + }
  136 +
  137 + //如果有帧头,则先判断前面有没有多余的数据残留,并将其移除
  138 + if (HaveReadLen > HaveDealLen)
  139 + {
  140 + //JZSDK_LOG_INFO("残余处理%d",(HaveReadLen - HaveDealLen));
  141 + HaveDealLen = HaveReadLen;
  142 + }
  143 +
  144 + //检查帧长度是否超出数据剩余的内容
  145 + FrameLen = (((int)Data[HaveReadLen+3]) << 8) + (int)Data[HaveReadLen+4];
  146 + if (FrameLen > (DataLen - HaveReadLen))
  147 + {
  148 + //JZSDK_LOG_DEBUG("当前帧长度位长度%d 超出剩余帧长度%d ",FrameLen,(getbufLen - HaveReadLen));
  149 + // 直接跳出for循环
  150 + break;
  151 + }
  152 +
  153 + //检查帧长度是否为0,避免卡死接收串口
  154 + if (FrameLen == 0)
  155 + {
  156 + JZSDK_LOG_ERROR("严重错误,接收到的帧出现长度为空");
  157 + //直接清空接收的数组
  158 + return 0;
  159 + }
  160 +
  161 + //以上检查都没问题,则正常输出帧
  162 + //JZSDK_LOG_INFO("正常输出帧%d",FrameLen);
  163 +
  164 + //UartDeal_Recv_Ouput(type, Uart_fd, &getbuf[HaveReadLen], FrameLen);
  165 + HaveReadLen = HaveReadLen + FrameLen;
  166 + HaveDealLen = HaveReadLen;
  167 +
  168 + JZSDK_LOG_INFO("Prot:%x f_len%d h_r%d [h_r]:%x get%d",Port,FrameLen ,HaveReadLen, getbuf[HaveReadLen-1], DataLen);
  169 +
  170 + FrameLen = 0;
  171 + FrameFlag = 0;
  172 + }
  173 +
  174 + // 如果没有数据残留了
  175 + if (HaveDealLen >= DataLen)
  176 + {
  177 + //printf("HaveReadLen:%d HaveDealLen%d getbufLen:%d\n",HaveReadLen,HaveDealLen,getbufLen);
  178 + ResidualLength = 0;
  179 + return ResidualLength;
  180 + }
  181 +
  182 + else
  183 + {
  184 +
  185 + }
  186 +
  187 + return ResidualLength;
  188 +}
  189 +
  190 +
  191 +static T_JZsdkReturnCode
@@ -18,14 +18,18 @@ struct UartDev_UseFlag @@ -18,14 +18,18 @@ struct UartDev_UseFlag
18 { 18 {
19 int UartDev_DEV1 ; 19 int UartDev_DEV1 ;
20 int UartDev_DEV2 ; 20 int UartDev_DEV2 ;
  21 + int UartDev_DEV3 ;
  22 + int UartDev_DEV4 ;
21 int UartDev_4G ; 23 int UartDev_4G ;
22 }; 24 };
23 -static struct UartDev_UseFlag UartDevUseFlag = {JZ_FLAGCODE_OFF, JZ_FLAGCODE_OFF, JZ_FLAGCODE_OFF}; 25 +
  26 +static struct UartDev_UseFlag UartDevUseFlag = {JZ_FLAGCODE_OFF, JZ_FLAGCODE_OFF, JZ_FLAGCODE_OFF, JZ_FLAGCODE_OFF,JZ_FLAGCODE_OFF};
24 27
25 28
26 /**************** 29 /****************
27 * 30 *
28 * 回复串口是否有被调用 31 * 回复串口是否有被调用
  32 + * 用于状态同步时,是否需要通知该设备
29 * 33 *
30 * *************/ 34 * *************/
31 int JZsdk_Get_UartDev_UseFlag(int UART_DEV_NAME) 35 int JZsdk_Get_UartDev_UseFlag(int UART_DEV_NAME)
@@ -47,6 +51,7 @@ int JZsdk_Get_UartDev_UseFlag(int UART_DEV_NAME) @@ -47,6 +51,7 @@ int JZsdk_Get_UartDev_UseFlag(int UART_DEV_NAME)
47 /************** 51 /**************
48 * 52 *
49 * 串口部分初始化 53 * 串口部分初始化
  54 + * 按默认参数对串口进行初始化
50 * 55 *
51 * *********/ 56 * *********/
52 int JZsdk_Uart_Init(int UART_DEV_NAME) 57 int JZsdk_Uart_Init(int UART_DEV_NAME)
@@ -112,7 +117,8 @@ int JZsdk_Uart_BitRateChange(int UART_DEV_NAME, int BitRate) @@ -112,7 +117,8 @@ int JZsdk_Uart_BitRateChange(int UART_DEV_NAME, int BitRate)
112 117
113 /************** 118 /**************
114 * 119 *
115 - * 串口部分串口再注册 120 + * 串口部分
  121 + * 串口再注册函数
116 * 122 *
117 * *********/ 123 * *********/
118 int JZsdk_Uart_SecondInit(int UART_DEV_NAME, int BitRate) 124 int JZsdk_Uart_SecondInit(int UART_DEV_NAME, int BitRate)
@@ -24,7 +24,7 @@ typedef struct @@ -24,7 +24,7 @@ typedef struct
24 { 24 {
25 int UartFd; // 串口识别符 25 int UartFd; // 串口识别符
26 int UartDevName; //串口名 26 int UartDevName; //串口名
27 - char Message[1024]; // 传递的字符串 27 + unsigned char Message[2048]; // 传递的字符串
28 int MessageLength; // 字符串的长度 28 int MessageLength; // 字符串的长度
29 int ResLen; //剩余长度 29 int ResLen; //剩余长度
30 pthread_mutex_t WriteMutex; // 互斥锁 30 pthread_mutex_t WriteMutex; // 互斥锁
@@ -56,14 +56,11 @@ static int Deal_Thread = JZ_FLAGCODE_OFF; //用于判断处理线程是否成功 @@ -56,14 +56,11 @@ static int Deal_Thread = JZ_FLAGCODE_OFF; //用于判断处理线程是否成功
56 static void *UartDeal_rece(void *arg); 56 static void *UartDeal_rece(void *arg);
57 static void *UartDeal_deal(void *arg); 57 static void *UartDeal_deal(void *arg);
58 58
59 -/*********************  
60 - *  
61 - * 串口接收线程  
62 - *  
63 - * *****************/ 59 +
64 /****************************************************************** 60 /******************************************************************
65 61
66 初始化串口接收和处理 62 初始化串口接收和处理
  63 + 传入 串口描述符 和 串口名
67 64
68 ******************************************************************/ 65 ******************************************************************/
69 int JZsdk_Uart_UartDeal_Receive(int Uart_fd, int Uart_Dev_name) 66 int JZsdk_Uart_UartDeal_Receive(int Uart_fd, int Uart_Dev_name)
@@ -75,17 +72,26 @@ int JZsdk_Uart_UartDeal_Receive(int Uart_fd, int Uart_Dev_name) @@ -75,17 +72,26 @@ int JZsdk_Uart_UartDeal_Receive(int Uart_fd, int Uart_Dev_name)
75 pthread_attr_init(&task_attribute); // 初始化线程属性 72 pthread_attr_init(&task_attribute); // 初始化线程属性
76 pthread_attr_setdetachstate(&task_attribute, PTHREAD_CREATE_DETACHED); // 设置线程属性 73 pthread_attr_setdetachstate(&task_attribute, PTHREAD_CREATE_DETACHED); // 设置线程属性
77 74
  75 + //根据串口名,将串口描述符赋值给对应的串口,并打开对应的线程开关
78 if (Uart_Dev_name == UART_DEV_1) 76 if (Uart_Dev_name == UART_DEV_1)
79 { 77 {
80 Uart_DEV1_fd = Uart_fd; 78 Uart_DEV1_fd = Uart_fd;
  79 + Uart_DEV1_Switch = JZ_FLAGCODE_ON;
81 } 80 }
82 else if (Uart_Dev_name == UART_DEV_2) 81 else if (Uart_Dev_name == UART_DEV_2)
83 { 82 {
84 Uart_DEV2_fd = Uart_fd; 83 Uart_DEV2_fd = Uart_fd;
  84 + Uart_DEV2_Switch = JZ_FLAGCODE_ON;
85 } 85 }
86 else if (Uart_Dev_name == UART_4G) 86 else if (Uart_Dev_name == UART_4G)
87 { 87 {
88 Uart_4G_fd = Uart_fd; 88 Uart_4G_fd = Uart_fd;
  89 + Uart_4G_Switch = JZ_FLAGCODE_ON;
  90 + }
  91 + else
  92 + {
  93 + JZSDK_LOG_ERROR("Uart_Dev_name error");
  94 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
89 } 95 }
90 96
91 s_SerialArgs *parameter = (s_SerialArgs *)malloc(sizeof(s_SerialArgs)); 97 s_SerialArgs *parameter = (s_SerialArgs *)malloc(sizeof(s_SerialArgs));
@@ -109,6 +115,8 @@ int JZsdk_Uart_UartDeal_Receive(int Uart_fd, int Uart_Dev_name) @@ -109,6 +115,8 @@ int JZsdk_Uart_UartDeal_Receive(int Uart_fd, int Uart_Dev_name)
109 pthread_attr_init(&task_attribute1); 115 pthread_attr_init(&task_attribute1);
110 pthread_attr_init(&task_attribute2); 116 pthread_attr_init(&task_attribute2);
111 117
  118 +
  119 + // 创建串口接收线程
112 if (pthread_create(&receiveThread, &task_attribute1, UartDeal_rece, parameter) != 0) 120 if (pthread_create(&receiveThread, &task_attribute1, UartDeal_rece, parameter) != 0)
113 { 121 {
114 JZSDK_LOG_ERROR("Failed to create receive thread"); 122 JZSDK_LOG_ERROR("Failed to create receive thread");
@@ -129,39 +137,38 @@ int JZsdk_Uart_UartDeal_Receive(int Uart_fd, int Uart_Dev_name) @@ -129,39 +137,38 @@ int JZsdk_Uart_UartDeal_Receive(int Uart_fd, int Uart_Dev_name)
129 * ***/ 137 * ***/
130 static void *UartDeal_rece(void *arg) 138 static void *UartDeal_rece(void *arg)
131 { 139 {
132 -  
133 s_SerialArgs *args = (s_SerialArgs *)arg; 140 s_SerialArgs *args = (s_SerialArgs *)arg;
134 struct timeval timeout; // 超时时间 141 struct timeval timeout; // 超时时间
135 fd_set fs_read; 142 fd_set fs_read;
136 143
  144 + //获取串口描述符
137 int Uart_fd = args->UartFd; 145 int Uart_fd = args->UartFd;
138 146
139 - FD_ZERO(&fs_read);  
140 - FD_SET(Uart_fd, &fs_read);  
141 -  
142 - memset(args->Message, 0, sizeof(args->Message)); // 清空接收数组 147 + //清空接收数组与初始化配置
  148 + memset(args->Message, 0, sizeof(args->Message));
143 args->ResLen = 0; 149 args->ResLen = 0;
144 args->MessageLength = 0; 150 args->MessageLength = 0;
145 151
146 - int *TheadSwtch = NULL;  
147 - if (args->UartDevName == UART_4G) 152 + // 根据设备名称设置相应的线程开关
  153 + int *TheadSwtch = NULL; //线程开关
  154 + switch(args->UartDevName)
148 { 155 {
  156 + case UART_4G:
149 TheadSwtch = &Uart_4G_Switch; 157 TheadSwtch = &Uart_4G_Switch;
150 - Uart_4G_Switch = JZ_FLAGCODE_ON;  
151 - }  
152 - else if (args->UartDevName == UART_DEV_1)  
153 - { 158 + break;
  159 + case UART_DEV_1:
154 TheadSwtch = &Uart_DEV1_Switch; 160 TheadSwtch = &Uart_DEV1_Switch;
155 - Uart_DEV1_Switch = JZ_FLAGCODE_ON;  
156 - }  
157 - else if (args->UartDevName == UART_DEV_2)  
158 - { 161 + break;
  162 + case UART_DEV_2:
159 TheadSwtch = &Uart_DEV2_Switch; 163 TheadSwtch = &Uart_DEV2_Switch;
160 - Uart_DEV2_Switch = JZ_FLAGCODE_ON; 164 + break;
  165 + default:
  166 + return NULL; // 或者处理未知设备的情况
161 } 167 }
162 168
163 while (*TheadSwtch) 169 while (*TheadSwtch)
164 { 170 {
  171 + //重置处理时间
165 FD_ZERO(&fs_read); 172 FD_ZERO(&fs_read);
166 FD_SET(Uart_fd, &fs_read); 173 FD_SET(Uart_fd, &fs_read);
167 174
@@ -170,17 +177,20 @@ static void *UartDeal_rece(void *arg) @@ -170,17 +177,20 @@ static void *UartDeal_rece(void *arg)
170 177
171 // 检查fs_read套接字是否有数据 178 // 检查fs_read套接字是否有数据
172 int ret = select(Uart_fd + 1, &fs_read, NULL, NULL, &timeout); 179 int ret = select(Uart_fd + 1, &fs_read, NULL, NULL, &timeout);
173 - if (ret < 0) { 180 +
174 // 发生错误 181 // 发生错误
175 - JZSDK_LOG_ERROR("串口select出错"); 182 + if (ret < 0)
  183 + {
  184 + //清空缓冲区
  185 + JZSDK_LOG_ERROR("uart select error");
176 args->MessageLength = 0; 186 args->MessageLength = 0;
177 args->ResLen = 0; 187 args->ResLen = 0;
178 memset(&(args->Message[0]), 0, sizeof(args->Message)); 188 memset(&(args->Message[0]), 0, sizeof(args->Message));
179 - delayMs(3);  
180 continue; 189 continue;
181 - } else if (ret == 0)  
182 - { 190 + }
183 // 超时 191 // 超时
  192 + else if (ret == 0)
  193 + {
184 continue; 194 continue;
185 } 195 }
186 196
@@ -189,8 +199,11 @@ static void *UartDeal_rece(void *arg) @@ -189,8 +199,11 @@ static void *UartDeal_rece(void *arg)
189 199
190 // 读取串口内容 200 // 读取串口内容
191 int bytesRead = read(Uart_fd, &(args->Message[args->ResLen]), (sizeof(args->Message) - args->ResLen)); 201 int bytesRead = read(Uart_fd, &(args->Message[args->ResLen]), (sizeof(args->Message) - args->ResLen));
  202 +
  203 + //正常读取到数据
192 if (bytesRead > 0) 204 if (bytesRead > 0)
193 { 205 {
  206 + //计算当前的数据长度
194 args->MessageLength = args->ResLen + bytesRead; 207 args->MessageLength = args->ResLen + bytesRead;
195 208
196 // data_len+=bytesRead; 209 // data_len+=bytesRead;
@@ -204,12 +217,14 @@ static void *UartDeal_rece(void *arg) @@ -204,12 +217,14 @@ static void *UartDeal_rece(void *arg)
204 // JZSDK_LOG_OUTPUTHEX("%s",&args->Message[i+args->ResLen]); 217 // JZSDK_LOG_OUTPUTHEX("%s",&args->Message[i+args->ResLen]);
205 // } 218 // }
206 219
  220 + // 更新剩余长度
207 args->ResLen = 0; 221 args->ResLen = 0;
208 } 222 }
  223 + //读取到数据为空
209 else if (bytesRead == 0) 224 else if (bytesRead == 0)
210 { 225 {
211 // 串口关闭或者无数据可读 226 // 串口关闭或者无数据可读
212 - JZSDK_LOG_ERROR("串口读取数据为空"); 227 + JZSDK_LOG_ERROR("Error reading from serial port is empty");
213 args->MessageLength = 0; 228 args->MessageLength = 0;
214 args->ResLen = 0; 229 args->ResLen = 0;
215 memset(&(args->Message[0]), 0, sizeof(args->Message)); 230 memset(&(args->Message[0]), 0, sizeof(args->Message));
@@ -227,12 +242,13 @@ static void *UartDeal_rece(void *arg) @@ -227,12 +242,13 @@ static void *UartDeal_rece(void *arg)
227 //pthread_cond_signal(&args->cond); 242 //pthread_cond_signal(&args->cond);
228 pthread_mutex_unlock(&args->ReadMutex); // 解锁 243 pthread_mutex_unlock(&args->ReadMutex); // 解锁
229 244
230 - // 添加适当延时,确保接收缓冲区完全填满 245 + // 添加适当延时,确保接收缓冲区有足够的数据
231 delayMs(3); // 加多了可能导致实时播放难恢复,以及声音间隔 3ms32字节 会向上约1个3ms opus一帧80字节 246 delayMs(3); // 加多了可能导致实时播放难恢复,以及声音间隔 3ms32字节 会向上约1个3ms opus一帧80字节
232 } 247 }
233 248
234 //注销相关 249 //注销相关
235 Recv_Thread = JZ_FLAGCODE_OFF; 250 Recv_Thread = JZ_FLAGCODE_OFF;
  251 +
236 // 通知线程 252 // 通知线程
237 //pthread_cond_signal(&args->cond); 253 //pthread_cond_signal(&args->cond);
238 pthread_mutex_unlock(&args->WriteMutex); // 解锁 254 pthread_mutex_unlock(&args->WriteMutex); // 解锁
@@ -252,25 +268,23 @@ static void *UartDeal_deal(void *arg) @@ -252,25 +268,23 @@ static void *UartDeal_deal(void *arg)
252 268
253 static int ResidualLength = 0; // 未处理数据长度 269 static int ResidualLength = 0; // 未处理数据长度
254 270
255 - int *TheadSwtch = NULL;  
256 - if (args->UartDevName == UART_4G) 271 + // 根据设备名称设置相应的线程开关
  272 + int *TheadSwtch = NULL; //线程开关
  273 + switch(args->UartDevName)
257 { 274 {
  275 + case UART_4G:
258 TheadSwtch = &Uart_4G_Switch; 276 TheadSwtch = &Uart_4G_Switch;
259 - Uart_4G_Switch = JZ_FLAGCODE_ON;  
260 - }  
261 - else if (args->UartDevName == UART_DEV_1)  
262 - { 277 + break;
  278 + case UART_DEV_1:
263 TheadSwtch = &Uart_DEV1_Switch; 279 TheadSwtch = &Uart_DEV1_Switch;
264 - Uart_DEV1_Switch = JZ_FLAGCODE_ON;  
265 - }  
266 - else if (args->UartDevName == UART_DEV_2)  
267 - { 280 + break;
  281 + case UART_DEV_2:
268 TheadSwtch = &Uart_DEV2_Switch; 282 TheadSwtch = &Uart_DEV2_Switch;
269 - Uart_DEV2_Switch = JZ_FLAGCODE_ON; 283 + break;
  284 + default:
  285 + return NULL; // 或者处理未知设备的情况
270 } 286 }
271 287
272 - //int data_len = 0;  
273 -  
274 while (*TheadSwtch) 288 while (*TheadSwtch)
275 { 289 {
276 290
@@ -283,45 +297,22 @@ static void *UartDeal_deal(void *arg) @@ -283,45 +297,22 @@ static void *UartDeal_deal(void *arg)
283 // data_len+=args->MessageLength; 297 // data_len+=args->MessageLength;
284 // printf("当前处理长度%d\n",data_len); 298 // printf("当前处理长度%d\n",data_len);
285 299
  300 + //如果当前存在数据
286 if (args->MessageLength > 0) 301 if (args->MessageLength > 0)
287 { 302 {
288 -  
289 - //清除错误的多余半帧  
290 - //前面有帧的长度  
291 - if(args->ResLen != 0)  
292 - {  
293 - //存在第一帧,同时第二轮的数据开头是帧头,则清空前半段第一帧  
294 - if ( (args->Message[args->ResLen ] == 0x5A)  
295 - && (args->Message[args->ResLen + 1] == 0x5A)  
296 - && (args->Message[args->ResLen + 2] == 0x77) )  
297 - {  
298 - int temp_num;  
299 - temp_num = args->MessageLength - args->ResLen;  
300 - if (temp_num < 0)  
301 - {  
302 - temp_num = 0;  
303 - }  
304 -  
305 - memcpy(args->Message, &(args->Message[args->ResLen]), temp_num);  
306 - memset(&args->Message[temp_num], 0, (args->MessageLength - temp_num));  
307 - args->MessageLength = temp_num;  
308 - args->ResLen = 0;  
309 -  
310 - JZSDK_LOG_ERROR("串口上一帧为不完全帧,舍弃该帧操作");  
311 - }  
312 - }  
313 -  
314 - // 处理数据 303 + //处理数据
315 ResidualLength = UartDeal_Recv_interface(0, args->UartFd, args->Message, args->MessageLength); 304 ResidualLength = UartDeal_Recv_interface(0, args->UartFd, args->Message, args->MessageLength);
  305 +
316 //如果还有剩余的长度 306 //如果还有剩余的长度
317 - if (ResidualLength != 0) 307 + if (ResidualLength != 0) //将其返还到缓冲区
318 { 308 {
319 memcpy(args->Message, &(args->Message[args->MessageLength - ResidualLength]), ResidualLength); 309 memcpy(args->Message, &(args->Message[args->MessageLength - ResidualLength]), ResidualLength);
320 memset(&(args->Message[ResidualLength]), 0, (sizeof(args->Message) - ResidualLength)); 310 memset(&(args->Message[ResidualLength]), 0, (sizeof(args->Message) - ResidualLength));
321 args->MessageLength = 0; 311 args->MessageLength = 0;
322 args->ResLen = ResidualLength; 312 args->ResLen = ResidualLength;
323 } 313 }
324 - else 314 +
  315 + else //清空一次缓冲区
325 { 316 {
326 memset(args->Message, 0, sizeof(args->Message)); 317 memset(args->Message, 0, sizeof(args->Message));
327 args->MessageLength = 0; 318 args->MessageLength = 0;
@@ -329,6 +320,8 @@ static void *UartDeal_deal(void *arg) @@ -329,6 +320,8 @@ static void *UartDeal_deal(void *arg)
329 } 320 }
330 321
331 } 322 }
  323 +
  324 + //如果不存在数据 或 存在异常 ,则顺便清空一次缓冲区
332 else 325 else
333 { 326 {
334 memset(args->Message, 0, sizeof(args->Message)); 327 memset(args->Message, 0, sizeof(args->Message));
@@ -344,6 +337,30 @@ static void *UartDeal_deal(void *arg) @@ -344,6 +337,30 @@ static void *UartDeal_deal(void *arg)
344 JZSDK_LOG_WARN("串口处理线程被关闭"); 337 JZSDK_LOG_WARN("串口处理线程被关闭");
345 } 338 }
346 339
  340 +
  341 +
  342 +
  343 +
  344 +
  345 +
  346 +
  347 +
  348 +
  349 +
  350 +
  351 +/********************************************************************************************************************
  352 + *
  353 + *
  354 + * 分割线
  355 + *
  356 + *
  357 +**********************************************************************************************************************/
  358 +
  359 +
  360 +
  361 +
  362 +
  363 +
347 /* 364 /*
348 365
349 数据排出函数 366 数据排出函数
@@ -824,13 +841,12 @@ static void *CloseUart(void *arg) @@ -824,13 +841,12 @@ static void *CloseUart(void *arg)
824 return 0; 841 return 0;
825 } 842 }
826 843
  844 + //直到某个串口达成了关闭,这里不能明确到判断哪个串口关闭,但是识别第一个关闭的串口
827 while ( (Recv_Thread != JZ_FLAGCODE_OFF) && (Deal_Thread != JZ_FLAGCODE_OFF)) 845 while ( (Recv_Thread != JZ_FLAGCODE_OFF) && (Deal_Thread != JZ_FLAGCODE_OFF))
828 { 846 {
829 delayMs(1); 847 delayMs(1);
830 } 848 }
831 849
832 - delayMs(100);  
833 -  
834 //保证全部注销后 850 //保证全部注销后
835 JZSDK_LOG_INFO("串口注销完毕"); 851 JZSDK_LOG_INFO("串口注销完毕");
836 852