请教大家一个关于串口多线程的问题:如何正确关闭线程和串口,请大家帮我看下我代码那里出了问题,谢谢
请教大家一个关于串口多线程的问题:如何正确关闭线程和串口,请大家帮我看下我代码那里出了问题,谢谢
开发环境:VC6.0
要求:用api写一个关于串口的多线程程序
我的问题:我关闭后,再打开,就会程序运行占用整个CPU吧,使用不了电脑的其他地方了
代码如下:
打开线程按钮函数:
hCom=CreateFile(_T("COM3"),//COM1口
GENERIC_READ|GENERIC_WRITE, //允许读和写
0, //独占方式
NULL,
OPEN_EXISTING, //打开而不是创建
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, //重叠方式
NULL);
if(hCom==(HANDLE)-1)
{
AfxMessageBox(_T("打开COM7失败!"));
return FALSE;
}
SetupComm(hCom,1024,1024); //输入缓冲区和输出缓冲区的大小都是1024
COMMTIMEOUTS TimeOuts;
//设定读超时
TimeOuts.ReadIntervalTimeout=MAXDWORD;
TimeOuts.ReadTotalTimeoutMultiplier=0;
TimeOuts.ReadTotalTimeoutConstant=0;
//在读一次输入缓冲区的内容后读操作就立即返回,
//而不管是否读入了要求的字符。
//设定写超时
TimeOuts.WriteTotalTimeoutMultiplier=100;
TimeOuts.WriteTotalTimeoutConstant=3000;
SetCommTimeouts(hCom,&TimeOuts); //设置超时
DCB dcb;
GetCommState(hCom,&dcb);
dcb.BaudRate=9600; //波特率为9600
dcb.ByteSize=8; //每个字节有8位
dcb.Parity=NOPARITY; //无奇偶校验位
dcb.StopBits=ONESTOPBIT; //1个停止位
SetCommState(hCom,&dcb);
PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
//CWinThread *rxThread = AfxBeginThread(ReceiveDataThread, this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED, NULL); // 创建并挂起线程
rxThread = AfxBeginThread(ReceiveDataThread, this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED, NULL); // 创建并挂起线程
if(rxThread==NULL)
{
CloseHandle(hCom);
return false;
}
else
{
rxThread->ResumeThread(); // 恢复线程运行
}
//OVERLAPPED m_osRead;
memset(&m_osRead,0,sizeof(OVERLAPPED));
m_osRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
memset(&m_osWrite,0,sizeof(OVERLAPPED));
m_osWrite.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
SetTimer(SEND_DATA_BY_TIMER,1000,NULL);
return true;
关闭线程按钮函数
KillTimer(SEND_DATA_BY_TIMER);
if (rxThread != NULL)
{
SetEvent(m_osWrite.hEvent); /* 通知串口接收线程退出 */
CloseHandle(m_osWrite.hEvent);
SetEvent(m_osRead.hEvent); /* 通知串口接收线程退出 */
WaitForSingleObject(rxThread, 500); /* 等待线程退出 */
//CloseHandle(rxThread); /* 关闭接收线程句柄 */
CloseHandle(m_osRead.hEvent); /* 关闭线程退出事件句柄 */
rxThread = NULL;
}
if (hCom != INVALID_HANDLE_VALUE)
{
SetCommMask(hCom, 0);
PurgeComm(hCom, PURGE_TXCLEAR | PURGE_RXCLEAR); /* 清除收/发缓冲 */
CloseHandle(hCom); /* 关闭串口操作句柄 */
hCom = INVALID_HANDLE_VALUE;
}
return;
另外的函数:
1。发送数据函数:
char lpOutBuffer[7];
memset(lpOutBuffer,'\0',7);
lpOutBuffer[0]='0';
lpOutBuffer[1]='1';
lpOutBuffer[2]='2';
lpOutBuffer[3]='3';
lpOutBuffer[4]='4';
lpOutBuffer[5]='5';
lpOutBuffer[6]='6';
DWORD dwBytesWrite=7;
COMSTAT ComStat;
DWORD dwErrorFlags;
BOOL bWriteStat;
ClearCommError(hCom,&dwErrorFlags,&ComStat);
bWriteStat=WriteFile(hCom,lpOutBuffer,
dwBytesWrite,& dwBytesWrite,&m_osWrite);
if(!bWriteStat)
{
if(GetLastError()==ERROR_IO_PENDING)
{
WaitForSingleObject(m_osWrite.hEvent,1000);
}
}
2。 定时器函数:定时发送 “1。发送数据函数”
---------------------------------------------------------
我的问题是,点击打开线程按钮函后,收发数据正常;
现在关闭串口线程,正常;
再点打开线程函数,感觉程序占用了整个CPU,用不了电脑的任何地方,只能重启机器,任务管理器都使用不了。
估计是关闭线程函数有问题?大家帮帮忙!!!