串口 被阻塞

场景:串口通信程序为什么WriteFile被阻塞

串口通讯程序为什么WriteFile被阻塞?
环境:VS2008 MFC 单文档 Formview 
问题:使用串口实现蓝牙通讯,现在能打开端口,并正常接收数据。现在的问题是要发送数据时程序阻塞在WriteFile这里,当再次接收到数据时WriteFile才完成,不知道这是为什么?

C/C++ code

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)        //触发读事件
                {
                    ps->m_onSeriesRead(ps->m_owner, rbuf, rLen);
                }
            }
        }

        //收到读线程退出信号,退出线程
        if(WaitForSingleObject(ps->m_readCloseEvent, 50) == WAIT_OBJECT_0)
        {
            break;
        }
    }

    return 0;
}



------解决方案--------------------
串口也有同步和异步,是不是设置的不对?
------解决方案--------------------
你把接收线程关了看看能不能发送数据,感觉能发送数据.如果确实是这样,你就看看是不是因为接收线程里的光设读取属性了,把发送属性给关了.你查下有没有发送属性,就象EV_RXCHAR这个属性,如果有,你把发送属性也设上.
你把这句:SetCommMask(ps->m_hComm, EV_RXCHAR | EV_CTS | EV_DSR);改成这样试试:
SetCommMask(ps->m_hComm, EV_RXCHAR); //接收到数据时WriteFile才能继续
CTS和DSR不要了,会不会这是两个中的一个属性不让发了