790
社区成员
发帖
与我相关
我的任务
分享
//设置端口上指定信号的状态
// SETDTR: 发送DTR (data-terminal-ready)信号
// SETRTS: 发送RTS (request-to-send)信号
EscapeCommFunction (m_hComm, SETDTR);
EscapeCommFunction (m_hComm, SETRTS);
//创建串口读数据监听线程
m_hReadThread = CreateThread(NULL,0,ReadThreadFunc,this,0,&m_dwReadThreadID);
//下面是线程中的程序.
CCESeries *ceSeries = (CCESeries*)lparam; //带进来的实例,也就是ceSeries->m_hComm就是COM口句柄.
DWORD evtMask;
BYTE * readBuf = NULL;//读取的字节
DWORD actualReadLen=0;//实际读取的字节数
DWORD willReadLen;
DWORD dwReadErrors;
COMSTAT cmState;
OVERLAPPED ovread ; //Windows CE不支持Windows下常用的串行通信重叠I/O方式(OVERLAPPED)
//http://www.yctek.com/2009/0114/19.html
// 清空缓冲,并检查串口是否打开。
ASSERT(ceSeries->m_hComm !=INVALID_HANDLE_VALUE);
//清空串口
//PurgeComm(ceSeries->m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR );
PurgeComm(ceSeries->m_hComm,PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR
| PURGE_RXCLEAR );
SetCommMask (ceSeries->m_hComm, EV_RXCHAR );//| EV_CTS | EV_DSR ); //设置事件掩模来监视指定通信端口上的事件
//memset( &ovread, 0x00, sizeof(OVERLAPPED) ) ;
//ovread.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL) ;
while (TRUE)
{
PurgeComm(ceSeries->m_hComm,PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR| PURGE_RXCLEAR );
SetCommMask (ceSeries->m_hComm, EV_RXCHAR );
//if (WaitCommEvent(ceSeries->m_hComm,&evtMask,&ovread)) //不知为什么这个执行不成功,所以去除了.
//if (WaitCommEvent(ceSeries->m_hComm,&evtMask,0))
//{
WaitCommEvent(ceSeries->m_hComm,&evtMask,0); //只好直接执行啦.根本就不会返回EV_RXCHAR 事件
//SetCommMask (ceSeries->m_hComm, EV_RXCHAR | EV_CTS | EV_DSR );
//表示串口收到字符
//if (evtMask & EV_RXCHAR) //根本就不会返回EV_RXCHAR 事件,所以也就只好去掉啦.....
//{
ClearCommError(ceSeries->m_hComm,&dwReadErrors,&cmState);
willReadLen = cmState.cbInQue ; //奇怪的是这里有数据噢......有数据,那就去读吧.....
if (willReadLen <= 0)
{
continue;
}
willReadLen=willReadLen>1024 ? 1024 : willReadLen;
//分配内存
readBuf = new BYTE[willReadLen];
ZeroMemory(readBuf,willReadLen); //填充内存
//读取串口数据
ReadFile(ceSeries->m_hComm, readBuf, willReadLen, &actualReadLen,0); //这里竟能读到噢..困惑呀....
//如果读取的数据大于0,
if (actualReadLen>0)
{
//触发读取回调函数
if (ceSeries->m_OnSeriesRead)
{
ceSeries->m_OnSeriesRead(ceSeries->m_pOwner,readBuf,actualReadLen);
}
}
//释放内存
delete[] readBuf;
readBuf = NULL;
//}
/*}
else
{
int oooerr= GetLastError();
DWORD dwErrors;
COMSTAT comStat;
memset(&comStat,0,sizeof(comStat));
ClearCommError(ceSeries->m_hComm,&dwErrors,&comStat);
continue;
}*/
//如果收到读线程退出信号,则退出线程
if (WaitForSingleObject(ceSeries->m_hReadCloseEvent,500) == WAIT_OBJECT_0)
{
break;
}
}
return 0;