用VB做串口上位机程序碰到的问题
单片机发送数据给上位机,上位机通过VB的MSCOMM插件接收数据,需要把单片机发送的数据分别写入对应的上位机text文本框问题:所有通过MSCOMM接收到的数据都显示在了text1文本框中,怎么把读到的一串数据分别写入对应的文本框中。怎么分开然后存入数组中?
程序代码:
显示效果:,我想把01写入text1文本,03写入text2文本,0E写入text3文本。请教该怎么做? VB有分段函数。
去查VB的库函数。尤其是string操作的函数有很多可以用。 xpstudio2011 发表于 2015-8-18 11:50
VB有分段函数。
去查VB的库函数。尤其是string操作的函数有很多可以用。
可否给个例子,刚开始学VB很多东西不熟悉 还在用VB6.0?感觉有点淘汰了,虽然我也只会VB6. 只能用来自己调试用。 可以考虑用你的消息串中不会出现的字符,比如说@符号分隔你的消息段,然后用VB的split函数通过该字符分割字符串,然后按照顺序慢慢弄。 bg0ek 发表于 2015-8-19 02:02
可以考虑用你的消息串中不会出现的字符,比如说@符号分隔你的消息段,然后用VB的split函数通过该字符分割字 ...
split是分割字符串的,我收到的数是二进制数,貌似分割不了吧 miaoguoqiang 发表于 2015-8-18 22:52
还在用VB6.0?感觉有点淘汰了,虽然我也只会VB6. 只能用来自己调试用。
VB6虽然老旧,但是开发速度是优势,做界面也简单容易。软件只是工具,提高算法与解决问题的能力才是王道{:3_52:} VB6比.NET简单的多,.NET语法上感觉太啰嗦,可能是为了编大型软件需要吧 有数据包头 不? 有数据标识不? 分析数据再填入相应的位置咯 你text1内容已经是一个字符串了..可以先用个变量存了.然后用mid随便截取
Mid(string, start[, length]) luguobing 发表于 2015-8-20 09:43
有数据包头 不? 有数据标识不? 分析数据再填入相应的位置咯
没有,是基于MODBUS协议 xstt 发表于 2015-8-20 09:55
你text1内容已经是一个字符串了..可以先用个变量存了.然后用mid随便截取
Mid(string, start[, length]) ...
我收到的数是二进制数,不是收字符串。现在调的还有点问题,下位机单片机中断方式发送一帧数据给上位机,上位机接收部分必须加Msgbox,最后文本框才能收到接收数组里数据,不加Msgbox,同样的语句收到0,只有偶尔几个RevData(几)接收到是正确的
Private Sub MSComm1_OnComm()
Dim RevData(255) As Byte
Dim showdata(255) As Byte
Dim hk As Variant
Dim i As Integer
Select Case MSComm1.CommEvent
Case comEvReceive ' 收到 RThreshold # ofchars.
i = 0
RE: hk = MSComm1.Input
Msgbox RevData(i)
RevData(i) = hk(0)
i = i + 1
If (MSComm1.InBufferCount <> 0) Then
GoTo RE
End If
Text1.Text = Hex(RevData(11))
End Select
End Sub
感觉上RevData(i) = hk(0) ,i++ ,已经收到了正确的数据了,但是最后那里text1.text = Hex(RevData(I))那里又总是提取不到正确的值 楼主位代码贴上来 Private Sub MSComm1_OnComm() '串口把接收的数据转发到网络
Static n As Integer
Dim BytReceived() As Byte
Dim strBuff As String
Dim i As Integer
Select Case MSComm1.CommEvent '事件发生
Case 2
MSComm1.InputLen = 0
strBuff = MSComm1.Input
BytReceived() = strBuff
End Select
End Sub
看我的代码,BytReceived这个时候已经是接收到数据的数组了可以用 UBound 函数计算接收的数组最大下标,最后按 下标去访问数 luguobing 发表于 2015-8-20 15:26
Private Sub MSComm1_OnComm() '串口把接收的数据转 ...
能否帮我看看我的代码哪里有问题?
中间不加Msgbox语句,读出的值是0。中间加了一条Msgbox语句,读出的值正确。但是会收到一个字节就弹出一个Msgbox比较麻烦 叫你贴代码,你截图干毛线啊? luguobing 发表于 2015-8-20 16:24
叫你贴代码,你截图干毛线啊?
Private Sub MSComm1_OnComm()
Dim RevData(255) As Byte
Dim hk As Variant
Dim i As Integer
Select Case MSComm1.CommEvent
Case comEvReceive ' 收到 RThreshold # ofchars.
i = 0
RE: hk = MSComm1.Input
RevData(i) = hk(0)
i = i + 1
If (MSComm1.InBufferCount <> 0) Then
GoTo RE
End If
Text1.Text = Hex(RevData(0))
End Select
End Sub 大金刚 发表于 2015-8-20 16:41
Private Sub MSComm1_OnComm()
Dim RevData(255) As Byte
Dim hk As Variant
Private Sub MSComm1_OnComm()
Dim RevData() As Byte
Dim hk As String
Dim i As Integer
Select Case MSComm1.CommEvent
Case 2 ' 收到 RThreshold # ofchars.
hk = MSComm1.Input
RevData() = hk
For i = 0 To UBound(RevData)
Text1.Text = Text1.Text & RevData(i) & ""
Next
End Select
End Sub luguobing 发表于 2015-8-20 16:56
Private Sub MSComm1_OnComm()
Dim RevData() As Byte
Dim hk As String
无语,我下位机发送的是十六进制数,你这样取出来的是字符串,我要取接收到的数组中的某个HEX值赋给text文本框 大金刚 发表于 2015-8-20 17:14
无语,我下位机发送的是十六进制数,你这样取出来的是字符串,我要取接收到的数组中的某个HEX值赋给text ...
无语什么,那你就按 RevData 数组下标访问咯。还有一个问题是,你接收多少个字节后引起串口事件的? 比如我这里, MSComm1.InputMode = comInputModeBinary
MSComm1.RThreshold = 5
那就是以二进制方式接收,接收缓冲区有5个字节就中断一次
我给你的代码是,把接收到的数据全部放到文本框,至于你想要哪个,谁知道 luguobing 发表于 2015-8-20 17:29
比如我这里, MSComm1.InputMode = comInputModeBinary
MSComm1.RThresh ...
我是接收缓冲区收到1个就去中断,但是并不是像你说的那样读数组号能读到数据 多年使用代码,信不信由你,你的代码是多余的
Private Sub MSComm1_OnComm()
Dim ReData() As Byte
Dim strBuff As String
Dim i As Integer
Select Case MSComm1.CommEvent '事件发生
Case 2
DoEvents
MSComm1.InputLen = 0
strBuff = MSComm1.Input
ReData() = strBuff
If UBound(ReData) = 4 Then
If ReData(4) = &H2B And ReData(0) = &H52 Then
Select Case ReData(1)
Case &H2 '下降
If ReData(2) = 1 Then
If ON1 = 1 Then
JIXIE_FLAG = 2
End If
Else
FLAG_ERROR_RUNING = 1
FLAG_ERROR_DAYIN = 2
MsgBox "下降错误", vbCritical, "提示"
End If
Case &H3 '关盒子
If ReData(2) = 1 Then
If ON1 = 1 Then
JIXIE_FLAG = 3
End If
Else
FLAG_ERROR_RUNING = 1
FLAG_ERROR_DAYIN = 3
MsgBox "关盒子错误", vbCritical, "提示"
End If
Case &H4 '出结果
If ReData(2) = 1 Then
If ON1 = 1 Then
JIXIE_FLAG = 4
End If
Else
FLAG_ERROR_RUNING = 1
FLAG_ERROR_DAYIN = 4
MsgBox "出结果错误", vbCritical, "提示"
End If
Case &H5 '上升
If ReData(2) = 1 Then
If ON1 = 1 Then
JIXIE_FLAG = 5
FLAG_YAFEN = 1
set_time = SET_DaoJiSHi
End If
Else
FLAG_ERROR_RUNING = 1
FLAG_ERROR_DAYIN = 5
MsgBox "上升错误", vbCritical, "提示"
End If
Case &H6 '开宝盒
If ReData(2) = 1 Then
If ON1 = 1 Then
JIXIE_FLAG = 6
End If
Else
FLAG_ERROR_RUNING = 1
FLAG_ERROR_DAYIN = 6
MsgBox "开盒子错误", vbCritical, "提示"
End If
Case &H1 '顶球
If ReData(2) = 1 Then
If ON1 = 1 Then
JIXIE_FLAG = 1
End If
Else
FLAG_ERROR_RUNING = 1
FLAG_ERROR_DAYIN = 1
MsgBox "顶球错误", vbCritical, "提示"
End If
Case &HF '复位成功
If ON1 = 0 Then
JIXIE_FLAG = 1
ON1 = 1
End If
End Select
End If
End If
End Select
End Sub 通讯控件中的InputLen属性设置的是多少? 楼主参考一下本坛这个帖子,提供了很多有关串口的代码,可以找你需要的:
http://www.amobbs.com/forum.php?mod=viewthread&tid=5499096&highlight=vb
问题已经解决了,设置接收长度就可以了
页:
[1]