当前位置:编程学习 > VB >>

求解 为什么 MSComm1.Input 返回13个无效数据


Private Sub InitMSComm1()
    If MSComm1.PortOpen Then
        MSComm1.PortOpen = False
    End If
    MSComm1.InBufferSize = 1024 '开辟接收数据缓冲区
    MSComm1.InBufferCount = 0   '清空接收数据缓冲区
    MSComm1.OutBufferSize = 512 '设置传输数据缓冲区大小
    MSComm1.InputMode = comInputModeBinary  '设置为二进制方式
    MSComm1.InputLen = 0    '一次读入全部的数据
    MSComm1.RThreshold = 1  '接收1字节后触发OnComm
    MSComm1.CommPort = comint   '设定串口号
    MSComm1.Settings = CStr(bandint) & ",n,8,1"  '设定波特率、数据位、停止位
    If MSComm1.PortOpen Then
        MSComm1.PortOpen = False
    End If
    MSComm1.PortOpen = True '打开通讯端口

End Sub

Private Sub MSComm1_OnComm()
    Dim bytInput() As Byte
    Dim intInputlen As Integer
    Dim i As Integer
    Select Case MSComm1.CommEvent
    Case comEvReceive   '收到MSComm1. RThreshold 个字符后触发该事件
        Sleep (10)
        If ReceiveFlag = 0 Then
            intInputlen = MSComm1.InBufferCount
            Label1.Caption = intInputlen
            bytInput = MSComm1.Input
            For i = 0 To intInputlen - 1 Step 1
                indatabyte3(ybnum, i) = bytInput(i)
            Next i
            ybnum = ybnum + 1
        ElseIf ReceiveFlag = 1 Then
            intInputlen = MSComm1.InBufferCount
            bytInput = MSComm1.Input
            For i = 0 To intInputlen - 1 Step 1
                indatabyte1(ybnum, i) = bytInput(i)
            Next i
        End If
    End Select
   
End Sub

上面的程序从直接从串口读取数据时正常的。

现在我使用了串口服务器,配置了虚拟串口
发送01 03 00 21 00 2E 95 DC 读取数据 返回来的数据就不正常了

怎么不正常呢 如下
正常的数据为01 03 5C 00 00......【数据长度为97位】
现在的数据位AB 40 ..... 01 03 5C 00 00 [01 03 数据前多了13个字节的数据]


我用串口调试助手分别对实际串口和虚拟串口进行数据采集,
发送数据任然是01 03 00 21 00 2E 95 DC

返回的数据却都是01 03 5C 00 00......


为什么vb返回的数据就不一样呢, 是不是我程序哪里设置的不正确呢 --------------------编程问答--------------------

Option Explicit

Private Sub InitMSComm1()
    MSComm1.InBufferSize = 1024 '开辟接收数据缓冲区
    MSComm1.InBufferCount = 0   '清空接收数据缓冲区
    MSComm1.OutBufferSize = 512 '设置传输数据缓冲区大小
    MSComm1.InputMode = comInputModeBinary  '设置为二进制方式
    MSComm1.InputLen = 1    '一次读入全部的数据
    MSComm1.RThreshold = 1  '接收1字节后触发OnComm
    MSComm1.CommPort = comint   '设定串口号
    MSComm1.Settings = CStr(bandint) & ",n,8,1"  '设定波特率、数据位、停止位
    If Not MSComm1.PortOpen Then MSComm1.PortOpen = True  '打开通讯端口
End Sub


Private Sub MSComm1_OnComm()
    Dim varP As Variant
    Dim bytInput(0 To 1023) As Byte
    Dim intInputlen As Integer
    Dim i As Integer
    Select Case MSComm1.CommEvent
        Case comEvReceive   '收到MSComm1. RThreshold 个字符后触发该事件
            MSComm1.RThreshold = 0  '设置为0,避免再次收到数据时触发OnComm事件
            sleep 20    '延迟等待
            varP = Null
            Do
                varP = MSComm1.Input
                If Not IsNull(varP) Then
                    bytInput(i) = varP(0)
                    i = i + 1
                End If
            Loop Until MSComm1.InBufferCount = 0
            intInputlen = i - 1
            For i = 0 To intInputlen - 1 Step 1
                indatabyte3(ybnum, i) = bytInput(i)
            Next i
            MSComm1.RThreshold = 1  '设置为,开启收到数据时触发OnComm事件
    End Select
   
End Sub

--------------------编程问答-------------------- --------------------编程问答-------------------- 原因找到了 串口服务器不能支持频繁的数据交换 我把vb发送的时间间隔加长,返回的数据就正常了 --------------------编程问答--------------------
引用 3 楼  的回复:
原因找到了 串口服务器不能支持频繁的数据交换 我把vb发送的时间间隔加长,返回的数据就正常了

嗯,有道理
你不一定加长,试试这个:

Option Explicit

Private Sub InitMSComm1()
    MSComm1.InBufferSize = 1024 '开辟接收数据缓冲区
    MSComm1.InBufferCount = 0   '清空接收数据缓冲区
    MSComm1.OutBufferSize = 512 '设置传输数据缓冲区大小
    MSComm1.InputMode = comInputModeBinary  '设置为二进制方式
    MSComm1.InputLen = 1    '一次读入全部的数据
    MSComm1.RThreshold = 1  '接收1字节后触发OnComm
    MSComm1.CommPort = comint   '设定串口号
    MSComm1.Settings = CStr(bandint) & ",n,8,1"  '设定波特率、数据位、停止位
    If Not MSComm1.PortOpen Then MSComm1.PortOpen = True  '打开通讯端口
End Sub


Private Sub MSComm1_OnComm()
    Dim varP As Variant
    Dim bytInput(0 To 1023) As Byte
    Dim intInputlen As Integer
    Dim i As Integer
    Select Case MSComm1.CommEvent
        Case comEvReceive   '收到MSComm1. RThreshold 个字符后触发该事件
            MSComm1.RThreshold = 0  '设置为0,避免再次收到数据时触发OnComm事件
            varP = Null
            Do
                sleep 10    '延迟等待
                varP = MSComm1.Input
                If Not IsNull(varP) Then
                    bytInput(i) = varP(0)
                    i = i + 1
                End If
            Loop Until MSComm1.InBufferCount = 0
            intInputlen = i - 1
            For i = 0 To intInputlen - 1 Step 1
                indatabyte3(ybnum, i) = bytInput(i)
            Next i
            MSComm1.RThreshold = 1  '设置为,开启收到数据时触发OnComm事件
    End Select
   
End Sub


补充:VB ,  基础类
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,