wince 串口操作Writefile问题

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. // COMMTIMEOUTS对象
02. COMMTIMEOUTS comTimeOut;
03.  
04. // 接收时,两字符间最大的时延
05. comTimeOut.ReadIntervalTimeout = 3;
06.  
07. // 读取每字节的超时
08. comTimeOut.ReadTotalTimeoutMultiplier = 3;
09.  
10. // 读串口数据的固定超时
11. // 总超时 = ReadTotalTimeoutMultiplier * 字节数 + ReadTotalTimeoutConstant
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. }

你可能感兴趣的:(wince 串口操作Writefile问题)