|
@@ -83,6 +83,7 @@ void CChengzhongWorker::HandleWork()
|
|
|
|
|
|
|
|
//开始读取串口的数据
|
|
//开始读取串口的数据
|
|
|
DWORD nReaded = 0;
|
|
DWORD nReaded = 0;
|
|
|
|
|
+ DWORD nReadedTotal = 0;
|
|
|
|
|
|
|
|
m_serial.readFromComm(a, 22, &nReaded);
|
|
m_serial.readFromComm(a, 22, &nReaded);
|
|
|
if (nReaded <= 0)
|
|
if (nReaded <= 0)
|
|
@@ -91,13 +92,48 @@ void CChengzhongWorker::HandleWork()
|
|
|
continue;
|
|
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后面,避免有的数据中间截断导致格式混乱
|
|
|
chuankou_string = a;
|
|
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);
|
|
size_t nPos = chuankou_string.find(show_command);
|
|
|
if (nPos == chuankou_string.npos)
|
|
if (nPos == chuankou_string.npos)
|
|
@@ -151,6 +187,7 @@ void CChengzhongWorker::HandleWork()
|
|
|
|
|
|
|
|
//开始读取串口的数据
|
|
//开始读取串口的数据
|
|
|
DWORD nReaded = 0;
|
|
DWORD nReaded = 0;
|
|
|
|
|
+ DWORD nReadedTotal = 0;
|
|
|
|
|
|
|
|
m_serial.readFromComm(a, 16, &nReaded);
|
|
m_serial.readFromComm(a, 16, &nReaded);
|
|
|
if (nReaded <= 0)
|
|
if (nReaded <= 0)
|
|
@@ -159,14 +196,48 @@ void CChengzhongWorker::HandleWork()
|
|
|
continue;
|
|
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后面,避免有的数据中间截断导致格式混乱
|
|
|
chuankou_string = a;
|
|
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);
|
|
size_t nPos = chuankou_string.find(show_command);
|
|
|
if (nPos == chuankou_string.npos)
|
|
if (nPos == chuankou_string.npos)
|