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

...全文
327 5 打赏 收藏 转发到动态 举报
写回复
用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'这就是接收的长度
在工程实践中经常需要实现上下位机间的串口通信,为了编程的方便性我们通常采用字符方式进行数据传输,由于需要数据转换以及转换后的数据长度增加,数据传输速度不够理想,为了提高系统实时性在某些特殊场合更需要直接采用二进制进行数据传输。Delphi6.0是一种面向对象的可视化的快速应用开发(RAD)工具,它既具有C++语言的强大功能,同时又有VB的易用性,Delphi6.0的伸缩性强,既可用于开发小项目,也可用于开发大项目,尤其适用于快速应用的开发,其大量优点使它迅速成为一种非常流行的编程语言。Delphi6.0中串口通信的实现方法很多,可以使用嵌入式汇编语言、API函数以及VB的MSComm控件来实现。其中使用MSComm控件来实现串口通信最方便,但有关Delphi如何实现二进制通信的资料很少,大部分参考书都只介绍了VB中MSComm控件的字符通信方式。由于Delphi中数组跟Variant变量不兼容,即在Delphi中字节数组不能直接赋值给MSComm控件的output属性,这跟VB有中很大的不同(VB中可以直接赋值),本人通过摸索总结出两种实现Delphi二进制通信的方法,即动态数组法和可变数组(Variant Array)法,并给出了应用实例。在应用实例中我们使用Delphi的absolute关键字来定义两个同地址的动态数组,类型分别为字节型数组和短整型数组,使用字节动态数组接收数据后,可以直接使用短整型动态数组获得短整型数据,省却了数据转换的麻烦

7,762

社区成员

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

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