{
DWORD wnum = 0;
DWORD hnum = 0; //已寫入了字節
ASSERT(hc != INVALID_HANDLE_VALUE);
do
{
if(WriteFile(hc,buf + hnum,len - hnum, &wnum, NULL)) //阻塞在這裏,單步執行也不行,直到接收到數據時才執行到下壹步
{
hnum = hnum + wnum;
if(hnum == len)
{
break;
}
Sleep(10);
}
else
{
return FALSE;
}
} while (TRUE);
return TRUE;
}
DWORD CSeriesPort::ReadThreadFunc(LPVOID lp)
{
CSeriesPort* ps = (CSeriesPort*)lp;
DWORD evt;
BYTE* rbuf = NULL; //讀取的字節
DWORD rLen = 0; //實際讀取的字節
DWORD wLen;
DWORD rError;
COMSTAT cmstate;
ASSERT(ps->m_hComm != INVALID_HANDLE_VALUE);
PurgeComm(ps->m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR); //清空緩沖區
SetCommMask(ps->m_hComm, EV_RXCHAR | EV_CTS | EV_DSR);
while(TRUE)
{
if(WaitCommEvent(ps->m_hComm, &evt, 0))
{
SetCommMask(ps->m_hComm, EV_RXCHAR | EV_CTS | EV_DSR); //接收到數據時WriteFile才能繼續
//串口收到字符
if(evt & EV_RXCHAR)
{
ClearCommError(ps->m_hComm, &rError, &cmstate);
wLen = cmstate.cbInQue;
if(wLen <= 0)
{
continue;
}
rbuf = new BYTE[wLen];
memset(rbuf, '\0', wLen);
ReadFile(ps->m_hComm, rbuf, wLen, &rLen, 0);
if(rLen > 0) //觸發讀事件
{