wince 串口操作Writefile问题
近日写wince下应用 发现在实用VS2005 时串口操作writefile在发送完数据后函数无法返回。
经过半天的查找比对发现问题出现是由于串口波特率设置115200太高,设置9600就正常了。究其原因是wince模拟器问题,所以智能在调试编程是实用9600在设备中实用115200了。
2013 -02-28
最新调试时又遇到了这个问题但是改完波特率也无法正常通讯,总是输出一会就有卡在Writefile这不动了也不返回数据了,结果一卡就是2天后来发现了问题
在设置串口是原来一直默认不设置写超时的,更改写超时就一切正常了。
ReadFile 和 WriteFile 函数读写串口超时机制
读写超时是在 调用 ReadFile 和 WriteFile 函数读写串口的时候系统提供的超时机制
typedef struct _COMMTIMEOUTS {
DWORD ReadIntervalTimeout; /* Maximum time between read chars. */
DWORD ReadTotalTimeoutMultiplier; /* Multiplier of characters. */
DWORD ReadTotalTimeoutConstant; /* Constant in milliseconds. */
DWORD WriteTotalTimeoutMultiplier; /* Multiplier of characters. */
DWORD WriteTotalTimeoutConstant; /* Constant in milliseconds. */
} COMMTIMEOUTS,*LPCOMMTIMEOUTS;
读超时 有俩计算方法
1:(间隔超时)ReadIntervalTimeout 指定了在接收字符间的最大时间,如果超过了这个时间,ReadFile立即返回。
2:(总超时)基于要接收的字符数量
ReadTotalTimeoutMultiplier表示平均读一个字节的时间上限
ReadTotalTimeoutConstant表示读数据总时间常量
读数据总超时:ReadTotalTimeoutConstant +(ReadTotalTimeoutMultiplier*要读的字节数)
读数据超时,两种超时同时有效,当出现任何一种超时时,ReadFile都将返回。
写超时:
WriteTotalTimeoutMultiplier表示平均写一个字节的时间上限
WriteTotalTimeoutConstant表示写数据总超时常量
写数据总超时 :WriteTotalTimeoutConstatn +(WriteTotalTimeoutMultiplier *要写的字节数)
具体超时设置
1: 有读间隔超时、读总超时、写总超时,将COMMTIMEOUTS结构5个成员设置为对应值。
2:没有读间隔超时,有读总超时和写总超时,将RealIntervalTimeou设置为0,其他参数设置为对应值。
3:不管是否有数据要读取,ReadFile立即返回,将RealIntervalTimeout设置为MAX_DWORD,
将ReadTotalTimeoutMultiplier和ReadTotalTimeoutConstant都设置为0
(不立即返回的时候,可以在超时时间内等串口中有新的数据?然后读取,直到超时时间)
4:ReadFile没有超时设置,直到有适当的字符数返回或者错误发生,函数才返回。
将 ReadIntervalTimeout、ReadTotalTimeoutMultiplier、ReadTotalTimeoutConstant都设置为0
5:WriteFile没有超时设置:将WriteTotalTimeoutMultiplier和WriteTotalTimeoutConstant设置为0
设置通讯超时
开启端口的最后一步是通过使用COMMTIMEOUTS数据结构和调用SetCommTimeouts函数进行通讯超时设置。如下代码所示:
01.
02.
COMMTIMEOUTS comTimeOut;
03.
04.
05.
comTimeOut.ReadIntervalTimeout = 3;
06.
07.
08.
comTimeOut.ReadTotalTimeoutMultiplier = 3;
09.
10.
11.
12.
comTimeOut.ReadTotalTimeoutConstant = 2;
13.
14.
15.
comTimeOut.WriteTotalTimeoutMultiplier = 3;
16.
17.
18.
comTimeOut.WriteTotalTimeoutConstant = 2;
19.
20.
21.
SetCommTimeouts(handlePort_,&comTimeOut);
ReadIntervalTimeout
指定通讯线上两个字符到达的最大时延,以毫秒为单位。在ReadFile操作期间,时间周期从第一个字符接收到算起。如果收到的两个字符之间的间隔超过该值,ReadFile操作完毕并返回所有缓冲数据。如果ReadIntervalTimeout为0,则该值不起作用。
如果值为MAXDWORD, 并且ReadTotalTimeoutConstant和ReadTotalTimeoutMultiplier两个值都为0, 则指定读操作携带已经收到的字符立即返回,即使没有收到任何字符。
ReadTotalTimeoutMultiplier
指定以毫秒为单位的累积值。用于计算读操作时的超时总数。对于每次读操作,该值与所要读的字节数相乘。
ReadTotalTimeoutConstant
指定以毫秒为单位的常数。用于计算读操作时的超时总数。对于每次读操作,ReadTotalTimeoutMultiplier与所要读的字节数相乘后与该值相加。
如果ReadTotalTimeoutMultiplier和ReadTotalTimeoutConstant都为0,则在读操作时忽略总超时数。
WriteTotalTimeoutMultiplier
指定以毫秒为单位的累积值。用于计算写操作时的超时总数。对于每次写操作,该值与所要写的字节数相乘。
WriteTotalTimeoutConstant
指定以毫秒为单位的常数。用于计算写操作时的超时总数。对于每次写操作, WriteTotalTimeoutMultiplier与所要写的字节数相乘后与该值相加。
如果 WriteTotalTimeoutMultiplier 和 WriteTotalTimeoutConstant都为0,则在写操作时忽略总超时数。
提示:用户设置通讯超时后,如没有出错,串口已经被打开。
if
(SetCommState(handlePort_,&config_) == 0)
2.
{
3.
AfxMessageBox(
"Set configuration port has problem."
);
4.
return
FALSE;
5.
}