瀏覽代碼

新增成员变量.

sat23 4 年之前
父節點
當前提交
6d81650184
共有 3 個文件被更改,包括 42 次插入29 次删除
  1. 2 2
      Serail-Demo/Demo/Demo.cpp
  2. 30 27
      Serail-Demo/Demo/TCLCommand.cpp
  3. 10 0
      Serail-Demo/Demo/TCLCommand.h

+ 2 - 2
Serail-Demo/Demo/Demo.cpp

@@ -32,7 +32,7 @@ int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
 		// TODO: 在此处为应用程序的行为编写代码。
 #if 0
 		TCLCommand tcl(true);
-		if (tcl.Open(23, _T("baud=115200 parity=N data=8 stop=1")) )
+		if (tcl.Open(21, _T("baud=115200 parity=N data=8 stop=1")) )
 		{
 			tcl.SetTimeouts();
 			std::vector<CommandParam> vtCommandParams;
@@ -60,7 +60,7 @@ int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
 		}
 #else
 		TCLCommand tcl(false);
-		if ( tcl.Open(23, _T("baud=115200 parity=N data=8 stop=1") ) )
+		if ( tcl.Open(21, _T("baud=115200 parity=N data=8 stop=1") ) )
 		{
 			tcl.SetTimeouts();
 			std::vector<CommandParam> vtCommandParams;

+ 30 - 27
Serail-Demo/Demo/TCLCommand.cpp

@@ -166,36 +166,40 @@ EXIT:
 	return ret;
 }
 
+int TCLCommand::parse_cmd_from_string(std::string str, std::vector<CommandParam>& vtCommandParams)
+{
+	return 0;
+}
+
 bool TCLCommand::TheFirstPart(CommandParam& cmdPara, std::string data)
 {
 	if (data.size() == NoneOptLen) {
 		if ((byte)data[0] == cmdPara._rtnCode) {
 			// 长度;
-			int nPackageLen = (byte)data[1];
-			if (nPackageLen != NoneOptLen) {
-				cmdPara._rtnError = utils::_dprintf("长度错误:%ld", (byte)data[1]);
+			int nPacketLen = (byte)data[1];
+			if (nPacketLen != NoneOptLen) {
+				cmdPara._rtnError = utils::_dprintf("[%s] 返回数据长度错误:%ld", __FUNCTION__, (byte)data[1]);
 				return false;
 			}
 
 			// 执行状态;
 			cmdPara._rtnStatus = (byte)data[2];
-			utils::_dprintf(_T("rtnStatus=%02X"), cmdPara._rtnStatus);
+			//utils::_dprintf(_T("[%s] rtnStatus=%02X"), __FUNCTION__, cmdPara._rtnStatus);
 
 			// 校验crc;
-			unsigned short usCRCValue = utils::CRC16Calculate((byte*)data.data(), nPackageLen - 2);
-			if (((usCRCValue >> 8) & 0xFF) != (byte)data[nPackageLen - 2] || (usCRCValue & 0xFF) != (byte)data[nPackageLen - 1])
-			{
-				cmdPara._rtnError = utils::_dprintf("CRC校验错误:计算[%02% %02X] != 接收[%02X %02X]", (usCRCValue >> 8) & 0xFF, usCRCValue & 0xFF, (byte)data[nPackageLen - 2], (byte)data[nPackageLen - 1]);
+			unsigned short usCRCValue = utils::CRC16Calculate((byte*)data.data(), nPacketLen - 2);
+			if (((usCRCValue >> 8) & 0xFF) != (byte)data[nPacketLen - 2] || (usCRCValue & 0xFF) != (byte)data[nPacketLen - 1]) {
+				cmdPara._rtnError = utils::_dprintf("[%s] CRC校验错误:计算[%02% %02X] != 接收[%02X %02X]", __FUNCTION__, (usCRCValue >> 8) & 0xFF, usCRCValue & 0xFF, (byte)data[nPacketLen - 2], (byte)data[nPacketLen - 1]);
 				return false;
 			}
 		}
 		else {
-			cmdPara._rtnError = utils::_dprintf("返回码错误:%02X", (byte)data[0]);
+			cmdPara._rtnError = utils::_dprintf("[%s] 返回码错误:%02X", __FUNCTION__, (byte)data[0]);
 			return false;
 		}
 	}
 	else {
-		cmdPara._rtnError = utils::_dprintf("长度对不上:Option.None");
+		cmdPara._rtnError = utils::_dprintf("[%s] 返回数据长度错误", __FUNCTION__);
 		return false;
 	}
 
@@ -207,21 +211,21 @@ bool TCLCommand::TheSecondPart(CommandParam& cmdPara, std::string data)
 	// 数据起始位;
 	int nDataPos = 0;
 	// 数据包长度;
-	int nPackageLen = 0;
+	int nPacketLen = 0;
 	if ((byte)data[0] == cmdPara._rtnCode) {
 		// 获取长度;
 		if ((byte)data[1] == 0xFE) {
 			nDataPos = 4;
-			nPackageLen = (byte)data[2] << 8 | (byte)data[3];
+			nPacketLen = (byte)data[2] << 8 | (byte)data[3];
 			if (data.size() < 255 && data[2] != 0) {
-				cmdPara._rtnError = utils::_dprintf(_T("长度异常"));
+				cmdPara._rtnError = utils::_dprintf(_T("[%s] 返回数据长度异常"), __FUNCTION__);
 				return false;
 			}
 		}
 		else
 		{
 			nDataPos = 2;
-			nPackageLen = (byte)data[1];
+			nPacketLen = (byte)data[1];
 #if 0 // 如果数据包含有非协议包内的数据,会判断异常;
 			if (data.size() > 255) {
 				//nPackageLen = data[1] << 8 | data[2];
@@ -238,7 +242,7 @@ bool TCLCommand::TheSecondPart(CommandParam& cmdPara, std::string data)
 #endif
 
 		if (_tcsicmp(cmdPara.code.c_str(), utils::ByteToChars((byte)data[nDataPos] - 1).c_str()) != 0) {
-			cmdPara._rtnError = utils::_dprintf(_T("返回的指令错误, %s, %02X"), cmdPara.head.c_str(), (byte)data[nDataPos]);
+			cmdPara._rtnError = utils::_dprintf(_T("[%s] 返回的指令错误, %s, %02X"), __FUNCTION__, cmdPara.head.c_str(), (byte)data[nDataPos]);
 			return false;
 		}
 
@@ -246,31 +250,29 @@ bool TCLCommand::TheSecondPart(CommandParam& cmdPara, std::string data)
 		++nDataPos;// 返回码占一字节;
 		if (cmdPara.bMulticode) {
 			if (_tcsicmp(cmdPara.param.c_str(), utils::ByteToChars((byte)data[nDataPos]).c_str()) != 0) {
-				cmdPara._rtnError = utils::_dprintf(_T("返回的指令参数错误, %s, %02X"), cmdPara.param.c_str(), (byte)data[nDataPos]);
+				cmdPara._rtnError = utils::_dprintf(_T("[%s] 返回的指令参数错误, %s, %02X"), __FUNCTION__, cmdPara.param.c_str(), (byte)data[nDataPos]);
 				return false;
 			}
 
 			++nDataPos;// 指令参数码占一字节;
 		}
 
-		cmdPara._rtnData = data.substr(nDataPos, nPackageLen - nDataPos - 2); //2 = crc;
+		cmdPara._rtnData = data.substr(nDataPos, nPacketLen - nDataPos - 2); //2 = crc;
 		utils::_dprintf(_T("rtnData=%s"), utils::BytesToHexString((byte*)cmdPara._rtnData.c_str(), cmdPara._rtnData.size(), ' ').c_str());
 
 		// 校验crc;
-		unsigned short usCRCValue = utils::CRC16Calculate((byte*)data.data(), nPackageLen - 2);
-		if (((usCRCValue >> 8) & 0xFF) != (byte)data[nPackageLen - 2] || (usCRCValue & 0xFF) != (byte)data[nPackageLen - 1])
+		unsigned short usCRCValue = utils::CRC16Calculate((byte*)data.data(), nPacketLen - 2);
+		if (((usCRCValue >> 8) & 0xFF) != (byte)data[nPacketLen - 2] || (usCRCValue & 0xFF) != (byte)data[nPacketLen - 1])
 		{
-			cmdPara._rtnError = utils::_dprintf("CRC校验错误:计算[%02X %02X] != 接收[%02X %02X]", (usCRCValue >> 8) & 0xFF, usCRCValue & 0xFF, (byte)data[nPackageLen - 2], (byte)data[nPackageLen - 1]);
+			cmdPara._rtnError = utils::_dprintf("[%s] CRC校验错误:计算[%02X %02X] != 接收[%02X %02X]", __FUNCTION__, (usCRCValue >> 8) & 0xFF, usCRCValue & 0xFF, (byte)data[nPacketLen - 2], (byte)data[nPacketLen - 1]);
 			return false;
 		}
 
-#if 1
-		if (data.size() > nPackageLen)
-			utils::_dprintf("带有脏数据:%s", data.substr(nPackageLen));
-#endif
+		if (data.size() > nPacketLen)
+			utils::_dprintf("[%s] 带有脏数据:%s", __FUNCTION__, data.substr(nPacketLen));
 	}
 	else {
-		cmdPara._rtnError = utils::_dprintf("返回码错误:%02X", (byte)data[0]);
+		cmdPara._rtnError = utils::_dprintf("[%s] 返回码错误:%02X", __FUNCTION__, (byte)data[0]);
 		return false;
 	}
 
@@ -329,7 +331,8 @@ std::string TCLCommand::PackingCommand(CommandParam& cmdPara, std::string data,
 	szcrc[1] = usCRCValue & 0xFF;
 	command.append((char*)szcrc, 2);
 
-	utils::_dprintf(_T("指令:%s"), utils::BytesToHexString((byte*)command.c_str(), command.size(), ' ').c_str());
+	cmdPara._cmdContext = utils::BytesToHexString((byte*)command.c_str(), command.size(), ' ');
+	utils::_dprintf(_T("指令:%s"), cmdPara._cmdContext.c_str());
 
 	return command;
 }
@@ -341,7 +344,7 @@ void TCLCommand::ParseResultString(CommandParam& cmdPara, std::string data, cons
 		return;
 
 	if (cmdPara._rtnStatus != 0x0A) {
-		utils::_dprintf("执行结果错误:%02X", cmdPara._rtnStatus);
+		utils::_dprintf("[%s] 执行结果错误:%02X", __FUNCTION__, cmdPara._rtnStatus);
 		return;
 	}
 

+ 10 - 0
Serail-Demo/Demo/TCLCommand.h

@@ -26,6 +26,8 @@ typedef struct __CMDPARAM__ {
 	byte _rtnStatus;
 	std::string _rtnData;
 	std::string _rtnError;
+	std::string _rtnContext;
+	std::string _cmdContext;
 	void UpdateRtnCode()
 	{
 		if (!_tcsicmp(_T("AA"), head.c_str())) { // 调试用命令代码引导码;
@@ -65,6 +67,10 @@ typedef struct __CMDPARAM__ {
 
 class TCLCommand :public CBaseSerial
 {
+	// 内部-低优先查找;
+	std::vector<CommandParam> m_vtInternalCMDParams;
+	// 外部-高优先查找;
+	std::vector<CommandParam> m_vtExternalCMDParams;
 public:
 	TCLCommand(bool bSync = true);
 	~TCLCommand(void);
@@ -73,9 +79,13 @@ public:
 	int pares_time_value(std::string strTime);
 	bool parse_pair_key(std::string& RetValue, std::string strLine, TCHAR* lpszText);
 	int parse_cmd_param_from_file(TCHAR* file_name, std::vector<CommandParam>& vtCommandParams);
+	int parse_cmd_from_string(std::string str, std::vector<CommandParam>& vtCommandParams);
 
 	bool TheFirstPart(CommandParam& cmdPara, std::string data);
 	bool TheSecondPart(CommandParam& cmdPara, std::string data);
 	std::string PackingCommand(CommandParam& cmdPara, std::string data, const int& dataLen);
 	void ParseResultString(CommandParam& cmdPara, std::string data, const int& dataLen);
+
+public:
+
 };