再談串口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了。
 
文章終於寫完了,寫下來發覺寫東西真的好累,特別是要把一件事情講得清清楚楚,以前只知道看好文章,在這裏非常感謝那些分享自身知識和經驗的好作者。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章