VB 串口接收变长数组问题

wudianjun2001 2013-08-24 09:16:42
串口要接收的数据时不定长的,有可能是9个字节,也有可能是12个字节等等,我的思路是采取一个字节然后判断处理一次,但不对,程序如下,请高手指点

'初始化
intBuad = 19200
RecvNum = 1

With comISP
'.CommPort = 1

Select Case intBuad
Case 9600
.Settings = "9600,E,8,1" '设置通信端口参数 9600赫兹、偶校验、8个数据位、1个停止位
Case 19200
.Settings = "19200,E,8,1" '设置通信端口参数 19200赫兹、偶校验、8个数据位、1个停止位
Case Else
.Settings = "9600,E,8,1" '设置通信端口参数 9600赫兹、偶校验、8个数据位、1个停止位.9600
End Select

.InBufferSize = 20 '设置缓冲区接收数据为40字节
.InputLen = RecvNum '设置Input一次从接收缓冲读取字节数为1
'.PortOpen = True
.InBufferCount = 0 '清除接收缓冲区
.OutBufferCount = 0 '清除发送缓冲区
.RThreshold = RecvNum '设置接收1个字节就产生OnComm事件
.InputMode = comInputModeBinary '接收字节为2进制模式
End With

RecvCount = 0
Recving = False


'接收处理
Private Sub comISP_OnComm()
Dim i As Integer
Dim Sum As Integer
Dim str As String

str = "rx:"

With comISP
Select Case .CommEvent '判断通信事件
Case comEvReceive: '收到Rthreshold个字节产生的接收事件

Buffer = 0
Buffer = comISP.Input

Recv_Buf(RecvCount) = Buffer(0)

If Recving = False Then
If Recv_Buf(RecvCount) = PAD_ADD Then
RecvCount = 0
Recv_Buf(RecvCount) = PAD_ADD
Recving = True
End If
Else
RecvCount = RecvCount + 1

If (Recv_Buf(CMD_NUM) = &H4 And RecvCount = 8) _
Or (Recv_Buf(CMD_NUM) = &H6 And RecvCount = 8) _
Or (Recv_Buf(CMD_NUM) = &H10 And RecvCount = 11) Then

Recving = False
For i = 0 To RecvCount - 1 Step 1
str = str & Right("00" & Hex(Recv_Buf(i)), 2) & " "
Next
txtRecv.Text = txtRecv.Text & str & vbCrLf
RecvCount = 0
If Recv_Buf(ADD_NUM) = PAD_ADD Then '数据正确的话处理
comISP.InBufferCount = 0 '清除接收缓冲区

Select Case Recv_Buf(CMD_NUM)
Case &H4 '读
If (Recv_Buf(REGH_NUM) = &H13) And (Recv_Buf(REGL_NUM) = &H2D) Then '地址
Add_Reply
ElseIf (Recv_Buf(REGH_NUM) = &H7) And (Recv_Buf(REGL_NUM) = &HE0) Then '温度
Temper_Reply
End If

Case &H6 '清总累
If (Recv_Buf(REGH_NUM) = &HA) And (Recv_Buf(REGL_NUM) = &H2F) Then '清总累1
Flow_Total = 0
Clear_Total1_Reply
End If

Case &H10 '写
If (Recv_Buf(REGH_NUM) = &H13) And (Recv_Buf(REGL_NUM) = &H2F) Then '写波特率
Write_Buad_Reply
End If

End Select
Else '数据出错处理
RecvCount = 0
comISP.InBufferCount = 0 '清除接收缓冲区
End If
End If
End If

End Select
End With
End Sub

...全文
352 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
wudianjun2001 2013-08-24
  • 打赏
  • 举报
回复
问题解决,多谢楼上,给分
zdingyun 2013-08-24
  • 打赏
  • 举报
回复
引用 3 楼 wudianjun2001 的回复:
那我接收几个字节触发一次中断接收???
根据数据帧首尾字节值来判断是否接收到完整帧,然后进入数据处理。
wudianjun2001 2013-08-24
  • 打赏
  • 举报
回复
引用 1 楼 worldy 的回复:
数组长度不用你管,你定义一个Variant变量接收数据就是了 dim vIN as varinat vin=mscomm1.input din l as long l=ubound(vIN)+1'这就是接收的长度
那我接收几个字节触发一次中断接收???
worldy 2013-08-24
  • 打赏
  • 举报
回复
数组长度不用你管,你定义一个Variant变量接收数据就是了 dim vIN as varinat vin=mscomm1.input din l as long l=ubound(vIN)+1'这就是接收的长度

7,785

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧