张洋 vor 2 Wochen
Ursprung
Commit
6303588ba0

+ 23 - 21
zhipuzi_pos_windows/helper/CSerialPort.cpp

@@ -1,4 +1,4 @@
-#include "../pch/pch.h"
+#include "../pch/pch.h"
 #include "CSerialPort.h"
 
 CSerialPort::CSerialPort(
@@ -36,17 +36,17 @@ CSerialPort::~CSerialPort()
 
 }
 
-// 打开串口成功,返回 true
+// 鎵撳紑涓插彛鎴愬姛,杩斿洖 true
 
 bool CSerialPort::openComm()
 {
 	std::wstring realPort = _T("\\\\.\\") + m_portNum;
     m_hComm = CreateFile(realPort.c_str(),
-                         GENERIC_READ | GENERIC_WRITE, //允许读和写
-                         0,		//独占方式
+                         GENERIC_READ | GENERIC_WRITE, //允许读和写
+                         0,		//鐙�崰鏂瑰紡
                          NULL, 
-						 OPEN_EXISTING,   //打开而不是创建
-                         0,   //同步方式
+						 OPEN_EXISTING,   //打开而不是创建
+                         0,   //鍚屾�鏂瑰紡
                          NULL
                         );
 
@@ -59,15 +59,17 @@ bool CSerialPort::openComm()
     }
     else
     {
-		SetupComm(m_hComm, MAX_BUFFER_SIZE, MAX_BUFFER_SIZE);	// 设置读写缓冲区大小
+		SetupComm(m_hComm, MAX_BUFFER_SIZE, MAX_BUFFER_SIZE);	// 设置读写缓冲区大小
 
-		COMMTIMEOUTS TimeOuts; //设定读超时
-		TimeOuts.ReadIntervalTimeout = MAXDWORD;
+		COMMTIMEOUTS TimeOuts; 
+		//设定读超时
+		TimeOuts.ReadIntervalTimeout = 0;
 		TimeOuts.ReadTotalTimeoutMultiplier = 0;
-		TimeOuts.ReadTotalTimeoutConstant = 0; //设定写超时
+		TimeOuts.ReadTotalTimeoutConstant = 200; 
+		//设定写超时
 		TimeOuts.WriteTotalTimeoutMultiplier = 500;
 		TimeOuts.WriteTotalTimeoutConstant = 2000;
-		SetCommTimeouts(m_hComm, &TimeOuts); //设置超时
+		SetCommTimeouts(m_hComm, &TimeOuts); //璁剧疆瓒呮椂
 
         DCB dcb;
         GetCommState(m_hComm, &dcb);
@@ -79,19 +81,19 @@ bool CSerialPort::openComm()
         if(!SetCommState(m_hComm, &dcb))
         {
             TCHAR szBuf[1024] = { 0 };
-            wsprintf(szBuf, L"串口设置失败,错误代码: %d", GetLastError());
+            wsprintf(szBuf, L"涓插彛璁剧疆澶辫触,閿欒�浠g爜: %d", GetLastError());
             //MessageBox(NULL, szBuf, TEXT("ERROR"), MB_OK);
             return false;
         }
 
     }
 
-    //在读写串口前,用 PurgeComm 函数清空缓冲区
+    //在读写串口前,用 PurgeComm 函数清空缓冲区
     BOOL ret = PurgeComm(m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_TXABORT | PURGE_TXABORT);
 	if (!ret)
 	{
 		TCHAR szBuf[1024] = { 0 };
-		wsprintf(szBuf, _T("清空缓冲区失败,错误代码: %d"), GetLastError());
+		wsprintf(szBuf, _T("清空缓冲区失败,错误代码: %d"), GetLastError());
 		//MessageBox(NULL, szBuf, L"ERROR", MB_OK);
 	}
 
@@ -101,7 +103,7 @@ bool CSerialPort::openComm()
 
 }
 
-// 关闭串口
+// 鍏抽棴涓插彛
 void CSerialPort::closeComm()
 {
 	if (!m_bOpen)
@@ -113,7 +115,7 @@ void CSerialPort::closeComm()
 }
 
 
-// 向串口发送数据
+// 向串口发送数据
 bool CSerialPort::writeToComm(BYTE data[], DWORD dwLength)
 {
 #ifdef _DEBUG
@@ -134,7 +136,7 @@ bool CSerialPort::writeToComm(BYTE data[], DWORD dwLength)
     if(ret == FALSE)
     {
         TCHAR szBuf[1024] = { 0 };
-        wsprintf(szBuf, _T("读取数据失败,错误代码: %d"), GetLastError());
+        wsprintf(szBuf, _T("璇诲彇鏁版嵁澶辫触,閿欒�浠g爜: %d"), GetLastError());
         //MessageBox(NULL, szBuf, L"ERROR", MB_OK);
 
         return false;
@@ -145,7 +147,7 @@ bool CSerialPort::writeToComm(BYTE data[], DWORD dwLength)
 
 }
 
-// 从串口中读取数据
+// 浠庝覆鍙d腑璇诲彇鏁版嵁
 bool CSerialPort::readFromComm(char buffer[], DWORD dwLength, DWORD* nReaded)
 {
 #ifdef _DEBUG
@@ -161,9 +163,9 @@ bool CSerialPort::readFromComm(char buffer[], DWORD dwLength, DWORD* nReaded)
         PurgeComm(m_hComm, PURGE_RXABORT | PURGE_RXCLEAR);
     }
 
-    DWORD dwRx = 0;		// 读入的字节数
+    DWORD dwRx = 0;		// 璇诲叆鐨勫瓧鑺傛暟
     BOOL ret = FALSE;
-    ret = ReadFile(m_hComm, buffer, dwLength, &dwRx, NULL);	// 读入数据
+    ret = ReadFile(m_hComm, buffer, dwLength, &dwRx, NULL);	// 璇诲叆鏁版嵁
 
     if(ret == TRUE)
     {
@@ -174,7 +176,7 @@ bool CSerialPort::readFromComm(char buffer[], DWORD dwLength, DWORD* nReaded)
     else
     {
 		TCHAR szBuf[1024] = { 0 };
-		wsprintf(szBuf, _T("读取数据失败,错误代码: %d"), GetLastError());
+		wsprintf(szBuf, _T("璇诲彇鏁版嵁澶辫触,閿欒�浠g爜: %d"), GetLastError());
 		//MessageBox(NULL, szBuf, L"ERROR", MB_OK);
 
         return false;

+ 9 - 7
zhipuzi_pos_windows/worker/CChengzhongWorker.cpp

@@ -61,6 +61,9 @@ void CChengzhongWorker::HandleWork()
 		this->RestartSerial();
 	}
 
+	//暂存串口读到的数据,避免有的数据中间截断导致格式混乱
+	std::string chuankou_string = "";
+
 	while (m_is_work)
 	{
 		if (m_dianzicheng_lianjie == "0")
@@ -71,14 +74,12 @@ void CChengzhongWorker::HandleWork()
 
 		std::string new_weight;
 
-		std::string chuankou_string = "";
-
 		//不同型号的电子秤,数据格式可能不一样,处理方式不一样
 		if (m_dianzicheng_xinghao == "dahua_acs")
 		{
-			char a[22] = { 0 };
+			char a[100] = { 0 };
 
-			memset(a, 0, 22);
+			memset(a, 0, 100);
 
 			//开始读取串口的数据
 			DWORD nReaded = 0;
@@ -144,9 +145,9 @@ void CChengzhongWorker::HandleWork()
 		}
 		else if (m_dianzicheng_xinghao == "dingjian_os2x")
 		{
-			char a[16] = { 0 };
+			char a[100] = { 0 };
 
-			memset(a, 0, 16);
+			memset(a, 0, 100);
 
 			//开始读取串口的数据
 			DWORD nReaded = 0;
@@ -160,6 +161,7 @@ void CChengzhongWorker::HandleWork()
 
 			//把所有读到的内容,拼接到chuankou_string后面,避免有的数据中间截断导致格式混乱
 			chuankou_string = a;
+			//LOG_INFO(("称重串口收到数据" + chuankou_string).c_str());
 
 			if (a[0] != 0x01 || a[1] != 0x02 || a[13] != 0x03 || a[14] != 0x04)
 			{
@@ -181,7 +183,7 @@ void CChengzhongWorker::HandleWork()
 				continue;
 			}
 
-			std::string new_weight = chuankou_string.substr(4, 6);
+			new_weight = chuankou_string.substr(4, 6);
 
 			if (new_weight.at(0) == '0')
 			{