我用MFC过程中,想异步实现COM口读数据CreateThread(NULL,0,GetComDate,this,0,NULL);DWORD WINAPI GetComDate(LPVOID Para)//获取数据
{
CCOM_CTLDlg Temp = (CCOM_CTLDlg)Para;//错误,LPVOID不能转换为构造类
}
{
CCOM_CTLDlg Temp = (CCOM_CTLDlg)Para;//错误,LPVOID不能转换为构造类
}
这样试一试
要指针转换,传入的时候也要传地址或指针
再问一个,COM口收发数据,为什么,我用异步方式,收得到东西,但发送数据时,就发送不了。
DWORD wCount;
wCount = 0;
int len = 90;
COMSTAT ComStat;
DWORD dwErrorFlags;
OVERLAPPED m_osRead;
m_osRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);//建立事件触发器
while(Temp.m_Run)//运行标志
{
memset(&m_osRead,0,sizeof(OVERLAPPED));//清除
memset(Temp.m_Recv,0,sizeof(Temp.m_Recv));
ClearCommError(Temp.hCOM,&dwErrorFlags,&ComStat); //清除COM错误信息
wCount=min(wCount,(DWORD)ComStat.cbInQue);
if(!ReadFile(Temp.hCOM,Temp.m_Recv,len,&wCount,&m_osRead))
{
if(GetLastError()==ERROR_IO_PENDING)
//GetLastError()函数返回ERROR_IO_PENDING,表明串口正在进行读操作
{
// WaitForSingleObject(m_osRead.hEvent,2000);
// GetOverlappedResult(Temp.hCOM,&m_osRead,&wCount,TRUE);
if(GetLastError()==ERROR_IO_PENDING)//等待读事件的结束
{
GetOverlappedResult(Temp.hCOM,&m_osRead,&wCount,TRUE);
} //使用WaitForSingleObject函数等待,直到读操作完成或延时已达到2秒钟
//当串口读操作进行完毕后,m_osRead的hEvent事件会变为有信号
// PurgeComm(Temp.hCOM, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
PurgeComm(Temp.hCOM,PURGE_RXCLEAR);
}
} if(wCount != 0)
{
Temp.strEdit = Temp.m_Recv;
Temp.m_RecvBox.AddString(Temp.strEdit);//显示数据
}
// }
// PurgeComm(Temp.hCOM, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
PurgeComm(Temp.hCOM,PURGE_RXCLEAR);
Sleep(10000);
}
return true;
}//发数据
void WriteCom(HANDLE hCom,char * buff,int length)
{
COMSTAT ComStat;
DWORD dwErrorFlags;
OVERLAPPED m_osWrite;// ClearCommError(hCom,&dwErrorFlags,&ComStat); //清除错误
PurgeComm(hCom,PURGE_TXCLEAR);//清除写入缓冲区
if(!WriteFile(hCom,buff,length,(LPDWORD)(&(length)),&m_osWrite))
{// WaitForSingleObject(m_osWrite.hEvent,1000);//等待写入命令结束
// AfxMessageBox(_T("写入命令失败!"));
} if(!WriteFile(hCom,buff,length,(LPDWORD)(&length),&m_osWrite))
{
if(GetLastError()==ERROR_IO_PENDING)
{
WaitForSingleObject(m_osWrite.hEvent,1000);
} }}