【求助】VB用API操作串口怎么判断串口是否接受完成
在用API操作串口是遇到这样一个问题,下位机返回的数据短的话基本没问题,但如果稍微长点,就会出现数据只收了一部分,不能收全。收数部分代码如下
VB 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
------解决方案--------------------
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结束,
二进制模式就没有结束符,一般可以说使用接收的中断来判断结束,因为下位机发送数据都是连续的