随笔-156  评论-223  文章-30  trackbacks-0
   在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, 10245000);
12          //写数据
13           dwRet = m_pCommPort->WriteComm(szData, 10245000);
14          //关闭串口
15           m_pCommPort->Close();
   这里的ReadCommWriteComm的实现内部针对不同模式作了不同处理,异步模式时即调用了WaitForSingleObject等待函数来设置超时。同步模式时即调用不带重叠结构的ReadFileWriteFile函数来接收或发送指定量的数据。另外在这介绍下串口虚拟软件vspd,这个软件能模拟在同一台计算机上进行两个串口的通讯,有利于没有实际设备情况下的串口调试。
posted on 2009-04-17 19:15 春秋十二月 阅读(4409) 评论(0)  编辑 收藏 引用 所属分类: C/C++

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理