我用MFC过程中,想异步实现COM口读数据CreateThread(NULL,0,GetComDate,this,0,NULL);DWORD WINAPI GetComDate(LPVOID Para)//获取数据
{
CCOM_CTLDlg  Temp = (CCOM_CTLDlg)Para;//错误,LPVOID不能转换为构造类

解决方案 »

  1.   

    CCOM_CTLDlg *Temp = (CCOM_CTLDlg *)Para;
    这样试一试
      

  2.   

    CCOM_CTLDlg* pTemp = (CCOM_CTLDlg*)Para;//
    要指针转换,传入的时候也要传地址或指针
      

  3.   

    我刚试了,确实可以,呵呵,感谢。。看来我的功底太差了。
    再问一个,COM口收发数据,为什么,我用异步方式,收得到东西,但发送数据时,就发送不了。
      

  4.   

    CCOM_CTLDlg  Temp = (CCOM_CTLDlg *)Para; //收数据
    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);
    } }}