串口通讯与超时设置
在WINDOWS NT4.0 以上操作系统中,串口通讯有2种模式:同步方式和异步方式。由
CreateFile
中的
dwFlagsAndAttributes
参数决定,
若指定
FILE_FLAG_OVERLAPPED
标志则为异步方式,否则为同步方式。当为同步模式时,调用
ReadFile
或
WriteFile
会阻塞调用线程直到读完或写完指定量的数据才返回,这样就有可能出现无法退出程序的现象,解决方法是为读写操作设置超时,注意这种超时指的是
ReadFile
或
WriteFile
函数的返回时间,仅对同步模式有效。代码如下
1
//
以下m_pComPort为本人自己封装的C++串口类CComPort的指针
3
//
FALSE表示以同步方式打开
4
m_pComPort
->
Open(
2
, FALSE,
38400
);
6
//
设置读写超时为5秒
7
COMMTIMEOUTS timeout
=
{
0
}
;
8
timeout.ReadTotalTimeoutConstant
=
5000
;
9
timeout.WriteTotalTimeoutConstant
=
5000
;
10
m_pCommPort
->
SetTimeouts(timeout);
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的指针
3
//
TRUE表示以异步方式打开
4
m_pComPort
->
Open(
2
, TRUE,
38400
);
6
//
设置读写等待超时为5秒
7
char
szData[
1024
]
=
{
0
}
;
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
春秋十二月
阅读(4365)
评论(0)
编辑
收藏
引用
所属分类:
C/C++