上篇文章談到了串口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了。
文章終於寫完了,寫下來發覺寫東西真的好累,特別是要把一件事情講得清清楚楚,之前只知道看好文章,在這裏很是感謝那些分享自身知識和經驗的好做者。