请教:如何使用VB的MSCOM控件对不定长有起始和结束标志的数据进行接收(附源码)

chenpeng1979 2007-12-04 03:31:41
本人对不定长有起始和结束标志的字符串数据进行接收时,采用了VB中的MSCOM控件的
ONCOMMON事件对数据进行接收,待接收的数据长度不定,我准备每次使用ONCOMMON
事件接收128个字节,一旦有数据进入接收缓冲区到达128字节,便触发ONCOMMON
事件,具体代码如下:
Private Sub Comm1_OnComm()
Dim buf$
Static counter% ;定义起始位计数器
Select Case Comm1.CommEvent
Case comEvReceive
buf = Comm1.Input
TextBox1.Text = TextBox1.Text + buf
If InStr(buf, "#") > 0 Then ;“#”作为起始和结束标志,该段对#进行记数
counter = counter + 1
End If
If counter = 2 Then ;如果记数为2(起始和结束位被找到),显示传输完毕
Comm1.PortOpen = False
MsgBox "传输完毕"
End If
End Select
End Sub

但实际接收时产生了很多的“?”符号和乱码,不知道程序的编写哪边有问题,希望
高手指教。
...全文
135 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
zdingyun 2007-12-06
  • 打赏
  • 举报
回复
如果在接收中出现?号和乱码,可能是上下位机的通信协议不一致。
当按ASCII字符接收时,即
MSComm1.InputMode = comInputModeText

Private Sub MSComm1_OnComm()
Dim buf As String
Static counter As Integer ';定义起始位计数器
Select Case MSComm1.CommEvent
Case comEvReceive
buf = MSComm1.Input
Text1.Text = Text1.Text + buf
If InStr(buf, "#") > 0 Then ';“#”作为起始和结束标志,该段对#进行记数
counter = counter + 1
Text2 = counter
End If
If counter = 2 Then ';如果记数为2(起始和结束位被找到),显示传输完毕
MSComm1.PortOpen = False
MsgBox "传输完毕"
End If
End Select
End Sub

Private Sub Form_Load()
MSComm1.CommPort = 1
MSComm1.InBufferSize = 2048
MSComm1.OutBufferSize = 1024
MSComm1.Settings = "9600,n,8,1"
MSComm1.InputMode = comInputModeText
MSComm1.RThreshold = 1
MSComm1.PortOpen = True
Text1 = ""
End Sub

只能接收0-127值范围的ASCII字符。
假如接收128-255值范围的ASCII字符,则也可能出现?号和乱码。应改为二进制方式接收 :
MSComm1.InputMode = comInputModeBinary
在MSComm1_OnComm事件中按BYTE数据类型接收,然后转换为16进制的字符串形式显示。


Option Explicit
Dim strData As String
Dim bytInput() As Byte
Dim i As Integer

Private Sub Form_Load()
MSComm1.Settings = "9600,n,8,1"
MSComm1.CommPort = 1
MSComm1.RThreshold = 1
MSComm1.PortOpen = True
End Sub
Private Sub MsComm1_OnComm()
Dim intInputLen As Integer
Select Case Me.MSComm1.CommEvent
Case comEvReceive
'此处添加处理接收的代码
Me.MSComm1.InputMode = comInputModeBinary '二进制接收
intInputLen = Me.MSComm1.InBufferCount
ReDim bytInput(intInputLen)
bytInput = Me.MSComm1.Input
jieshou
End Select
End Sub

Public Function jieshou() '接收数据处理为16进制
Dim i As Integer
For i = 0 To UBound(bytInput)
If Len(Hex(bytInput(i))) = 1 Then
strData = strData & "0" & Hex(bytInput(i))
Else
strData = strData & Hex(bytInput(i))
End If
Next
Text1 = strData
End Function

1,453

社区成员

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

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