大金刚 发表于 2015-8-18 11:44:57

用VB做串口上位机程序碰到的问题

单片机发送数据给上位机,上位机通过VB的MSCOMM插件接收数据,需要把单片机发送的数据分别写入对应的上位机text文本框
问题:所有通过MSCOMM接收到的数据都显示在了text1文本框中,怎么把读到的一串数据分别写入对应的文本框中。怎么分开然后存入数组中?

程序代码:

大金刚 发表于 2015-8-18 11:48:30

显示效果:,我想把01写入text1文本,03写入text2文本,0E写入text3文本。请教该怎么做?

xpstudio2011 发表于 2015-8-18 11:50:15

VB有分段函数。
去查VB的库函数。尤其是string操作的函数有很多可以用。

大金刚 发表于 2015-8-18 14:32:33

xpstudio2011 发表于 2015-8-18 11:50
VB有分段函数。
去查VB的库函数。尤其是string操作的函数有很多可以用。

可否给个例子,刚开始学VB很多东西不熟悉

miaoguoqiang 发表于 2015-8-18 22:52:43

还在用VB6.0?感觉有点淘汰了,虽然我也只会VB6. 只能用来自己调试用。

bg0ek 发表于 2015-8-19 02:02:41

可以考虑用你的消息串中不会出现的字符,比如说@符号分隔你的消息段,然后用VB的split函数通过该字符分割字符串,然后按照顺序慢慢弄。

大金刚 发表于 2015-8-20 08:36:04

bg0ek 发表于 2015-8-19 02:02
可以考虑用你的消息串中不会出现的字符,比如说@符号分隔你的消息段,然后用VB的split函数通过该字符分割字 ...

split是分割字符串的,我收到的数是二进制数,貌似分割不了吧

大金刚 发表于 2015-8-20 08:38:29

miaoguoqiang 发表于 2015-8-18 22:52
还在用VB6.0?感觉有点淘汰了,虽然我也只会VB6. 只能用来自己调试用。

VB6虽然老旧,但是开发速度是优势,做界面也简单容易。软件只是工具,提高算法与解决问题的能力才是王道{:3_52:}

modbus 发表于 2015-8-20 09:10:32

VB6比.NET简单的多,.NET语法上感觉太啰嗦,可能是为了编大型软件需要吧

luguobing 发表于 2015-8-20 09:43:26

有数据包头 不?    有数据标识不?   分析数据再填入相应的位置咯

xstt 发表于 2015-8-20 09:55:03

你text1内容已经是一个字符串了..可以先用个变量存了.然后用mid随便截取
Mid(string, start[, length])

大金刚 发表于 2015-8-20 13:44:26

luguobing 发表于 2015-8-20 09:43
有数据包头 不?    有数据标识不?   分析数据再填入相应的位置咯

没有,是基于MODBUS协议

大金刚 发表于 2015-8-20 13:48:42

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

大金刚 发表于 2015-8-20 13:52:00

感觉上RevData(i) = hk(0) ,i++ ,已经收到了正确的数据了,但是最后那里text1.text = Hex(RevData(I))那里又总是提取不到正确的值

luguobing 发表于 2015-8-20 15:22:03

楼主位代码贴上来

luguobing 发表于 2015-8-20 15:26:38

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 函数计算接收的数组最大下标,最后按 下标去访问数

大金刚 发表于 2015-8-20 15:58:08

luguobing 发表于 2015-8-20 15:26
Private Sub MSComm1_OnComm()                                                    '串口把接收的数据转 ...

能否帮我看看我的代码哪里有问题?
中间不加Msgbox语句,读出的值是0。中间加了一条Msgbox语句,读出的值正确。但是会收到一个字节就弹出一个Msgbox比较麻烦

luguobing 发表于 2015-8-20 16:24:18

叫你贴代码,你截图干毛线啊?

大金刚 发表于 2015-8-20 16:41:48

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

luguobing 发表于 2015-8-20 16:56:31

大金刚 发表于 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

大金刚 发表于 2015-8-20 17:14:13

luguobing 发表于 2015-8-20 16:56
Private Sub MSComm1_OnComm()
    Dim RevData() As Byte
    Dim hk As String


无语,我下位机发送的是十六进制数,你这样取出来的是字符串,我要取接收到的数组中的某个HEX值赋给text文本框

luguobing 发表于 2015-8-20 17:22:51

大金刚 发表于 2015-8-20 17:14
无语,我下位机发送的是十六进制数,你这样取出来的是字符串,我要取接收到的数组中的某个HEX值赋给text ...

无语什么,那你就按 RevData 数组下标访问咯。还有一个问题是,你接收多少个字节后引起串口事件的?

luguobing 发表于 2015-8-20 17:29:25

比如我这里,      MSComm1.InputMode = comInputModeBinary
                        MSComm1.RThreshold = 5

那就是以二进制方式接收,接收缓冲区有5个字节就中断一次

我给你的代码是,把接收到的数据全部放到文本框,至于你想要哪个,谁知道

大金刚 发表于 2015-8-20 17:32:27

luguobing 发表于 2015-8-20 17:29
比如我这里,      MSComm1.InputMode = comInputModeBinary
                        MSComm1.RThresh ...

我是接收缓冲区收到1个就去中断,但是并不是像你说的那样读数组号能读到数据

luguobing 发表于 2015-8-20 17:37:46

多年使用代码,信不信由你,你的代码是多余的

luguobing 发表于 2015-8-20 17:40:00


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

modbus 发表于 2015-8-20 18:04:39

通讯控件中的InputLen属性设置的是多少?

mndsoft2012 发表于 2015-8-20 18:46:01

楼主参考一下本坛这个帖子,提供了很多有关串口的代码,可以找你需要的:
http://www.amobbs.com/forum.php?mod=viewthread&tid=5499096&highlight=vb

大金刚 发表于 2015-8-21 16:07:06

问题已经解决了,设置接收长度就可以了
页: [1]
查看完整版本: 用VB做串口上位机程序碰到的问题