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

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

2013-07-11 
【求助】VB用API操作串口怎么判断串口是否接受完成在用API操作串口是遇到这样一个问题,下位机返回的数据短的

【求助】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结束,
二进制模式就没有结束符,一般可以说使用接收的中断来判断结束,因为下位机发送数据都是连续的

热点排行