user-0 提问: windows串口api读串口 程序卡死，长时间会蓝屏，求教

回复:
user: user-1
content: 要用异步事件，参考http://www.vckbase.com/index.php/wv/1439.html  引用 楼主 TonyShengTan 的回复:想做个qt的串口数据波形显示，但串口读出来的数据有问题，会卡死（单片机不停的发数据） #include <stdio.h> #include<Windows.h> #include<iostream> #define MAXBLOCK 80  int main(){ 	HANDLE hCom;  //全局变量，串口句柄   	hCom=CreateFile("COM3",//COM1口       GENERIC_READ|GENERIC_WRITE, //允许读和写       0, //独占方式       NULL,       OPEN_EXISTING, //打开而不是创建       0, //同步方式       NULL);   	if(hCom==(HANDLE)-1){   		printf("串口无法打开\n"); 	}   	SetupComm(hCom,1024,1024); //输入缓冲区和输出缓冲区的大小都是1024     	COMMTIMEOUTS TimeOuts;   //设定读超时   	TimeOuts.ReadIntervalTimeout=1000;   	TimeOuts.ReadTotalTimeoutMultiplier=500;   	TimeOuts.ReadTotalTimeoutConstant=5000;   //设定写超时   	TimeOuts.WriteTotalTimeoutMultiplier=500;   	TimeOuts.WriteTotalTimeoutConstant=2000;   	SetCommTimeouts(hCom,&TimeOuts); //设置超时     	DCB dcb;   	GetCommState(hCom,&dcb);   	dcb.BaudRate=19200; //波特率为19200   	dcb.ByteSize=8; //每个字节有8位   	dcb.Parity=NOPARITY; //无奇偶校验位   	dcb.StopBits=ONESTOPBIT; //一个停止位   	SetCommState(hCom,&dcb);     	PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);   	unsigned char str[10];  	DWORD wCount;//读取的字节数   	BOOL bReadStat; 	int line=0; 	int total;  	while(1){ 		 		int i=0; 		bReadStat=ReadFile(hCom,str,10,&wCount,NULL);   		total=wCount; 		if(!bReadStat)  {   			printf("读串口失败!\n");        		} else{ 			while(wCount--){ 				printf("%d:%x\n",line++,str[i]); 				i++; 			}  		} 			PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);  		 	} } 奇怪的事情是，如果在运行这个程序之前运行一下串口调试助手，那么这个程序就能无限的读下去

user: user-2
content: 是不是还有没初始化到的地方  启动串口工具的时候 工具也会自己初始化一次  下面仅供参考 楼主好运   BOOL ComXXX::Initialize(CString comName, int nBaudRate) {  	// 初始化变量 	m_rSize = 0; 	memset(m_rBuf, 0, sizeof(m_rBuf));  	// 打开串口 	m_hCom = CreateFile(comName, 						GENERIC_READ | GENERIC_WRITE, 						0,    // Exclusive access  						NULL, // No security attributes  						OPEN_EXISTING, 						0,    // FILE_FLAG_OVERLAPPED 						NULL); 	if (m_hCom == INVALID_HANDLE_VALUE) { 		// 打开失败 		AfxMessageBox("打开失败"); 		return FALSE; 	}  	if(nBaudRate>0) { 		// 设置比特率 		m_nBaudRate = nBaudRate; 	}  	// 取得指定串口的当前状态 	DCB dcb; 	if(!GetCommState(m_hCom,(LPDCB)&dcb)) { 		return FALSE; 	}  	dcb.BaudRate = (DWORD)m_nBaudRate; 	dcb.ByteSize = 8; 	dcb.Parity = NOPARITY; 	dcb.StopBits = ONESTOPBIT; 	dcb.fBinary = 1;  	// 设置指定串口状态 	if(!SetCommState(m_hCom, &dcb)) { 		LPVOID lpMsgBuf; 		FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |  					  FORMAT_MESSAGE_FROM_SYSTEM |  					  FORMAT_MESSAGE_IGNORE_INSERTS, 					  NULL, 					  GetLastError(), 					  0,  					  (LPTSTR)&lpMsgBuf, 					  0, 					  NULL); 		MessageBox(NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION); 		LocalFree(lpMsgBuf); 		return FALSE; 	} 	 	// 设置超时 	COMMTIMEOUTS timeouts; 	timeouts.ReadIntervalTimeout			= MAXDWORD; // 读间隔超时 	timeouts.ReadTotalTimeoutMultiplier		= 0; // 读时间系数 	timeouts.ReadTotalTimeoutConstant		= 0; // 读时间常量 	timeouts.WriteTotalTimeoutMultiplier	= 0; // 写时间系数 	timeouts.WriteTotalTimeoutConstant		= 1500; // 写时间常量(1.5秒后写超时)  	if (!SetCommTimeouts(m_hCom, &timeouts)) { 		// 设置超时失败 		return FALSE; 	}  	// 设置串口读缓冲和写缓冲的大小 	SetupComm(m_hCom, 1024*4, 512*4);  	// 清空串口读写缓冲区 	PurgeComm(m_hCom, PURGE_RXCLEAR | PURGE_TXCLEAR);  	// 启动线程 	IsComStateOnFree= false; 	m_comThread = AfxBeginThread(CComIO::RecvHandler, this, THREAD_PRIORITY_HIGHEST); 	m_bExitFlag = FALSE;  	  	return TRUE; }