采用king06意见,用varptrarray,不知道怎么用,出错了~~ 帮我看下: Dim first_address() As Byte Do Delay_Time 400 '等待400ms buf = MSComm.Input first_address() = VarPtrArray(buf) i = 1 If Len(buf) >= 24 Then If first_address() = i Then Combo_Meter.AddItem "仪表" & i End If i = i + 1 Exit Do End If Loop Until GetTickCount() - tt > 2000
刚把定义给改了 Dim first_address() as long
可以用VarPtr变量地址 Private Sub Form_Load() Dim a() As Byte a = StrConv("abcd", vbFromUnicode) Dim b As Long b = VarPtr(a(0))'b是a数组首地址
End Sub
哎,我只能说,问题解决了~~呵呵 Private Sub Command_BUTTON_Scan_Click()
On Error GoTo error
Dim i As Integer Dim tt As Double Dim buf$ Dim ACK As Byte
Dim count As Integer Dim send(7) As Byte '定义发送数组 Dim crc(2) As Byte Dim first_address(0 To 29) As Long '定义仪表首地址数组
MSComm.Output = send tt = GetTickCount() '用来超时控制,意思是请求时间上传的命令帧发送过去之后,超时控制时间2000ms内,就应该得到返回消息 Do Delay_Time 400 '等待400ms buf = MSComm.Input first_address(i) = VarPtr(buf) i = 1 If Len(buf) >= 24 Then If first_address(i) = i Then Combo_Meter.AddItem "仪表" & i End If i = i + 1 Exit Do End If Loop Until GetTickCount() - tt > 2000
If Len(buf) = 0 Then '无上传信息,一般出现这种情况为物理连接断开,或帧传送失败。 Exit Sub End Iferror: If Err.Number = 8005 Then MsgBox "端口已经打开", vbDefaultButton1 + 16, "提示信息" Exit Sub Else MsgBox "错误信息为" & Err.Description, vbDefaultButton1 + 48, "提示信息" End If End Sub
VarPtrArray是个api,要声明的. Dim lngSafeArrayAddress as Long Dim lngArrayOfLongs(9) as Long lngSafeArrayAddress = VarPtrArray(lngArrayOfLongs()) 也可以用楼上的方法去取数组内第一个元素的地址. 不过这个元素的地址是否就是数组本身的首地址有待考证.
帮我看下:
Dim first_address() As Byte
Do
Delay_Time 400 '等待400ms
buf = MSComm.Input
first_address() = VarPtrArray(buf)
i = 1
If Len(buf) >= 24 Then
If first_address() = i Then
Combo_Meter.AddItem "仪表" & i
End If
i = i + 1
Exit Do
End If
Loop Until GetTickCount() - tt > 2000
Dim first_address() as long
Private Sub Form_Load()
Dim a() As Byte
a = StrConv("abcd", vbFromUnicode)
Dim b As Long
b = VarPtr(a(0))'b是a数组首地址
End Sub
Private Sub Command_BUTTON_Scan_Click()
On Error GoTo error
Dim i As Integer
Dim tt As Double
Dim buf$
Dim ACK As Byte
Dim count As Integer
Dim send(7) As Byte '定义发送数组
Dim crc(2) As Byte
Dim first_address(0 To 29) As Long '定义仪表首地址数组
first_address(0) = &H1
first_address(1) = &H2
first_address(2) = &H3
first_address(3) = &H4
first_address(4) = &H5
first_address(5) = &H6
first_address(6) = &H7
first_address(7) = &H8
first_address(8) = &H9
first_address(9) = &HA
first_address(10) = &HB
first_address(11) = &HC
first_address(12) = &HD
first_address(13) = &HE
first_address(14) = &HF
first_address(15) = &H10
first_address(16) = &H11
first_address(17) = &H12
first_address(18) = &H13
first_address(19) = &H14
first_address(20) = &H15
first_address(21) = &H16
first_address(22) = &H17
first_address(23) = &H18
first_address(24) = &H19
first_address(25) = &H1A
first_address(26) = &H1B
first_address(27) = &H1C
first_address(28) = &H1D
first_address(29) = &H1E
Combo_Meter.Clear
Combo_Meter.AddItem "请选择仪表"
If scanaddP < 31 Then
send(0) = scanaddP
scanaddP = scanaddP + 1
Else: scanaddP = 0
End If
send(1) = &H3
send(2) = &H0
send(3) = &H0
send(4) = &H0
send(5) = &HA
Call CRC16(send(), 5, crc())
send(6) = crc(1)
send(7) = crc(0)
MSComm.Output = send
tt = GetTickCount() '用来超时控制,意思是请求时间上传的命令帧发送过去之后,超时控制时间2000ms内,就应该得到返回消息
Do
Delay_Time 400 '等待400ms
buf = MSComm.Input
first_address(i) = VarPtr(buf)
i = 1
If Len(buf) >= 24 Then
If first_address(i) = i Then
Combo_Meter.AddItem "仪表" & i
End If
i = i + 1
Exit Do
End If
Loop Until GetTickCount() - tt > 2000
If Len(buf) = 0 Then '无上传信息,一般出现这种情况为物理连接断开,或帧传送失败。
Exit Sub
End Iferror: If Err.Number = 8005 Then
MsgBox "端口已经打开", vbDefaultButton1 + 16, "提示信息"
Exit Sub
Else
MsgBox "错误信息为" & Err.Description, vbDefaultButton1 + 48, "提示信息"
End If
End Sub
Dim lngSafeArrayAddress as Long
Dim lngArrayOfLongs(9) as Long
lngSafeArrayAddress = VarPtrArray(lngArrayOfLongs()) 也可以用楼上的方法去取数组内第一个元素的地址.
不过这个元素的地址是否就是数组本身的首地址有待考证.