首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

【请问】 怎么判定串口发送完成

2012-01-28 
【请教】 如何判定串口发送完成 ?发现WriteFile输出串口后,要经过约2ms才能完成输出,现在我收写数据需要进行

【请教】 如何判定串口发送完成 ?
发现WriteFile输出串口后,要经过约2ms才能完成输出,
现在我收写数据需要进行切换(转成485输出),
这样我需要判定串口发送完成了然后再改变读写选择

使用WaitCommEvent; 发现EV_TXEMPTY事件还是即刻发生的,即当时输出仍未完成

请教是否有准确的获知串口发送完成的方法? 




[解决办法]
你采用的是Io重叠异步的串口方式吗?

检查下超时设置

COMMTIMEOUTS to;
to.ReadIntervalTimeout = MAXDWORD;
to.ReadTotalTimeoutConstant = 0;
to.ReadTotalTimeoutMultiplier = 0;
to.WriteTotalTimeoutConstant = 10;
to.WriteTotalTimeoutMultiplier = 500;
SetCommTimeouts(m_hCom, &to);

如果没有设置,异步操作是会直接返回的。

也可以采取阻塞+线程去达到异步处理, writefile() 会返回已写入长度,循环写入长度达到所需要写的长度返回即可。

[解决办法]
应该有两种模式,一种是非堵塞(异步),一种是堵塞模式(同步),看你的要求应该用后种,openfile的时候可以设定,你再查查
[解决办法]
如果是同步的写入的话writefile 返回正确长度就算是写入完成了
[解决办法]
WriteFile()第五个参数可传递给函数

BOOL WINAPI GetOverlappedResult(
__in HANDLE hFile,
__in LPOVERLAPPED lpOverlapped,
__out LPDWORD lpNumberOfBytesTransferred,
__in BOOL bWait
);
--------------------------------
bWait 
If this parameter is TRUE, the function does not return until the operation has been completed. If this parameter is FALSE and the operation is still pending, the function returns FALSE and the GetLastError function returns ERROR_IO_INCOMPLETE.


[解决办法]
WriteFile成功就可以认为完成了吧,为什么要纠结于那2ms呢,再说你这个2ms是怎么测试出来的啊?

反正我以前做串口的时候,参考MSDN作出来没有问题,采用同步方式,两个线程,一个循环ReadFile,一个循环WriteFile,有点不同的就是WriteFile前调用了一下ClearCommError
[解决办法]
是啊,是阻塞模式,writefile 参数中返回长度等数数据大小就算完毕了,单针写入也需要循环写的吧,这只和数据大小有关,比如图片是10K,writefile 需要多次写入累计长度等于10*1024才算写入完成。

热点排行