上篇文章谈到了串口DCB的基本设置,但是当我们以为可以给客户做“结案陈词”的时候,问题又出现了。共有4台PC机来测试程序,其中有3台机器,“普通串口”和“USB转串口”两种方式都正常运行程序,其中有一台“普通串口”方式不能使用。
更让人纳闷的事情在第二天出现了。3台正常的机器变成只有2台可正常运行了。于是我通过函数“GetCommStat”(The 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了。
文章终于写完了,写下来发觉写东西真的好累,特别是要把一件事情讲得清清楚楚,以前只知道看好文章,在这里非常感谢那些分享自身知识和经验的好作者。
允许转载,转载时请务必以超链接形式标明文章 原始出处。 文章转自 http://cnmtjp.blog.51cto.com/204390/55196
阅读(5104) | 评论(0) | 转发(0) |