想做一个VB的小软件通过串口通信来接受单片机给我发的数据(是16进制的一段数据包),我要从接收到的数据包里将我需要的数据提取出来(我需要的信息是:主机编号,上网时间,工作电流,排风电流,排风时间,A/B模块工作状态(分别有4种情况用4种16进制数代表),500风压值,600风压值,检测结果),将提取出16进制数相应的添入到以上需要的信息中。
因为是没做过VB通信,所以不太了解,希望大家能帮忙简单做个小的程序,以便熟悉。谢谢!

解决方案 »

  1.   

    用MSComm这个控件
    一个最最简单的例子!!! 需要command1 text1 mscomm1 各一个; 代码为 
    Private Sub Command1_Click() 
    MSComm1.Output = Text1.Text 
    End Sub Private Sub Form_Load() MSComm1.CommPort = 1 
    MSComm1.Settings = "9600,N,8,1" 
    MSComm1.PortOpen = True End Sub 下面是响应MSComm1_OnComm事件的处理程序,对数据库采集的处理程序采用MSComm事件驱动方式。 Private Sub MSComm1_OnComm() 
    With MSComm1 
    Select case .CommEvent 
    Case .comEvReceive 
    ' 接收数据 
    ' 对数据进行处理 
    case .comEVSend 
    '发送数据 
    case .comEventRxParity 
    '对奇偶校验错误进行处理 
    end select 
    end with 
    end sub 
      

  2.   

    LZ:你的情况需按2进制接收,将接收的字节(BYTE)流转换为16进制字符串,然后进行数据处理。重要的是需要制定明确的上下位机间的通信协议,再收发代码中考虑依据协议作出的算法编写数据接收和处理代码。以下是按2进制接收的代码:
    Option Explicit
        Dim strData As StringPrivate Sub MsComm1_OnComm()
        Dim inByte() As Byte
        Dim i As Integer
        Select Case MsComm1.CommEvent
            Case comEvReceive
            inByte = MsComm1.Input
            For i = 0 To UBound(inByte)
            If Len(Hex(inByte(i))) = 1 Then
                strData = strData & "0" & Hex(inByte(i))
            Else
                strData = strData & Hex(inByte(i))
            End If
            Next
            Text1.Text = strData
            '以下写符合通信协议规定的判断代码处理接收数据
         End Select
    End SubPrivate Sub Form_Load()
        With MsComm1
            .CommPort = 1
            .Settings = "9600,n,8,1"
            .InBufferCount = 0
            .InputLen = 0
            .RThreshold = 1
            .InputMode = comInputModeBinary '以2进制接收
            .PortOpen = True
        End With
        Text1 = ""
    End Sub
      

  3.   

    用串口调试助手软件先自己调通,然后在用vb,自己弄个最简单的mscomm程序就可以了。接受到数据,按照协议把需要的数据取出来,显示,就ok了。
      

  4.   

    你须确定同事是单片机发送的是ASCII字符传组成16进制数还是BYTE字节流。
      

  5.   

    LZ:那么我在2楼贴出的代码,将接收的2进制BYTE流转换为16进制字符串显示于Text1内,不可能是乱码。
      

  6.   


    BYTE字节流未必都是可打印字符。想必是要用二进制接收方式。楼主你把传输数据的格式定义贴出来。大家就有的放矢了。
      

  7.   

    Private Sub MsComm1_OnComm()
        Dim inByte() As Byte
        Dim varTmp
        Dim i As Integer
        Select Case MsComm1.CommEvent
            Case comEvReceive
            varTmp = MsComm1.Input
            inByte = varTmp
            For i = 0 To UBound(inByte)
                strData = strData & Right("0" & Hex(inByte(i)),2)
            Next
            Text1.Text = strData
            '以下根据数据格式虰处理接收数据
         End Select
    End Sub
      

  8.   

    现在还没有定具体的协议,以为要在近期做这个软件,我又不了解,所以想先自己做一个看看。
    我现在正在看你给我的这个程序,但是我不知道怎么用。你就用一个MsComm1控件就够了吗?(我现在试的这个程序如下,好像我接收是按文本接收,但是我不会改)
    '串口初始化
    Private Sub Form_Load()
      MSComm1.CommPort = 1                 '设置通信端口号为COM1
      MSComm1.Settings = "9600,n,8,1"      '设置串口参数
      MSComm1.PortOpen = True
      MSComm1.InputMode = 1                '接收文本型数据
    End Sub
    '打开通信端口
    '把字符通过串口发送出去
    Private Sub Cmdsend_Click()
      If MSComm1.PortOpen = False Then MSComm1.PortOpen = True
      MSComm1.Output = Trim(Textsend.Text)
    End Sub
    Private Sub CmdReceive_Click()
      Dim buf$
      Timer1.Enabled = False
      buf = Trim(MSComm1.Input)      '将缓冲区内的数据读入buf变量中
      If Len(buf) = 0 Then           '判断缓冲区内是否存在数据
        TextReceive.Text = ""
      Else
        TextReceive.Text = buf
      End If
    End Sub
    '启动定时器
    '进入自动接收模式
    Private Sub Cmdauto_Click()
      Timer1.Enabled = True
    End Sub'定时自动从输入缓冲区读取字符
    Private Sub Timer1_Timer()
      If MSComm1.InBufferCount > 0 Then
        TextReceive.Text = TextReceive.Text + MSComm1.Input
      End If
    End Sub
    '关闭通信端口,停止程序运行
    Private Sub Cmdquit_Click()
      MSComm1.PortOpen = False
      End
    End Sub
      

  9.   

    LZ:你的InputMode 属性用错,应该为MSComm1.InputMode = 0,见以下MSDN说明:
    InputMode 属性
    设置或返回 Input 属性取回的数据的类型。
    语法
    object.InputMode [ = value ]
    InputMode 属性语法包括下列部分:
    部分 描述 
    object 对象表达式,其值是“应用于”列表中的对象。 
    value 值或常数,确定输入模式,如“设置值”中所描述。 
    设置值
    value 的设置值是:
    常数 值 描述 
    comInputModeText 0 (缺省)数据通过 Input 属性以文本形式取回。 
    comInputModeBinary 1 数据通过 Input 属性以二进制形式取回。
     
    Option Explicit
        Dim strData As StringPrivate Sub MsComm1_OnComm()
        'Dim inByte() As Byte
        'Dim i As Integer
        Select Case MSComm1.CommEvent
            Case comEvReceive
            strData = strData & MSComm1.Input
            Text1.Text = strData
            '以下写符合通信协议规定的判断代码处理接收数据
         End Select
    End SubPrivate Sub Form_Load()
        With MSComm1
            .CommPort = 1
            .Settings = "9600,n,8,1"
            .InBufferCount = 0
            .InputLen = 0
            .RThreshold = 1
            '.InputMode = comInputModeBinary '以2进制接收
            .InputMode = comInputModeText '以文本方式接收
            .PortOpen = True
        End With
        Text1 = ""
    End Sub
      

  10.   

    本软件公司急招VB开发人员,条件如下,待遇从优,工作地点:深圳市科技园。有意者请与我(开发部主管)联系:0755-26037576
    1、年龄:25-35岁;
    2、学历及专业:必须为正规全国统招全日制本科以上学历,计算机或相关专业,两年以上软件开发工作经验;
    3、熟练使用VB开发语言,并能够熟练使用这种语言进行GUI/WinForm界面功能的开发;
    4、精通SQL Server、ORACLE数据库应用程序的开发;精通数据库存储过程的开发;对数据库应用性能优化有丰富经验;
    5、熟悉面向对象的分析设计技术和工具,包括UML建模、Rose应用;
    6、了解CMMI软件过程方法。
    7、有积极的工作态度,勤奋踏实,沟通和学习能力较好,能积极面对工作压力,善于和各种背景的人合作;
    8、有企业管理软件开发经验者优先,有行业背景(如:制造业、财政、房地产等,)或业务知识(如:财务、HR、供应链等)尤佳。
      

  11.   

    我试了你的程序,和我同事可以正常的接收了,我想问问你要是接收到了,怎么能够显示出来,还有现在的text1不能编辑,收的太多就看不到了。(因为现在是试,发的都是单字节的数据,要是个数据包程序还用变化吗?)
    谢谢你!
      

  12.   

    我明白你的意思了,获取的信息顺序暂时是这样的,日期,时分,主机编号,上网时间,工作电流,排风电流,排风时间,TCU状态,400风压值,500风压值,600风压值,检测结果。如果按这个顺序我怎么能收到这个数据包,然后怎么提取出来显示记录呢?
      

  13.   

    通过你的说明,我能明白点了,那这个程序数据包也可以正常接收吗?要是我收到后怎么能给他显示出来和记录呢?
    Option Explicit
        Dim strData As StringPrivate Sub MsComm1_OnComm()
        Dim inByte() As Byte
        Dim i As Integer
        Select Case MSComm1.CommEvent
            Case comEvReceive
            inByte = MSComm1.Input
            For i = 0 To UBound(inByte)
            If Len(Hex(inByte(i))) = 1 Then
                strData = strData & "0" & Hex(inByte(i))
            Else
                strData = strData & Hex(inByte(i))
            End If
            Next
            Text1.Text = strData
            '以下写符合通信协议规定的判断代码处理接收数据
         End Select
    End SubPrivate Sub Form_Load()
        With MSComm1
            .CommPort = 1
            .Settings = "9600,n,8,1"
            .InBufferCount = 0
            .InputLen = 0
            .RThreshold = 1
            .InputMode = comInputModeBinary '以2进制接收
            .PortOpen = True
        End With
        Text1 = ""
    End Sub'关闭通信端口,停止程序运行
    Private Sub Cmdquit_Click()
      MSComm1.PortOpen = False
      End
    End Sub
      

  14.   

    哦这样,那现在我收的地数据怎么在text框中编辑,因为现在不能换行。你能留个联系方式吗?(QQ)等我知道数据格式后能帮我看看程序不?
      

  15.   

    LZ:是暂时放文本框显示下,表示收到数据包了。应该赋值给STRING变量,按要求分割,一一取出(用MID函数),并清除之,等待下次接收。
    给段代码实例,将数据处理到EXCEL表格的:
    Private Sub MSComm1_OnComm()
        Dim strsj As String
        Static sum1 As Integer
        Static sum As Integer
        Select Case MSComm1.CommEvent
            Case 2
            MSComm1.InputLen = 0
            strsj = MSComm1.Input
            strData = strData & strsj
            If Mid(strData, 1, 4) = "Data" And Right(strData, 3) = Chr(27) & "@@" Then
                sum1 = sum1 + 1
                Text2 = sum1
                If sum1 Mod 5 = 0 Then
                sum = sum + 1
                Text1 = sum
                Dim j As Integer
                For j = 0 To 30
                    Label1(j) = "0.0"
                    Label1(j).BackColor = vbGreen
                Next
                Dim sjfg() As String
                sjfg = Split(strData, Chr(27) & "@")
                Dim i As Integer
                'Set xlapp = CreateObject("excel.application")
                'xlapp.Visible = True
                'Set xlBook = xlapp.Workbooks.Add
                'Set xlBook = xlapp.Workbooks.Open(App.Path & "\报表.xlt") '打开EXCEL工作簿
                'Set xlSheet = xlBook.worksheets(1)
                xlSheet.Cells(2, 2) = Date$ 'Mid(sjfg(0), 7, 10)
                xlSheet.Cells(2, 20) = sjfg(1) 'Mid(sjfg(1), 1, 9)
                'xlSheet.Cells(sum + 1, 3) = Mid(sjfg(2), 1, 2)
                'xlSheet.Cells(sum + 1, 4) = Mid(sjfg(2), 5, 13)
                For i = 3 To UBound(sjfg) - 1
                    xlSheet.Cells(sum + 3, 1) = Right(sjfg(0), 5) ' "Date"
                    'xlSheet.Cells(sum, Val(Mid(sjfg(i), 1, 2)) + 4) = Val(Mid(sjfg(i), 1, 2))
                    xlSheet.Cells(sum + 3, Val(Mid(sjfg(i), 1, 2)) + 3) = Mid(sjfg(i), 6, 5)
                    If Mid(sjfg(i), 1, 2) <> 0 Then
                        Label1(Val(Mid(sjfg(i), 1, 2))).Caption = Mid(sjfg(i), 6, 5)
                        Label1(Val(Mid(sjfg(i), 1, 2))).BackColor = vbRed
                    Else
                    End If
                Next
                End If
                strData = ""
                ReDim sjfg(0)
                sjfg = Split(strData, Chr(13))
            End If
        End Select
    End Sub
      

  16.   

    好的,我看看,刚才傻了,文本框可以设置的,因为刚学VB,反应很慢。能留个QQ吗, 我看你懂得挺多,想以后知道通信协议后进一步请教。