串口寫入和讀取數據


SerialPort類

WriteComm 寫串口函數

DWORD CSerialPort::WriteComm(char *buf, DWORD dwLength)
{
    if(!IsOpen())
    {
        return 0;
    }
    assert(buf != NULL);

    COMSTAT comStat;
    DWORD dwErrorFlags;
    if (!ClearCommError(m_hCom, &dwErrorFlags, &comStat) && dwErrorFlags > 0)
    {
        PurgeComm(m_hCom, PURGE_TXABORT | PURGE_TXCLEAR);
    }

    OVERLAPPED osWrite;
    memset(&osWrite, 0, sizeof(OVERLAPPED));
    osWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

    BOOL bWriteStat = WriteFile(m_hCom, buf, dwLength, &dwLength, &osWrite);
    if(!bWriteStat)
    {
        if(GetLastError() == ERROR_IO_PENDING)
        {
            WaitForSingleObject(osWrite.hEvent, 2000);
        }
        else
        {
            dwLength = 0;
        }
    }
    return dwLength;
}

調用

     char buf[10];  //字符數組 將字符串通過 strcpy 放入字符數組再向串口寫入
     strcpy(buf,"1234");   
     m_SerialPort.WriteComm(buf,4);
     MessageBox(_T("1234"));
     buf[0]=0x61;     //將要發送的字符串或十六進制數據儲存在char型字符數組中,利用WriteComm發送到串口
     m_SerialPort.WriteComm(buf,1);

 

ReadComm

DWORD CSerialPort::ReadComm(char *buf, DWORD dwLength)
{
    if(!IsOpen())
    {
        return 0;
    }
    buf[0] = '\0';

    COMSTAT comStat;
    DWORD dwErrorFlags;
    if (!ClearCommError(m_hCom, &dwErrorFlags, &comStat) && dwErrorFlags > 0)
    {
        PurgeComm(m_hCom, PURGE_RXABORT | PURGE_RXCLEAR);
        return 0;
    }
    if(comStat.cbInQue == 0)
    {
        return 0;
    }
    DWORD dwBytesRead=0;
    BOOL bReadStat;

    dwBytesRead = min(dwLength - 1, (DWORD)comStat.cbInQue);

    OVERLAPPED osRead;
    memset(&osRead,0,sizeof(OVERLAPPED));
    osRead.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);

    DWORD dwByteOfRead = 0;
    bReadStat = ReadFile(m_hCom, buf, dwBytesRead, &dwByteOfRead, &osRead);
    if(!bReadStat)
    {
        if(GetLastError() == ERROR_IO_PENDING)
        {
            WaitForSingleObject(osRead.hEvent, 2000);
//            GetOverlappedResult(m_hCom, &osRead,  &dwByteOfRead, FALSE) ; 

        }
    }
    //    PurgeComm(m_hCom, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);  ////清空串口的接收緩沖區,必要性不大,但有保證作用?清空的話如果大數據會丟失

    buf[dwByteOfRead] = '\0';
    return dwByteOfRead;
}

調用

     char *pBuf=new char[10];  //定義一個char型字符數組,動態分配內存
     memset(pBuf,0,10);
     m_SerialPort.ReadComm(pBuf,10);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM