Prechádzať zdrojové kódy

纠正TheSecondPart函数问题。

sat23 4 rokov pred
rodič
commit
fc96773f2d

+ 4 - 1
Serail-Demo/Demo/Demo.cpp

@@ -29,7 +29,6 @@ int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
 	else
 	{
 		// TODO: 在此处为应用程序的行为编写代码。
-		_dprintf("返回码错误:%02X", 302);
 #if 1
 		CBaseSerial sb(0);
 		if ( sb.Open(23, _T("baud=115200 parity=N data=8 stop=1")) )
@@ -50,6 +49,10 @@ int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
 					int c = sb.ReadSync(szData, 1024);
 					std::string str = BytesToHexString(szData, c, ' ');
 					_dprintf("结果:%s", str.c_str());
+
+					str = "";
+					str.append((char*)szData, c);
+					ParseResultString(*it, str, str.size());
 					
 					Sleep(it->cmd_wait_time);
 				}

+ 23 - 18
Serail-Demo/Demo/stdafx.cpp

@@ -391,28 +391,28 @@ std::string PackingCommand(CommandParam &cmdPara, std::string data, const int &d
 bool TheFirstPart(CommandParam& cmdPara, std::string data)
 {
 	if (data.size() == NoneOptLen) {
-		if (data[0] == cmdPara._rtnCode) {
+		if ((byte)data[0] == cmdPara._rtnCode) {
 			// 长度;
-			int nPackageLen = data[1];
+			int nPackageLen = (byte)data[1];
 			if (nPackageLen != NoneOptLen) {
-				cmdPara._rtnError = _dprintf("None长度错误:%ld", data[1]);
+				cmdPara._rtnError = _dprintf("None长度错误:%ld", (byte)data[1]);
 				return false;
 			}
 
 			// 执行状态;
-			cmdPara._rtnStatus = data[2];
+			cmdPara._rtnStatus = (byte)data[2];
 			_dprintf(_T("rtnStatus=%02X"), cmdPara._rtnStatus);
 
 			// 校验crc;
-			unsigned short usCRCValue = CRC16Calculate((unsigned char*)data.data(), nPackageLen - 2);
-			if (((usCRCValue >> 8) & 0xFF) != (unsigned char)data[nPackageLen - 2] || (usCRCValue & 0xFF) != (unsigned char)data[nPackageLen - 1])
+			unsigned short usCRCValue = CRC16Calculate((byte*)data.data(), nPackageLen - 2);
+			if (((usCRCValue >> 8) & 0xFF) != (byte)data[nPackageLen - 2] || (usCRCValue & 0xFF) != (byte)data[nPackageLen - 1])
 			{
-				cmdPara._rtnError = _dprintf("CRC校验错误:计算[%02% %02X] != 接收[%02X %02X]", (usCRCValue >> 8) & 0xFF, usCRCValue & 0xFF, data[nPackageLen - 2], data[nPackageLen - 1]);
+				cmdPara._rtnError = _dprintf("CRC校验错误:计算[%02% %02X] != 接收[%02X %02X]", (usCRCValue >> 8) & 0xFF, usCRCValue & 0xFF, (byte)data[nPackageLen - 2], (byte)data[nPackageLen - 1]);
 				return false;
 			}
 		}
 		else {
-			cmdPara._rtnError = _dprintf("返回码错误:%02X", data[0]);
+			cmdPara._rtnError = _dprintf("返回码错误:%02X", (byte)data[0]);
 			return false;
 		}
 	}
@@ -428,11 +428,11 @@ bool TheSecondPart(CommandParam& cmdPara, std::string data)
 {
 	int nDataPos = 0;
 	int nPackageLen = 0;
-	if (data[0] == cmdPara._rtnCode) {
+	if ((byte)data[0] == cmdPara._rtnCode) {
 		// 获取长度;
-		if ( data[1] == 0xFE ) {
+		if ( (byte)data[1] == 0xFE ) {
 			nDataPos = 4;
-			nPackageLen = data[2] << 8 | data[3];
+			nPackageLen = (byte)data[2] << 8 | (byte)data[3];
 			if ( data.size() < 255 && data[2] != 0 ) {	
 				cmdPara._rtnError = _dprintf(_T("长度异常"));
 				return false;
@@ -441,7 +441,7 @@ bool TheSecondPart(CommandParam& cmdPara, std::string data)
 		else
 		{
 			nDataPos = 2;
-			nPackageLen = data[1];
+			nPackageLen = (byte)data[1];
 #if 0 // 如果数据包含有非协议包内的数据,会判断异常;
 			if ( data.size() > 255 ){	
 				//nPackageLen = data[1] << 8 | data[2];
@@ -457,15 +457,20 @@ bool TheSecondPart(CommandParam& cmdPara, std::string data)
 			return false;
 #endif
 
+		if (_tcsicmp(cmdPara.code.c_str(), ByteToChars((byte)data[nDataPos]-1).c_str()) != 0) {
+			cmdPara._rtnError = _dprintf(_T("返回的指令错误, %s, %02X"), cmdPara.head.c_str(),(byte)data[nDataPos]);
+			return false;
+		}
+
 		// 执行状态;
-		cmdPara._rtnData = data.substr(nDataPos, nPackageLen - nDataPos - 2); //2=crc;
-		_dprintf(_T("rtnData=%s"), cmdPara._rtnData.c_str());
+		cmdPara._rtnData = data.substr(nDataPos+1, nPackageLen - nDataPos - 3); //3 = crc + 返回指令码;
+		_dprintf(_T("rtnData=%s"), BytesToHexString((byte*)cmdPara._rtnData.c_str(), cmdPara._rtnData.size(), ' ').c_str());
 
 		// 校验crc;
-		unsigned short usCRCValue = CRC16Calculate((unsigned char*)data.data(), nPackageLen - 2);
-		if (((usCRCValue >> 8) & 0xFF) != (unsigned char)data[nPackageLen - 2] || (usCRCValue & 0xFF) != (unsigned char)data[nPackageLen - 1])
+		unsigned short usCRCValue = CRC16Calculate((byte*)data.data(), nPackageLen - 2);
+		if (((usCRCValue >> 8) & 0xFF) != (byte)data[nPackageLen - 2] || (usCRCValue & 0xFF) != (byte)data[nPackageLen - 1])
 		{
-			cmdPara._rtnError = _dprintf("CRC校验错误:计算[%02% %02X] != 接收[%02X %02X]", (usCRCValue >> 8) & 0xFF, usCRCValue & 0xFF, data[nPackageLen - 2], data[nPackageLen - 1]);
+			cmdPara._rtnError = _dprintf("CRC校验错误:计算[%02% %02X] != 接收[%02X %02X]", (usCRCValue >> 8) & 0xFF, usCRCValue & 0xFF, (byte)data[nPackageLen - 2], (byte)data[nPackageLen - 1]);
 			return false;
 		}
 
@@ -475,7 +480,7 @@ bool TheSecondPart(CommandParam& cmdPara, std::string data)
 #endif
 	}
 	else {
-		cmdPara._rtnError = _dprintf("返回码错误:%02X", data[0]);
+		cmdPara._rtnError = _dprintf("返回码错误:%02X", (byte)data[0]);
 		return false;
 	}
 

+ 1 - 0
Serail-Demo/Demo/stdafx.h

@@ -98,4 +98,5 @@ unsigned char TwoHexCharToInteger(char high, char low);
 std::string PackingCommand(CommandParam &cmdPara, std::string data, const int &dataLen);
 std::string BytesToHexString(const unsigned char *pbuffer, int nLen);
 std::string BytesToHexString(const unsigned char *pbuffer, int nLen, char chSpace);
+void ParseResultString(CommandParam& cmdPara, std::string data, const int& dataLen);
 // TODO: 在此处引用程序需要的其他头文件