在用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_RXCLEARVBAPI串口
'- 这里要怎么判断数据已经全部进来? -'
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_RXCLEARVBAPI串口
解决方案 »
- 在公司工作久了,有开发和经营经验,想出干或者自己干,做什么好呢?
- vb创建的多线程程序编译为p-代码执行时出错,编译为本机代码就无法创建线程。求解。
- 服务器更新软件之后,如何使客户端不用更新?
- 如何用api函数获取listview控件中已经选择项目的数目?
- □■□■□■□■关于Form1.icon的问题(32*32和16*16)
- 哪位用 windows 的柯达 控件 IMGOCR 做过 OCR 识别的例子,识别英文数字的都行?
- 录音
- 关于vsfiexgrid的几个问题?
- 在VB中如何实现动态添加执行代码?
- 请问如何能让网格控件(True DBGrid)的行,显示不同的颜色!
- vb6.0 通过代理访问web服务 超时
- 那个老大给转下vc转vb
假设进来的数据长度是20,但只要有一个字节的数进来了recComState.cbInQue > 0成立就退出了循环,也就是数据没收全。在我的实际测试中,If GetTickCount - t >10 这句话基本没起什么作用。
另,既然使用VB,干嘛不使用mscomm控件?
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结束,
二进制模式就没有结束符,一般可以说使用接收的中断来判断结束,因为下位机发送数据都是连续的