线程函数***************************************************************************************
UINT CNewtestDlg::CommRecvTread(LPVOID lparam)
{
DWORD dwLength;
BYTE *recvBuf = new BYTE[1024];
CNewtestDlg *pCeSerial = (CNewtestDlg *)lparam; while(TRUE)
{ /* 等待线程退出事件 */
if (WaitForSingleObject(pCeSerial->m_ExitThreadEvent, 0) == WAIT_OBJECT_0)
break; if (pCeSerial->m_hComm != INVALID_HANDLE_VALUE)
{ /* 从串口读取数据 */
BOOL fReadState = ReadFile(pCeSerial->m_hComm, recvBuf, 1024, &dwLength, NULL);
if(!fReadState)
{
//MessageBox(_T("无法从串口读取数据!"));
}
else
{
if(dwLength != 0) /* 接收成功调用回调函数 */
int a=1;//pCeSerial->OnCommRecv(pCeSerial->m_UserParam, recvBuf, dwLength);
}
}
} delete[] recvBuf;
return 0;
}
初始化函数
****************************************************************************
m_hComm = INVALID_HANDLE_VALUE; /* 串口操作句柄无效 */
hRecvThread = NULL;
m_ExitThreadEvent = NULL; COMMTIMEOUTS CommTimeOuts; // 打开串口
m_hComm = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
if(m_hComm == INVALID_HANDLE_VALUE)
{
AfxMessageBox(_T("无法打开端口或端口已打开!请检查是否已被占用."));
return FALSE;
} GetCommState(m_hComm, &dcb); /* 读取串口的DCB */
dcb.BaudRate = 9600;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = TWOSTOPBITS;
dcb.fParity = FALSE; /* 禁止奇偶校验 */
dcb.fBinary = TRUE;/* if (bDTRShake == FALSE)
dcb.fDtrControl = 0;
else  */
dcb.fDtrControl = DTR_CONTROL_HANDSHAKE;/* if (bRTSShake == FALSE)
dcb.fRtsControl = 0;
else    */
dcb.fRtsControl = RTS_CONTROL_HANDSHAKE; dcb.fOutX = 0;
dcb.fInX = 0;
dcb.fTXContinueOnXoff = 0;

//设置状态参数
SetCommMask(m_hComm, EV_RXCHAR); /* 串口事件:接收到一个字符 */
SetupComm(m_hComm, 16384, 16384); /* 设置接收与发送的缓冲区大小 */
if(!SetCommState(m_hComm, &dcb)) /* 设置串口的DCB */
{
AfxMessageBox(_T("无法按当前参数配置端口,请检查参数!"));
//ClosePort();
return FALSE;
}

//设置超时参数
GetCommTimeouts(m_hComm, &CommTimeOuts);
CommTimeOuts.ReadIntervalTimeout = 100; /* 接收字符间最大时间间隔 */
CommTimeOuts.ReadTotalTimeoutMultiplier = 1;
CommTimeOuts.ReadTotalTimeoutConstant = 100; /* 读数据总超时常量 */
CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutConstant = 0;
if(!SetCommTimeouts(m_hComm, &CommTimeOuts))
{
AfxMessageBox(_T("无法设置超时参数!"));
//ClosePort();
return FALSE;
}

PurgeComm(m_hComm, PURGE_TXCLEAR | PURGE_RXCLEAR);  /* 清除收/发缓冲区 */

//m_UserParam = UserParam;  /* 传递用户参数 */ // 创建线程及句柄
//DWORD IDThread; /* 创建串口接收线程退出事件*/
m_ExitThreadEvent = CreateEvent(NULL, TRUE, FALSE, NULL); // 创建串口接收线程
hRecvThread  = AfxBeginThread(CommRecvTread, this);
if (hRecvThread == NULL) 
{
//ClosePort();
AfxMessageBox(_T("创建接收线程失败!"));
return FALSE;
}