Bladeren bron

异步串口实现读写。

Jeff 4 jaren geleden
bovenliggende
commit
b024968e5e
3 gewijzigde bestanden met toevoegingen van 59 en 11 verwijderingen
  1. 46 3
      TestWizard/TestWizard/SynSerial.cpp
  2. 1 1
      TestWizard/TestWizard/SynSerial.h
  3. 12 7
      TestWizard/TestWizard/TestWizard.cpp

+ 46 - 3
TestWizard/TestWizard/SynSerial.cpp

@@ -8,6 +8,13 @@ CSynSerial::CSynSerial(void) :m_hSerialPort(NULL)
 	memset(&m_dcb, 0, sizeof(DCB));
 	memset(&m_cts, 0, sizeof(COMMTIMEOUTS));
 	memset(&m_szSerialPort, 0, sizeof(TCHAR)*MAX_PORT_LEN);
+
+	// 初始化重叠对象;
+	ZeroMemory(&m_wrOverlapped,sizeof(m_wrOverlapped));
+	if (m_wrOverlapped.hEvent != NULL) {
+		ResetEvent(m_wrOverlapped.hEvent);
+		m_wrOverlapped.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
+	}
 }
 
 CSynSerial::~CSynSerial(void)
@@ -21,7 +28,7 @@ BOOL CSynSerial::OpenSerialPort(IN CONST BYTE & byCommPort, IN CONST DWORD & dwB
 	CloseSerialPort();
 
 	_stprintf_s(m_szSerialPort, _T("\\\\.\\com%d"), (int)byCommPort);
-	m_hSerialPort = CreateFile(m_szSerialPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, NULL, NULL);
+	m_hSerialPort = CreateFile(m_szSerialPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
 	if (m_hSerialPort == INVALID_HANDLE_VALUE)
 	{
 		// 打开串口失败;
@@ -119,7 +126,7 @@ BOOL CSynSerial::ReOpenSerialPort()
 	ASSERT(_tcslen(m_szSerialPort));
 	CloseSerialPort();
 
-	m_hSerialPort = CreateFile(m_szSerialPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, NULL, NULL);
+	m_hSerialPort = CreateFile(m_szSerialPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
 	if (m_hSerialPort == INVALID_HANDLE_VALUE)
 	{
 		// 打开串口失败;
@@ -266,9 +273,25 @@ DWORD CSynSerial::WriteComm(IN BYTE * pWirteBuf, IN CONST INT32 nWriteSize)
 	ClearCommError(m_hSerialPort, &dwErrorFlags, &ComStat);	
 	// 写前,清空缓存区;
 	PurgeComm(m_hSerialPort, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
-	if ( !WriteFile(m_hSerialPort, pWirteBuf, nWriteSize, &dwBytesWritten, NULL) )
+	if ( !WriteFile(m_hSerialPort, pWirteBuf, nWriteSize, &dwBytesWritten, &m_wrOverlapped) )
 	{
 		DWORD dwError = GetLastError();
+		if ( ERROR_IO_PENDING == GetLastError() )
+		{
+			while(!GetOverlappedResult(m_hSerialPort, &m_wrOverlapped, &dwBytesWritten, FALSE)){
+				dwError = GetLastError();
+				if ( ERROR_IO_PENDING == dwError || dwError == ERROR_IO_INCOMPLETE ) {
+					printf("等待\n");
+					continue;
+				}
+				else {
+					// 发生错误;
+					printf("发生错误:%d\n", dwError);
+					ClearCommError(m_hSerialPort, &dwError, NULL);
+					break;
+				}
+			}
+		}
 	}	
 
 	// 返回写入字节数;
@@ -285,8 +308,10 @@ DWORD CSynSerial::ReadComm(IN BYTE *pReadBuf, IN CONST DWORD& dwReadSize, WORD t
 		return 0;
 	}
 
+	DWORD dwError = 0;
 	DWORD dwBytesRead = 0;
 	DWORD dwErrorFlags = 0;
+#if 0
 	// ReadFile前,使用ClearCommError清除错误;
 	COMSTAT ComStat = {0};
 	DWORD dwLastLen = 0;
@@ -320,6 +345,24 @@ DWORD CSynSerial::ReadComm(IN BYTE *pReadBuf, IN CONST DWORD& dwReadSize, WORD t
 	{
 		return (INT)dwBytesRead;
 	}
+#else
+	DWORD dwRealRead;
+	if ( !ClearCommError(m_hSerialPort, &dwError, NULL) ) {
+		PurgeComm(m_hSerialPort, PURGE_TXABORT|PURGE_TXCLEAR);
+	}
+
+	if ( !ReadFile(m_hSerialPort, pReadBuf, dwReadSize, &dwRealRead, &m_wrOverlapped) ) {
+		if ( GetLastError() == ERROR_IO_PENDING ) {
+			while(!GetOverlappedResult(m_hSerialPort, &m_wrOverlapped, &dwRealRead, FALSE)){
+				dwError = GetLastError();
+				printf("\t 码值=%d, 长度=%d, 内容=%s \n\n", dwError, dwRealRead, pReadBuf);
+			}
+		}
+	}
+
+	pReadBuf[dwRealRead] = '\0';
+	printf("\t ======长度=%d, 内容=%s \n\n", dwRealRead, pReadBuf);
+#endif
 
 	return dwBytesRead;
 }

+ 1 - 1
TestWizard/TestWizard/SynSerial.h

@@ -33,7 +33,7 @@ private:
 	DCB		m_dcb;
 	HANDLE	m_hSerialPort;
 	COMMTIMEOUTS	m_cts;
-
+	OVERLAPPED		m_wrOverlapped;
 	// ´®¿ÚºÅ(1~255);
 	TCHAR	m_szSerialPort[MAX_PORT_LEN];
 	// ÊäÈ뻺´æ´óС(byte);

+ 12 - 7
TestWizard/TestWizard/TestWizard.cpp

@@ -46,12 +46,12 @@ int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
 	}
 	else
 	{
-#if 0
+#if 1
 		std::string a = tolower("FFDFDFfdfdfdDDA");
 		// TODO: 在此处为应用程序的行为编写代码。
-		if ( OpenDevice(16, 115200, 8, 0, 0) )
+		if ( OpenDevice(6, 115200, 8, 0, 0) )
 		{
-			//OpenXML("D:\\SAT\\resource\\RCU\\TW\\demo.xml");
+			OpenXML("D:\\SAT\\resource\\RCU\\TW\\demo.xml");
 			//std::string data = GetSignalsName();
 			
 			int time = 200;
@@ -59,7 +59,12 @@ int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
 			//Sleep(time);
 			//SendKey("SETTING");
 			//Sleep(time);
-			//SendKey("OK");
+			for (int i = 0; i < 200; i++ )
+			{
+				SendKey("OK");
+				printf("---------------------------------\n");
+				Sleep(1000);
+			}
 			//Sleep(time);
 			//SendKey("DOWN");
 			//Sleep(time);
@@ -71,18 +76,18 @@ int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
 			//Sleep(time);
 			//SendKey("RIGHT");
 			//Sleep(time);
-			SendCmd("*INPUT BLEKEY 07004F");
+			/*SendCmd("*INPUT BLEKEY 07004F");
 			SendCmd("*INPUT BLEKEY 07004F");
 			Sleep(time);
 			SendCmd("*INPUT BLEKEY 070050");
 			Sleep(time);
-			SendCmd("*INPUT BLEKEY 0C0223");
+			SendCmd("*INPUT BLEKEY 0C0223");*/
 			Sleep(time);
 			CloseDevice();
 		}
 #endif
 
-#if 1
+#if 0
 		if ( OpenUsbSwitch(5, 115200, 8, 0, 0) )
 		{
 			SendSwitch(0);