本人VB新人有个获取外部设备数据的串口程序,获取数据有些问题请教各位大侠。
通信协议中发送410命令到外部设备获取到数据包
数据包格式为 16进制
通信协议中发送410命令到外部设备获取到数据包
数据包格式为 16进制
解决方案 »
- 再次求助一条SQL:把一个表中的部分数据抽出来,对另外一个表进行更新。
- 在VB中如何调用另外一个程序?
- 关于菜单,帮忙啊,GG们
- 如果打开的文件有几十M的话,那么怎样是速度不是处理的太慢?
- 初学VB:Type 和 Enum的区别何在?
- DAO350.dll调用问题
- vb 与AT指令
- 如何在datagrid或MSflexgrid中复选记录,然后把选择的记录赋给另一个msflexgrid?
- 有人做过酒店管理系统的软件吗?最好有源代码?
- 把Access数据导入Excel以后,明明保存了,还要提示“另存为”?
- 急:VB 分析 数据 为 bin.base64 数据类型时发生错误
- AppendChunk 有无写入上限
MSComm1.CommPort = 1
MSComm1.Settings = "9600,N,8,1"
MSComm1.InputMode = comInputModeBinary
MSComm1.InputLen = 0
MSComm1.RThreshold = 1
'MSComm1.EOFEnable = True
If MSComm1.PortOpen = False Then
MSComm1.PortOpen = True
MSComm1.Output = "410"
End IfPrivate Sub MSComm1_OnComm()
sdata = ""
i = MSComm1.InBufferCount
If i > 110 Then
Dim strdatablock() As Byte
Dim s As String
Dim b As Boolean
b = False
If i > 0 Then
strdatablock = MSComm1.Input
i = MSComm1.InBufferCount
If MSComm1.PortOpen = True Then
MSComm1.PortOpen = False
End If
For i = 0 To UBound(strdatablock)
If CStr(strdatablock(i)) = "2" Then
b = True
End If
If b = True Then
s = s & " " & CStr(strdatablock(i))
End If
Next i
sdata = sdata + s
End If
'判定数据有更新
If Len(sdata) > 0 Then
'调用数据分析函数将获得的数据赋值给相应的变量
strTranslation (sdata)
End If
End If
End Sub现在遇到的问题是 获取到的数据不合理有时候数据包很完整,有时候只有后面一部分,有时候只有前面的一部分,格式中那些关键的02,03,04不一定都能获取到,我使用网上的串口调试助手每次发送都能给我返回完整的数据包,我想肯定是我哪里没有注意到所以才会获取数据不合理,在此请教各位大侠了。。
我还有个疑问,在我发送一个数据包请求后,单步调试中我看到外设每次返回的数据包input中数据有时只有前面一半,有时只有后面一半,有时候正好一个数据包,这种情况是为什么呢?
照理发过来的包应该是一样的啊?
希望大虾们指点迷津。。
Option Explicit
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Sub Command1_Click()
Dim lngP As Long
Dim bytA() As Byte '存储发送内容
Dim varP As Variant '
Dim bytIn(100) As Byte '存储输入内容
Dim intP As Integer
'发送命令
'以二进制方式发送数据,请先填写bytA,我不清楚你的通信协议,所以无法给出定论
'打个比方,你要发送410过去,那么就是:
ReDim bytA(0 To 2) As Byte
bytA(0) = &H34 '4的ASCII码
bytA(1) = &H31
bytA(2) = &H30
intP = 0
MSComm1.InBufferCount = 0
MSComm1.Output = bytA
lngP = GetTickCount
Do
varP = MSComm1.Input
bytIn(intP) = varP(0)
Loop Until (GetTickCount - lngP) > 100 Or varP(0) = &H4
End SubPrivate Sub Form_Load()
MSComm1.CommPort = 1
MSComm1.Settings = "9600,N,8,1"
MSComm1.InputMode = comInputModeBinary
MSComm1.InputLen = 1
MSComm1.RThreshold = 0 '这个至关重要
'MSComm1.EOFEnable = True
If MSComm1.PortOpen = False Then
MSComm1.PortOpen = True
' MSComm1.Output = "410"
End If
End Sub