串口通讯与超时设置

串口通讯与超时设置
   在WINDOWS NT4.0 以上操作系统中,串口通讯有2种模式:同步方式和异步方式。由 CreateFile中的 dwFlagsAndAttributes参数决定, 若指定FILE_FLAG_OVERLAPPED标志则为异步方式,否则为同步方式。当为同步模式时,调用ReadFileWriteFile会阻塞调用线程直到读完或写完指定量的数据才返回,这样就有可能出现无法退出程序的现象,解决方法是为读写操作设置超时,注意这种超时指的是ReadFileWriteFile函数的返回时间,仅对同步模式有效。代码如下
 1     // 以下m_pComPort为本人自己封装的C++串口类CComPort的指针
 2     
 3              //  FALSE表示以同步方式打开
 4            m_pComPort -> Open( 2 , FALSE,  38400 );
 5      
 6            // 设置读写超时为5秒
 7                COMMTIMEOUTS  timeout  =   0 } ;
 8            timeout.ReadTotalTimeoutConstant  =   5000 ;
 9            timeout.WriteTotalTimeoutConstant  =   5000 ;
10           m_pCommPort -> SetTimeouts(timeout);
11
12              char   szData[ 1024 =   0 } ;
13           // 读数据
14          DWORD dwRet  =  m_pCommPort -> ReadComm(szData,  1024 );
15           // 写数据
16          dwRet  =  m_pCommPort -> WriteComm(szData,  1024 );
17           // 关闭串口
18          m_pCommPort -> Close();
   当为异步模式时,由于读写操作会立即返回,因此设置超时指的是设置等待操作完成的时间,而不是 ReadFileWriteFile函数返回的时间,代码如下
 1      // 以下m_pComPort为本人自己封装的C++串口类CComPort的指针
 2      
 3             //  TRUE表示以异步方式打开
 4             m_pComPort -> Open( 2 , TRUE,  38400 );
 5       
 6            // 设置读写等待超时为5秒
 7                  char   szData[ 1024 =   0 } ;
 8   
 9           // 当第3个参数为0时,读写操作会立即返回
10             // 读数据
11            DWORD dwRet  =  m_pCommPort -> ReadComm(szData,  1024 5000 );
12            // 写数据
13            dwRet  =  m_pCommPort -> WriteComm(szData,  1024 5000 );
14            // 关闭串口
15            m_pCommPort -> Close();
   这里的 ReadCommWriteComm的实现内部针对不同模式作了不同处理,异步模式时即调用了 WaitForSingleObject等待函数来设置超时。同步模式时即调用不带重叠结构的 ReadFileWriteFile函数来接收或发送指定量的数据。另外在这介绍下串口虚拟软件vspd,这个软件能模拟在同一台计算机上进行两个串口的通讯,有利于没有实际设备情况下的串口调试。

你可能感兴趣的:(串口通讯与超时设置)