一个串口类CSerial里面定义了这么一个回调函数
typedef void (CALLBACK* ONSERIESREAD)(void* pOwner, /*父对象指针*/
BYTE* buf, /*接收到的缓冲区*/
DWORD dwBufLen);/*接收到的缓冲区长度*/
然后在这个类里面有一个如下的接受线程
CCESeries::ReadThreadFunc(LPVOID lparam)
{
    CCESeries *ceSeries = (CCESeries *)lparam;
    DWORD evtMask;
    BYTE *readBuf = NULL; //读取的字节n
    DWORD actualReadLen = 0; //实际读取的字节数
    DWORD willReadLen;
    DWORD dwReadErrors;
    COMSTAT cmState;
    // 清空缓冲,并检查串口是否打开。
    ASSERT(ceSeries->m_hComm != INVALID_HANDLE_VALUE);
    //清空串口
    PurgeComm(ceSeries->m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR );
    SetCommMask (ceSeries->m_hComm, EV_RXCHAR | EV_CTS | EV_DSR );
    while (TRUE)
    {
int re = WaitCommEvent(ceSeries->m_hComm, &evtMask, 0);
        if (re)
        {
            SetCommMask (ceSeries->m_hComm, EV_RXCHAR | EV_CTS | EV_DSR );
            //表示串口收到字符
            Sleep(200);
            if (evtMask & EV_RXCHAR)
            {
                ClearCommError(ceSeries->m_hComm, &dwReadErrors, &cmState);
                willReadLen = cmState.cbInQue ;
                if (willReadLen <= 0)
                {
                    continue;
                }
                //分配内存
                readBuf = new BYTE[willReadLen];
                ZeroMemory(readBuf, willReadLen);
                //读取串口数据
                ReadFile(ceSeries->m_hComm, readBuf, willReadLen, &actualReadLen, 0);
                //如果读取的数据大于,
                if (actualReadLen > 0)
                {
                    //触发读取回调函数
                    if (ceSeries->m_OnSeriesRead)
                    {
                        ceSeries->m_OnSeriesRead(ceSeries->m_pOwner, readBuf, actualReadLen);
                    }
                }
                //释放内存
                delete[] readBuf;
                readBuf = NULL;
            }
        }
        //如果收到读线程退出信号,则退出线程
        if (WaitForSingleObject(ceSeries->m_hReadCloseEvent, 500) == WAIT_OBJECT_0)
        {
            break;
        }
    }
    return 0;
}
我在我的对话框里面实例化了一个这个类的对象,这个类里面接收线程里面"ceSeries->m_OnSeriesRead(ceSeries->m_pOwner, readBuf, actualReadLen);"这句我在我的对话框里面要怎么去接受readbuff的内容?

解决方案 »

  1.   

    直接操作readBuf啊
    指针的地址和长度都知道了
      

  2.   

    //触发读取回调函数
                        if (ceSeries->m_OnSeriesRead)
                        {
                            ceSeries->m_OnSeriesRead(ceSeries->m_pOwner, readBuf, actualReadLen);
                        }
    这个里面ceSeries->m_OnSeriesRead怎么解释?这是定义ONSERIESREAD m_OnSeriesRead,我这边调试看ceSeries->m_OnSeriesRead就算收到串口数据也是0,对回调函数实在是有点不明白. 而且在if里面那句话执行以后,我在对话框里面怎么知道readbuff里面有值了?
      

  3.   

    在你初始化 ceSeries 的时候,设置一个静态的回调函数给 m_OnSeriesRead。
    然后,打开串口。
    这样,串口有读取就会呼叫你设置的回调函数。
      

  4.   

    我在我的主对话框里面定义了"static  void DataProcess(void* pOwner, BYTE* buf,  DWORD dwBufLen);"
    然后做了这样的赋值m_OnSeriesRead = DataProcess;结果我的串口类里面的线程函数调用到一次回调函数之后就出了while循环, 是什么原因?
      

  5.   

    我在主对话框里面没有给m_OnSeriesRead 这个赋值,串口收到数据就从int re = WaitCommEvent(ceSeries->m_hComm, &evtMask, &ol);这句往下执行, 一旦给m_OnSeriesRead赋值,线程就一直在这句等待!