再谈串口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了。
 
文章终于写完了,写下来发觉写东西真的好累,特别是要把一件事情讲得清清楚楚,之前只知道看好文章,在这里很是感谢那些分享自身知识和经验的好做者。
相关文章
相关标签/搜索