求解 为什么 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返回的数据就不一样呢, 是不是我程序哪里设置的不正确呢 --------------------编程问答--------------------
--------------------编程问答-------------------- --------------------编程问答-------------------- 原因找到了 串口服务器不能支持频繁的数据交换 我把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
嗯,有道理
你不一定加长,试试这个:
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 , 基础类