MSComm串口无法接收到数据

barbaraandapple 2009-04-15 11:49:05
在某位高手的帮助下我这个初学者自己编写了这个程序,但是调试时发现接收不到数据,请各位看看,哪儿出问题了?(估计问题挺多~)

发送数据1A,60,04 需接收到数据 1B,61,4x,04(x=1或2)
发送数据1A,64,04 需接收到数据1B,64,31,31,31,04

以下是我的程序(因为每次发送和接收的字节数不固定,所以就下不了手了)

'初始化
Private Sub Form_Load()
MSComm1.CommPort = 1 '选择通道1
MSComm1.Settings = "4800,n,8,1"
MSComm1.InputMode = CommInputModeText 'ASCII接收
MSComm1.RThreshold = 2 '接受缓冲区每收到2个字符产生oncomm事件
MSComm1.SThreshold = 1 '传输缓冲区为空时产生oncomm事件
MSComm1.PortOpen = True '打开端口
End Sub

Private Sub selfcheck_Click()
Dim selfcheck As String
selfcheck = "1A" & "60" & "04"
MSComm1.Output = selfcheck
End Sub

'发送校准请求
Private Sub 校准请求_Click()
Dim Calibration As String
Calibration = "1A" & "64" & "04"
MSComm1.Output = Calibration
End Sub

Private Sub MSComm1_OnComm()
Dim inbuff As String
Select Case MSComm1.CommEvent
Case comEvReceive
inbuff = MSComm1.Input
'读取自检信号
If Mid(inbuff, 1, 2) = "1B" And Right(inbuff, 2) = "04" Then '数据判断处理
Text1 = inbuff
If Mid(inbuff, 5, 2) = "41" Then
自检结果显示.Caption = "normal"
ElseIf Mid(inbuff, 5, 2) = "42" Then
自检结果显示.Caption = "RAM Error"
ElseIf Mid(inbuff, 5, 3) = "43" Then
自检结果显示.Caption = "ROM Error"
End If
End If
'接收校准信号
If Mid(inbuff, 1, 2) = "1B" And Mid(inbuff, 3, 2) = "64" And Right(inbuff, 2) = "04" Then
Text1 = inbuff
Text4.Text = Mid(inbuff, 5, 6)
End If
End Select
End Sub
...全文
314 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
贝隆 2009-05-17
  • 打赏
  • 举报
回复
MSComm1.InputMode = CommInputModeText 'ASCII接收
这句错误,改为二进制方式
zdingyun 2009-04-20
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 barbaraandapple 的回复:]
能再问个问题伐?因为要发送和接收的东西比较多,要oncomm下面写的内容比较多,有状态监测和出错处理。所以我想采用一个调用,来调用包括自检的处理等等,但不是很确定语句该如何写,能给个例子么?又要麻烦你了~~
[/Quote]
调用过程处理oncomm下面写的内容是可以的。
不是很确定语句那是无法写的。
实际你把oncomm下面写的内容,放一个过程,就是注意变量的作用域。
barbaraandapple 2009-04-19
  • 打赏
  • 举报
回复
能再问个问题伐?因为要发送和接收的东西比较多,要oncomm下面写的内容比较多,有状态监测和出错处理。所以我想采用一个调用,来调用包括自检的处理等等,但不是很确定语句该如何写,能给个例子么?又要麻烦你了~~
barbaraandapple 2009-04-19
  • 打赏
  • 举报
回复
哦~~~通过尾字节来判断接收结束啊!好办法!!谢谢啦~

barbaraandapple 2009-04-19
  • 打赏
  • 举报
回复
啊~不好意思,我看了一下是我打错了,是发60回60的
zdingyun 2009-04-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 barbaraandapple 的回复:]
不好意思我还有个问题,按照你上面的程序来看,是接受到一个字符就读取它呢还是接收到全部字符再读取?因为每次接收的字符长度不同,所以如何判断何时产生oncomm 事件呢?
[/Quote]
持续接收,按接收的数据尾字节判断.接收正确后数据处理,并清除即strSj = ""
zdingyun 2009-04-19
  • 打赏
  • 举报
回复
这是我解决你在VBGOOD时做的代码.放这儿没将Dim bj As string * 2删除.因为你叙述的通信协议有改变.
发送数据1A,60,04 需接收到数据 1B,61,4x,04(x=1或2),发60 回61
原来发送数据1A,60,04 需接收到数据 1B,60,4x,04(x=1或2),发60 回60

Dim bj As string * 2
这是定义1个2字节的string变量,节省内存占用.

数据类型概述
String
(变长) 10 字节加字符串长度 0 到大约 20 亿
String
(定长) 字符串长度 1 到大约 65,400

barbaraandapple 2009-04-19
  • 打赏
  • 举报
回复
不好意思我还有个问题,按照你上面的程序来看,是接受到一个字符就读取它呢还是接收到全部字符再读取?因为每次接收的字符长度不同,所以如何判断何时产生oncomm 事件呢?
barbaraandapple 2009-04-19
  • 打赏
  • 举报
回复
看到你上面的程序了~我有个问题:第三行的定义语句 Dim bj As string *2中的*2是什么意思?还有我发现后面好像没有实际用到bj,请问为什么要定义它
zdingyun 2009-04-16
  • 打赏
  • 举报
回复
Option Explicit
Dim strSj As String
Dim bj As String * 2
Private Sub Form_Load()
'MSComm1初始化
MSComm1.CommPort = 1
MSComm1.Settings = "4800,n,8,2"
MSComm1.InputMode = comInputModeText 'ASCII接收
MSComm1.RThreshold = 1
MSComm1.PortOpen = True
End Sub

Private Sub MSComm1_OnComm()
Dim i As Integer
Select Case MSComm1.CommEvent
Case comEvReceive
strSj = strSj & MSComm1.Input
Text1 = strSj
If Mid(strSj, 1, 4) = "1B61" And Mid(strSj, 7, 2) = "04" Then '数据判断及处理
If Mid(strSj, 5, 2) = "41" Then
Label1.Caption = "normal"
ElseIf Mid(strSj, 5, 2) = "42" Then
Label1.Caption = "RAM Error"
ElseIf Mid(strSj, 5, 2) = "43" Then
Label1.Caption = "ROM Error"
End If
strSj = ""
ElseIf Mid(strSj, 1, 4) = "1B64" And Mid(strSj, 11, 2) = "04" Then
Text2 = strSj
strSj = ""
End If
End Select
End Sub

Private Sub Command1_Click() '发送自检请求命令
Dim sendsj As String
sendsj = "1A6004"
'bj = Mid(sendsj, 3, 2)
MSComm1.Output = sendsj
End Sub

Private Sub Command2_Click()
Dim sendsj As String
sendsj = "1A6404"
'bj = Mid(sendsj, 3, 2)
MSComm1.Output = sendsj
End Sub
zdingyun 2009-04-16
  • 打赏
  • 举报
回复
使用MSComm控件,按2进制方式接收。
Option Explicit
Dim strHex As String
Private Sub Form_Load()
'MSComm1初始化
MSComm1.CommPort = 1
MSComm1.Settings = "4800,n,8,2"
MSComm1.InputMode = comInputModeBinary '2进制接收
MSComm1.RThreshold = 1
MSComm1.PortOpen = True
End Sub

Private Sub MSComm1_OnComm()
Dim inbuff() As Byte
Dim i As Integer
Select Case MSComm1.CommEvent
Case comEvReceive
inbuff = MSComm1.Input
For i = 0 To UBound(inbuff) '将接收的Byte字节流转换为16进制字符串
strHex = strHex & Right("0" & Hex(inbuff(i)), 2)
Next
If Mid(strHex, 1, 2) = "1B" And Len(strHex) = 8 Then '数据判断及处理
Text1 = strHex
If Mid(strHex, 5, 2) = "41" Then
Label1.Caption = "normal"
ElseIf Mid(strHex, 5, 2) = "42" Then
Label1.Caption = "RAM Error"
ElseIf Mid(strHex, 5, 2) = "43" Then
Label1.Caption = "ROM Error"
End If
strHex = ""
End If
End Select
End Sub

Private Sub Command1_Click() '发送自检请求命令
Dim sendsj(2) As Byte
sendsj(0) = &H1A
sendsj(1) = &H60
sendsj(2) = &H4
MSComm1.Output = sendsj
End Sub

Private Sub Command2_Click()
End
End Sub

1,502

社区成员

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

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