我用MSComm做一个控制程序.可以发送数据.但只能收到一个字节的数据,且InputLen是为0的.
硬件肯定没问题的,用附带程序工作正常.我的程序在发送数据也正常,因为它能正确响应我的指令.但奇怪的是我的程序不能正确接收数据.当我发送查询指令时,正确是能收到两个字节的,但是我的程序只能收到一个字节(InputLen属性为0,郁闷~~).
以下是初始化代码,其它均用默认值
comm.CommPort = 1
comm.RThreshold = 1
comm.InputMode = comInputModeBinary
comm.PortOpen = True
以下是接收代码
Private Sub comm_OnComm()
Dim bin() As Byte, buf As String
Dim x As Long
x = comm.InputLen
If x = 0 Then
buf = comm.Input
Else
For x = x To 0 Step -1
buf = buf & comm.Input
Next
End If
bin = buf
....
硬件肯定没问题的,用附带程序工作正常.我的程序在发送数据也正常,因为它能正确响应我的指令.但奇怪的是我的程序不能正确接收数据.当我发送查询指令时,正确是能收到两个字节的,但是我的程序只能收到一个字节(InputLen属性为0,郁闷~~).
以下是初始化代码,其它均用默认值
comm.CommPort = 1
comm.RThreshold = 1
comm.InputMode = comInputModeBinary
comm.PortOpen = True
以下是接收代码
Private Sub comm_OnComm()
Dim bin() As Byte, buf As String
Dim x As Long
x = comm.InputLen
If x = 0 Then
buf = comm.Input
Else
For x = x To 0 Step -1
buf = buf & comm.Input
Next
End If
bin = buf
....
这是我的一个接收程序,你可以参考一下
Private Sub MSComm1_OnComm()
'打开错误处理陷阱
On Error GoTo ErrGoto
'----------------------------------------------------
Dim bytReceiveArray() As Byte '接收数据缓冲区
Static bytReceiveData() As Byte '接收的数据
Static intReceiveNum As Integer '接收的数据个数
Dim VarReceiveData As Variant '接收的变体数据
Dim CRC16H As Byte
Dim CRC16L As Byte
Static intGetDataLen As Integer '接收数据的帧长度
Dim lngTypeLen(0 To 3) As Long '数据类型的长度
Dim bytData As BYTEData
Dim intData As INTEGERData
Dim lngData As LONGData
Dim sngData As SINGLEData
Dim bytAddr As Byte
Dim varData() As Variant
Dim bytNum As Byte
Dim bytType As Byte
Dim i As Long
Dim j As Long
lngTypeLen(0) = 1
lngTypeLen(1) = 2
lngTypeLen(2) = 4
lngTypeLen(3) = 4
Static bFindDataTop As Boolean
Dim lngDataLen As Long
'数据接收
If MSComm1.CommEvent = comEvReceive And MSComm1.InBufferCount > 0 Then
'-------------------------------
VarReceiveData = MSComm1.Input
ReDim bytReceiveArray(0) As Byte
bytReceiveArray = VarReceiveData
lngDataLen = intReceiveNum + UBound(bytReceiveArray)
ReDim Preserve bytReceiveData(0 To lngDataLen) As Byte
For i = intReceiveNum To lngDataLen
bytReceiveData(i) = bytReceiveArray(i - intReceiveNum)
Next
intReceiveNum = lngDataLen + 1
'-------------------------------
'接收的数据个数大于2 且 没有找到数据头
If intReceiveNum > 2 And bFindDataTop = False Then
bytType = bytReceiveData(1)
bytNum = bytReceiveData(2)
'找到数据头
If bytReceiveData(0) = &HAC And bytType < 4 Then
If lngTypeLen(bytType) * bytNum < 256 Then
'已找到数据头
bFindDataTop = True
'要接收的数据个数
intGetDataLen = bytNum * lngTypeLen(bytType) + 6
Else
CleanUpData intReceiveNum, bytReceiveData
bFindDataTop = False
Exit Sub
End If
Else
'没有找到数据头
CleanUpData intReceiveNum, bytReceiveData
bFindDataTop = False
Exit Sub
End If
End If
'接收的数据个数等于或大于要接收的数据个数 且 已找到数据头
If intReceiveNum >= intGetDataLen And bFindDataTop = True Then
'--------------------------------------------
bytType = bytReceiveData(1)
bytNum = bytReceiveData(2)
bytAddr = bytReceiveData(3)
Call CRC16(bytReceiveData, intGetDataLen - 2, CRC16H, CRC16L)
'CRC16校验检验
If CRC16H = bytReceiveData(intGetDataLen - 2) And CRC16L = bytReceiveData(intGetDataLen - 1) Then
'-----------------------------------------------------
ReDim varData(0 To bytNum - 1) As Variant
Select Case bytType
Case 0 'byte
For i = 0 To bytNum - 1
varData(i) = bytReceiveData(i + 4)
Next
Case 1 'integer
For i = 0 To bytNum - 1
For j = 0 To 1
bytData.bytData(j) = bytReceiveData(i * 2 + j + 4)
Next
LSet intData = bytData
varData(i) = intData.intData
Next
Case 2 'long
For i = 0 To bytNum - 1
For j = 0 To 3
bytData.bytData(j) = bytReceiveData(i * 4 + j + 4)
Next
LSet lngData = bytData
varData(i) = lngData.lngData
Next
Case 3 'single
For i = 0 To bytNum - 1
For j = 0 To 3
bytData.bytData(j) = bytReceiveData(i * 4 + j + 4)
Next
LSet sngData = bytData
varData(i) = sngData.sngData
Next
End Select
'触发接收数据事件
RaiseEvent InceptData(bytAddr, varData, bytNum, bytType)
Else
'清理数据
CleanUpData intReceiveNum, bytReceiveData
bFindDataTop = False
Exit Sub
End If
'--------------------------------------------
'为下一帧数据整理数据头
If intReceiveNum > intGetDataLen Then
CleanUpData intReceiveNum, bytReceiveData, intGetDataLen
Else
intReceiveNum = 0
End If
bFindDataTop = False
End If
End If
'----------------------------------------------------
Exit Sub
'-----------------------------
ErrGoto:
bFindDataTop = False
End Sub