张洋 1 неделя назад
Родитель
Сommit
e49e261a38
1 измененных файлов с 79 добавлено и 8 удалено
  1. 79 8
      zhipuzi_pos_windows/worker/CChengzhongWorker.cpp

+ 79 - 8
zhipuzi_pos_windows/worker/CChengzhongWorker.cpp

@@ -83,6 +83,7 @@ void CChengzhongWorker::HandleWork()
 
 			//开始读取串口的数据
 			DWORD nReaded = 0;
+			DWORD nReadedTotal = 0;
 
 			m_serial.readFromComm(a, 22, &nReaded);
 			if (nReaded <= 0)
@@ -91,13 +92,48 @@ void CChengzhongWorker::HandleWork()
 				continue;
 			}
 
+			nReadedTotal += nReaded;
+
+			int nRetry = 0;
+			while (nReadedTotal < 22)
+			{
+				Sleep(50);
+
+				m_serial.readFromComm(a + nReadedTotal, 22 - nReadedTotal, &nReaded);
+
+				if (nReaded > 0)
+				{
+					nReadedTotal += nReaded;
+
+					if (nReadedTotal == 22)
+					{
+						break;
+					}
+				}
+
+				nRetry++;
+
+				if (nReaded >= 3)
+				{
+					break;
+				}
+			}
+
+			if (nReadedTotal < 22)
+			{
+				//还是没读满22个
+				Sleep(200);
+				continue;
+			}
+
 			//把所有读到的内容,拼接到chuankou_string后面,避免有的数据中间截断导致格式混乱
 			chuankou_string = a;
 
-			if (a[20] != 0x0A || a[21] != 0x0D)
+			//走到这里说明已经读满22个字节了,接下来判断格式是否正确
+			if (chuankou_string.at(20) != 0x0A || chuankou_string.at(21) != 0x0D)
 			{
-				//说明这22个字节的数据不是完整的,这个时候处理方式是把错误数据全部读完,但是不处理,然后下次接着处理
-				std::string show_command = "\n\r";
+				//格式异常,这22个字节的顺序或者格式不对
+				std::string show_command = "\n";
 
 				size_t nPos = chuankou_string.find(show_command);
 				if (nPos == chuankou_string.npos)
@@ -151,6 +187,7 @@ void CChengzhongWorker::HandleWork()
 
 			//开始读取串口的数据
 			DWORD nReaded = 0;
+			DWORD nReadedTotal = 0;
 
 			m_serial.readFromComm(a, 16, &nReaded);
 			if (nReaded <= 0)
@@ -159,14 +196,48 @@ void CChengzhongWorker::HandleWork()
 				continue;
 			}
 
+			nReadedTotal += nReaded;
+
+			int nRetry = 0;
+			while (nReadedTotal < 16)
+			{
+				Sleep(50);
+
+				m_serial.readFromComm(a + nReadedTotal, 16 - nReadedTotal, &nReaded);
+
+				if (nReaded > 0)
+				{
+					nReadedTotal += nReaded;
+
+					if (nReadedTotal == 16)
+					{
+						break;
+					}
+				}
+
+				nRetry++;
+
+				if (nReaded >= 3)
+				{
+					break;
+				}
+			}
+
+			if (nReadedTotal < 16)
+			{
+				//还是没读满16个
+				Sleep(200);
+				continue;
+			}
+
 			//把所有读到的内容,拼接到chuankou_string后面,避免有的数据中间截断导致格式混乱
 			chuankou_string = a;
-			//LOG_INFO(("称重串口收到数据" + chuankou_string).c_str());
-
-			if (a[0] != 0x01 || a[1] != 0x02 || a[13] != 0x03 || a[14] != 0x04)
+			//LOG_INFO(("称重串口收到数据" + chuankou_string).c_str());		
+			
+			if (chuankou_string.at(0) != 0x01 || chuankou_string.at(1) != 0x02 || chuankou_string.at(13) != 0x03 || chuankou_string.at(14) != 0x04)
 			{
-				//说明这16个字节的数据不是完整的,这个时候处理方式是把错误数据全部读完,但是不处理,然后下次接着处理
-				std::string show_command = "\x01\x02";
+				//格式异常,这16个字节的顺序或者格式不对
+				std::string show_command = "\x01";
 
 				size_t nPos = chuankou_string.find(show_command);
 				if (nPos == chuankou_string.npos)