在WINDOWS NT4.0 以上操作系统中,串口通讯有2种模式:同步方式和异步方式。由
CreateFile中的
dwFlagsAndAttributes参数决定,
若指定FILE_FLAG_OVERLAPPED标志则为异步方式,否则为同步方式。当为同步模式时,调用ReadFile或WriteFile会阻塞调用线程直到读完或写完指定量的数据才返回,这样就有可能出现无法退出程序的现象,解决方法是为读写操作设置超时,注意这种超时指的是ReadFile或WriteFile函数的返回时间,仅对同步模式有效。代码如下
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();
当为异步模式时,由于读写操作会立即返回,因此设置超时指的是设置等待操作完成的时间,而不是
ReadFile或
WriteFile函数返回的时间,代码如下
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();
这里的
ReadComm和
WriteComm的实现内部针对不同模式作了不同处理,异步模式时即调用了
WaitForSingleObject等待函数来设置超时。同步模式时即调用不带重叠结构的
ReadFile或
WriteFile函数来接收或发送指定量的数据。另外在这介绍下串口虚拟软件vspd,这个软件能模拟在同一台计算机上进行两个串口的通讯,有利于没有实际设备情况下的串口调试。
posted on 2009-04-17 19:15
春秋十二月 阅读(4409)
评论(0) 编辑 收藏 引用 所属分类:
C/C++