一个串口类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的内容?
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的内容?
指针的地址和长度都知道了
if (ceSeries->m_OnSeriesRead)
{
ceSeries->m_OnSeriesRead(ceSeries->m_pOwner, readBuf, actualReadLen);
}
这个里面ceSeries->m_OnSeriesRead怎么解释?这是定义ONSERIESREAD m_OnSeriesRead,我这边调试看ceSeries->m_OnSeriesRead就算收到串口数据也是0,对回调函数实在是有点不明白. 而且在if里面那句话执行以后,我在对话框里面怎么知道readbuff里面有值了?
然后,打开串口。
这样,串口有读取就会呼叫你设置的回调函数。
然后做了这样的赋值m_OnSeriesRead = DataProcess;结果我的串口类里面的线程函数调用到一次回调函数之后就出了while循环, 是什么原因?