API串口通讯的ReadFile这个函数使用时的问题。使用CreateFile打开串口,然后发送包,通讯器的发送、接收灯都闪
API串口通讯的ReadFile这个函数使用时的问题。
使用CreateFile打开串口,然后发送包,通讯器的发送、接收灯都闪动了一下,表示发送成功,下位机已经返回了数据,但是使用ReadFile的时候却有点问题。
fReadStat=readfile(m_Handle,bytbuffer(0),lngSize,lngBytesRead,m_OverlappedRead)
如果在这句上加断点,F8运行之后bytBuffer(0)=1,我返回数据的第一个字节就是1,是正确的,而且fReadFile=1,然后bytBuffer()接收完毕所有完整的正确数据,lngSize是7,指定的。
如果在这句前加延时sleep 1000,也可以,接收的数据也是完整正确的。
但是不加断点或者延时的话,在后面stop住或者后面一句加上断点,观察bytBuffer(0)=0,而且fReadFile=0,数据接收不到,为空。
求解释
[解决办法]
串口协议是低速的,与 PC 运行速度差几个数量级。
要等待多字节通讯完成,有几种方法。
延时是最简单的。
另外一种方法,是用 GetLastError API 判断是否 ERROR_IO_PENDING(997),如果是再用 WaitForSingleObject API 挂起等待。
还有一些很极端的做法,在已知接收长度的情况下,循环 n 次单字节的 ReadFile 操作。
[解决办法]
必要的等待是必须的。
是不是你没有等待数据上传的原因?你想,你加断点,实际上就等于给足了下位机上传数据的时间。
所以建议你在WriteFile后执行Sleep一下,等待足够长的时间,具体多长,这个就的你调试中看了。
