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