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