上篇文章谈到了串口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了。
 
文章终于写完了,写下来发觉写东西真的好累,特别是要把一件事情讲得清清楚楚,以前只知道看好文章,在这里非常感谢那些分享自身知识和经验的好作者。