读书人

VB用API操作串口如何判断串口是否接受

发布时间: 2013-07-11 15:38:46 作者: rapoo

【求助】VB用API操作串口怎么判断串口是否接受完成
在用API操作串口是遇到这样一个问题,下位机返回的数据短的话基本没问题,但如果稍微长点,就会出现数据只收了一部分,不能收全。收数部分代码如下


Public Function COM_Read_Byte(hWnd As Long) As Byte()

Dim recComState As COMSTAT

Dim ErrorFlag As Long, t As Long

Dim lResult As Long, dwRes As Long

Dim Get_Data() As Byte

Dim NumToRead As Long

Dim NumhaveRead As Long

If hWnd <= 0 Then Exit Function

t = GetTickCount
'- 这里要怎么判断数据已经全部进来? -'
Do
Call ClearCommError(hWnd, ErrorFlag, recComState)
' If recComState.cbInQue > 0 Then Exit Do
'这是超时时间'
If GetTickCount - t > 10 Then Exit Do
Loop Until recComState.cbInQue > 0

If recComState.cbInQue > 0 Then
'取得接收缓存区内没有被读取的字节数
ReDim Get_Data(recComState.cbInQue - 1)
NumToRead = recComState.cbInQue
lResult = ReadFile(hWnd, Get_Data(0), NumToRead, NumhaveRead, ByVal 0&)
End If

COM_Read_Byte = Get_Data
'清空'
If recComState.cbInQue > 0 Then PurgeComm hWnd, PURGE_RXABORT Or PURGE_RXCLEAR
VB API 串口
------解决方案--------------------


If GetTickCount - t > 3000 Then Exit Do

超时加长一点没有关系,反正Loop Until recComState.cbInQue > 0也可以退出来
[解决办法]
http://download.csdn.net/detail/veron_04/1339593
[解决办法]
使用SetCommState设置合适参数,SetCommTimeouts设置超时参数
另,既然使用VB,干嘛不使用mscomm控件?
[解决办法]
协议缺陷。

如果传输的数据是不定长的,最好采用“封包”方式,即加上能够表示数据长度的包头,和可选的校验数据正确性的包尾。

否则,只能是每一个接收事务都假定对方发送长度可能是最大长度。也就是在最大长度所需的传输时间内循环等待。这样做显然是低效的。

[解决办法]
假设你知道是20个字度,这样修改应可以:

Do
Call ClearCommError(hWnd, ErrorFlag, recComState)

'这是超时退出,不然就等20个字节
If GetTickCount - t > 3000 Then Exit Do
Loop Until recComState.cbInQue <20

 '不满足20个字节,退出
If recComState.cbInQue <20 Then exit sub
[解决办法]

引用:
协议缺陷。

如果传输的数据是不定长的,最好采用“封包”方式,即加上能够表示数据长度的包头,和可选的校验数据正确性的包尾。

否则,只能是每一个接收事务都假定对方发送长度可能是最大长度。也就是在最大长度所需的传输时间内循环等待。这样做显然是低效的。


这个说法在许多情况是做不到的,除非下位机是你自己开发的。比如控制PLC,许多PLC采用modbus协议,其有两种模式,一是ascii模式,一是二进制模式
ascii模式还好,使用vbcrlf结束,
二进制模式就没有结束符,一般可以说使用接收的中断来判断结束,因为下位机发送数据都是连续的

读书人网 >VB

热点推荐