再談串口DCB設置--串口開發不得不注意的問題

    上篇文章談到了串口DCB的基本設置,可是當咱們覺得能夠給客戶作「結案陳詞」的時候,問題又出現了。共有4臺PC機來測試程序,其中有3臺機器,「普通串口」和「USB轉串口」兩種方式都正常運行程序,其中有一臺「普通串口」方式不能使用。
    更讓人納悶的事情在次日出現了。3臺正常的機器變成只有2臺可正常運行了。因而我經過函數「GetCommStat」(The GetCommState function retrieves the current control settings for a specified communications device.)獲取了串口的DCB狀態。乍一看,在沒有調用SetCommStat函數的狀況下,波特率竟然爲38400,這是上次程序運行(在沒有重起PC機的狀況下)保存下來的值。
    因而,我想到緣由所在,原來咱們作的另一個程序(稱爲A程序)對串口的DCB作了流控制設置,而咱們的如今不能正常運行的程序(稱爲B程序)不須要流控制設置,因而沒有將A程序所作的設置改回來,形成了B程序串口不能正常通訊。哇塞,原來就這麼簡單,可是卻很難發現,這是我今天所作的最大發現。呵呵……串口的問題之後不再會煩我了。好了,下面咱們用程序示例講一下,與你們共享,但願能夠對你們有所幫助。
 
A程序的DCB以下所示:
    // Set serial parameters
    dcb.BaudRate = 57600;  // Band rate
    dcb.ByteSize = 7;      // Data bit, either 7 or 8
    dcb.Parity = 0;        // Parity, must between 0 to 4
    dcb.StopBits = 1;      // Stop bit must between 0 to 2
    dcb.fBinary = TRUE;    // Bianry must be TRUE in Win32
    dcb.fParity = FALSE;
 
    dcb.fDtrControl = DTR_CONTROL_ENABLE;
    dcb.fRtsControl = RTS_CONTROL_ENABLE;
    dcb.fOutxCtsFlow = TRUE;
    dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
 
而B程序的DCB以下所示:
    // Set serial parameters
    dcb.BaudRate = 38400;  // Band rate
    dcb.ByteSize = 7;      // Data bit, either 7 or 8
    dcb.Parity = 0;        // Parity, must between 0 to 4
    dcb.StopBits = 1;      // Stop bit must between 0 to 2
    dcb.fBinary = TRUE;    // Bianry must be TRUE in Win32
    dcb.fParity = FALSE;
 
    dcb.fDtrControl = DTR_CONTROL_ENABLE;
    dcb.fRtsControl = RTS_CONTROL_ENABLE;
 
其餘沒設置的項就採用了上次所用的設置,B程序的實際配置以下所示:
----------------------------------------------------------------
    dcb.BaudRate = 38400;  // Band rate
    dcb.ByteSize = 7;      // Data bit, either 7 or 8
    dcb.Parity = 0;        // Parity, must between 0 to 4
    dcb.StopBits = 1;      // Stop bit must between 0 to 2
    dcb.fBinary = TRUE;    // Bianry must be TRUE in Win32
    dcb.fParity = FALSE;
 
    dcb.fDtrControl = DTR_CONTROL_ENABLE;
    dcb.fRtsControl = RTS_CONTROL_ENABLE;
 
    dcb.fOutxCtsFlow = TRUE; (默認狀況下爲FALSE,現保留了A程序的設置,因而致使了串口不能正常通訊)
    dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
----------------------------------------------------------------
 
因而,咱們將程序全部的配置都初始化了一次,正確的配置以下所示:
    dcb.BaudRate = 38400;  // Band rate
    dcb.ByteSize = 7;      // Data bit, either 7 or 8
    dcb.Parity = 0;        // Parity, must between 0 to 4
    dcb.StopBits = 1;      // Stop bit must between 0 to 2
    dcb.fBinary = TRUE;    // Bianry must be TRUE in Win32
    dcb.fParity = FALSE;
 
    dcb.fDtrControl = DTR_CONTROL_ENABLE;
    dcb.fRtsControl = RTS_CONTROL_ENABLE;
 
    dcb.fOutxCtsFlow = FALSE;
    ……
    其餘項的配置都採用串口最初的配置
 
而後串口的問題就OK了。
 
文章終於寫完了,寫下來發覺寫東西真的好累,特別是要把一件事情講得清清楚楚,之前只知道看好文章,在這裏很是感謝那些分享自身知識和經驗的好做者。
相關文章
相關標籤/搜索