古詩詞大全網 - 成語用法 - 串口通訊程序為什麽WriteFile被阻塞

串口通訊程序為什麽WriteFile被阻塞

BOOL CSeriesPort::WritePort(HANDLE hc, const BYTE* buf, DWORD len)

{

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) //觸發讀事件

{