在用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串口

解决方案 »

  1.   

    If GetTickCount - t > 3000 Then Exit Do超时加长一点没有关系,反正Loop Until recComState.cbInQue > 0也可以退出来
      

  2.   

    现在就是这句有点问题~Loop Until recComState.cbInQue > 0
    假设进来的数据长度是20,但只要有一个字节的数进来了recComState.cbInQue > 0成立就退出了循环,也就是数据没收全。在我的实际测试中,If GetTickCount - t >10 这句话基本没起什么作用。
      

  3.   

    http://download.csdn.net/detail/veron_04/1339593
      

  4.   

    使用SetCommState设置合适参数,SetCommTimeouts设置超时参数
     另,既然使用VB,干嘛不使用mscomm控件?
      

  5.   

    假设你知道是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
      

  6.   


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