我有一台采集数据的仪器     
数据格式如下:
 1 ,1, 1.581 
 1 ,恒Ⅲ94, 1.29, 359.5958, 95.1717, 17.176, 180, 264.4331, 17.176
 2 ,A 1, 0, 282.0358, 57.4157, 14.899, 0, 0, 0
 10 ,D 2, 0, 198.4823, 86.0519, 1.705, 0, 0, 0
 11 ,2, 2, 296.3113, 91.4121, 26.126, 116.3128, 268.19, 26.124
 12 ,2, 2, 296.3115, 91.4123, 26.124, 116.3128, 268.195, 26.124
 13 ,3, 2.15, 187.0534, 89.0756, 42.879, 7.0524, 270.5145, 42.879
 2 ,3, 1.592 
 14 ,1, 2.13, 359.5959, 89.2303, 42.884, 179.5958, 270.3658, 42.885
 14 ,A 1, 0, 321.5439, 77.4724, 19.547, 0, 0, 0
我想用vb编写一个接收这样格式数据的程序
我在网上索很多例子  都说用MSComm1  但我不会用  不知那位高手帮帮忙
我的条件很简单  只要一个接收和保存按扭就行拉  另外就是接收时,一行一行的显示在text1.text中  我的接口是com1   通信口参数为 .Setting=“9600,N,8,1"            

解决方案 »

  1.   

    以下是Mscomm控件的主要属性和方法:   
        
        1)CommPort:设置或返回串行端口号,其取值范围为1~99,缺省为1。   
        
        2)Setting设置或返回串行端口的波特率、奇偶校验位、数据位数、停止位。如:Mscomm.Setting="9600,N,8,1"。   
        
        3)PortOpen:打开或关闭串行端口,格式为:Mscomm.PortOpen={TRUE|FALSE}。   
        
        4)InBufferSize:设置或返回接收缓冲区的大小,缺省为1024字节。   
        
        5)InBufferCount:返回接收缓冲区内的等待读取的字节个数,可通过设置该属性为0来清除接收缓冲区。   
        
        6)RThreshold:该属性为一阀值,它确定当接收缓冲区内字节个数达到或超过该值后就产生代码为MSCOMM_EV_RECEIVE的OnComm事件。   
        
        7)InputLen:设置或返回接收缓冲区内用Input读入的个数。若取0,则INPUT读取整个缓冲区的内容。   
        
        8)Input:该属性表示从接收缓冲区移走一串字符。   
        
        9)OutBufferSize:设置或返回发送缓冲区,缺省为512字节。   
        
        10)OutBufferCounter:返回发送缓冲区内等待发送的字符数,可用来清空缓冲区。   
        
        11)Output:向发送缓冲区传送一字符串。   
        
        12)EOFEnable:若置TRUE,则当输入中出现EOF,就停止输入并产生OnComm事件。   
        
        如果在通信过程中发生错误或事件,就会引发OnComm事件并且改变属性值,由CommEvent属性代码反映错误类型,在通信程序的设计中可根据该属性值来执行不同的操作,以下是部分属性常数值及其含义:   
        
        1)ComEvSend:其值为1,发送缓冲区的内容少于SThreshold指定的值。   
        
        2)ComEvReceive:其值为2,接收缓冲区内字符数达到RThreshold值,该事件在缓冲区中数据被移走前将持续产生。   
        
        3)ComEventFrame:其值为1004,硬件检测到帧错误。   
        
        4)ComEventRxOver:其值为1008,接收缓冲区溢出。   
        
        5)ComEventTxFull:其值为1010,发送缓冲区溢出。   
        
        6)ComEventRxParity:其值为1009,奇偶校验。   
        
        7)ComEvEOF:其值为7,接收数据中出现文件结束(ASCII码为26)字符。
      

  2.   


    Private Sub Form_Load()
        MSComm1.CommPort = 1        '设置或返回端口号,值为1到16的整数,PC通常可以有16个串口
       
        MSComm1.InBufferSize = 1024                 '设置接收缓冲区的大小
        MSComm1.Settings = "9600,n,8,1"           '设置并返回通讯参数,值为字符串String行
        'MSComm1.Settings = BaudRate & ",n,8,1"
        MSComm1.InputLen = 0                        '设置或返回,从接收缓冲区读取的字符数,0时(默认),读取缓冲区全部字符
        MSComm1.RThreshold = 1                      '接收区的“门阀值”,0时(默认),不产生OnComm事件;1时,接收缓冲区每接收到一个字符,都会产生OnComm事件
        MSComm1.SThreshold = 1                      '发送区的“门阀值”,0时(默认),不产生OnComm事件;1时,发送缓冲区每接收到一个字符,都会产生OnComm事件
        MSComm1.InBufferCount = 0
        MSComm1.PortOpen = True                     '通讯时,必须打开串口,应用程序完成时,MSComm控件自动关闭串口
        MSComm1.InputMode = comInputModeText 
                Text1.Text = ""end sub
    private sub mscomm1_oncomm() 
    Dim number As Integer'确认串口事件
    Select Case MSComm1.CommEvent
           
           
           Case comEvReceive           '2 :收到RThreshold个字符,持续产生事件,直到Input属性删除Input缓冲区的数据
                                      
                            Text1.Text = MSComm1.Input &  Text1.Text
       
        
    End Select
    end sub
      

  3.   

    Select Case MSComm1.CommEvent 
          .....
          
          Case comEvReceive          
                                 
           Text1.Text = MSComm1.Input &  Text1.Text & che(13) & chr(10) 
      ......
        
    End Select 
    end subchr(13) & che(10)用来换行
    你自己试着调试试试吧
      

  4.   

    On Error GoTo receivetxterr
        Dim filefree As Integer
        Dim k As Integer
        Dim line, code
        Dim comsetting As String
        Dim nextline As String
        Form1.CommonDialog1.DialogTitle = "保存为拓扑康GTS-701坐标数据文件"
        Form1.CommonDialog1.Filter = "文本文件(*.TXT)|*.TXT|所有文件(*.*)|*.*"
        Form1.CommonDialog1.Flags = &H2
        Form1.CommonDialog1.filename = ""
        Form1.CommonDialog1.ShowSave
        infilename = Form1.CommonDialog1.filename
        If infilename = "" Then
            Exit Sub
        End If
        Form1.Caption = "全站仪与计算机通讯--" + infilename
        comsetting = boundrate & "," & eocheck & "," & dataevent & "," & stopevent
        If Form1.MSComm1.PortOpen = True Then
            Form1.MSComm1.PortOpen = False
        End If
        Form1.MSComm1.CommPort = portnumber
        Form1.MSComm1.Settings = comsetting
        If handx = 1 Then
            Form1.MSComm1.Handshaking = comNone
        ElseIf handx = 2 Then
            Form1.MSComm1.Handshaking = comXOnXoff
        ElseIf handx = 3 Then
            Form1.MSComm1.Handshaking = comRTS
        ElseIf handx = 4 Then
            Form1.MSComm1.Handshaking = comRTSXOnXOff
        End If
        'Form1.MSComm1.InBufferSize = 1024 取默认值
        Form1.MSComm1.InputMode = comInputModeText
        Form1.MSComm1.PortOpen = True
        Form1.MSComm1.Output = "AT" + Chr(13)
        Form1.Caption = "全站仪与计算机通讯--正在接收数据,请稍候..."
        Form1.RichTextBox1.Text = ""
        Form1.quxiao.Enabled = True
        Form1.quxiao.Visible = True
        Form1.comset.Enabled = False
        Form1.datacom.Enabled = False
        comk = True
        Form1.MSComm1.InputLen = 100
        Dim onealfa As String
        Do
            DoEvents
                code = Form1.MSComm1.Input
                Form1.RichTextBox1.SelStart = Len(Form1.RichTextBox1.Text)
                For i = 1 To Len(code)
                    onealfa = Mid(code, i, 1)
                    If onealfa = Chr(26) Or onealfa = Chr(4) Then
                        Form1.RichTextBox1.SelText = code
                        Exit Do
                    ElseIf onealfa = Chr(10) Then
                        k = k + 1
                        Form1.Caption = "全站仪与计算机通讯--记录:" & k & " 正在接收,请稍候..."
                    End If
                Next
                Form1.RichTextBox1.SelText = code
        Loop
        Form1.Caption = "数据接收完毕!"
        Form1.Timer1.Interval = 10000
        Form1.Timer1.Enabled = True
        Form1.Caption = "全站仪与计算机通讯"
        Form1.MSComm1.PortOpen = False
        Form1.RichTextBox1.savefile infilename, 1
        Form1.comset.Enabled = True
        Form1.datacom.Enabled = True
        Form1.quxiao.Visible = False
        rowcol
    receivetxterr:
        If Err.Number = 8180 Then
            MsgBox Err.Description, vbOKOnly, App.Title
            Form1.MSComm1.PortOpen = False
            Exit Sub
        End If
        If Err.Number = 8002 Then
            MsgBox Err.Description & vbCrLf & vbCrLf & "重新设置新的串行通讯端口试一试!", vbOKOnly, App.Title
            Exit Sub
        End If
    End SubPrivate Sub saveeditfile_Click()
    On Error GoTo patherr
        Dim filename As String
        filefree = FreeFile
        Form1.CommonDialog1.DialogTitle = "保存为..."
        Form1.CommonDialog1.Filter = "文本文件(*.TXT)|*.TXT|数据文件(*.DAT)|*.DAT|所有文件(*.*)|*.*"
        Form1.CommonDialog1.filename = ""
        Form1.CommonDialog1.Flags = &H2
        Form1.CommonDialog1.ShowSave
        filename = Form1.CommonDialog1.filename
        If filename = "" Then Exit Sub
        Form1.RichTextBox1.savefile filename, 1
        Form1.Caption = "全站仪与计算机通讯--" + filename
        rowcol
        updatefile (filename)
    patherr:
        If Err.Number = 75 Then
            MsgBox "文件可能正被别的程序使用!" & vbCrLf & vbCrLf & vbCrLf & "或者" & Err.Description & " !" & vbCrLf & vbCrLf & "请改正后重新保存。"
            Exit Sub
        End If
      

  5.   

    学习中。顺带请教一个问题:
    在做一个串口通讯的exe,PC端先循环发送握手信号&H20,一旦检测到握手成功,就发送命令信号&H2,然后再进行下一步操作。问题是: 
          在发送命令信号&H2时,根据打印的信息,下位机接收到的仍然是握手信号&H20,为什么会这样? 
          后来尝试在检测到握手成功后清空发送缓冲和接收缓冲,再发送命令信号,结果得不到改观; 
          而后又尝试在检测到握手成功后清空发送缓冲和接收缓冲、关闭串口,再打开串口,再执行清空发送缓冲和接收缓冲,再发送命令信号,结果仍得 
          不到改观。代码片断如下: 
          Do 
            MSComm1.OutBufferCount = 0 
            MSComm1.InBufferCount = 0 
            sendbyte (HS_CODE)                        '&H20 
            If IsRxDataReady(1, 0) = True Then        ' 
                ReDim returnData(1) 
                returnData = ReadRxData(10) 
                If returnData(0) Then                'Handshak is OK ? 
                    Exit Do 
                End If 
            End If 
        Loop     MSComm1.OutBufferCount = 0            'clean buffer 
        MSComm1.InBufferCount = 0 
        MSComm1.PortOpen = False              'close com port     OpenCommPort                          'Open com port 
        MSComm1.OutBufferCount = 0            'clean buffer 
        MSComm1.InBufferCount = 0 
        Do 
            MSComm1.OutBufferCount = 0 
            MSComm1.InBufferCount = 0 
            sendbyte (HS_COMMAND)              '&H2 
            If IsRxDataReady(1, 0) = True Then 
                ReDim returnData(1) 
                returnData = ReadRxData(1) 
                If returnData(0) = CCHR Then      'Command is OK ? 
                    Exit Do 
                End If 
            End If 
        Loop 
      

  6.   

    我用了2楼的程序.
    但不知如何判断数据传送完毕.我用的是text 文件本框数据多了它就不动了  我想当数据传完了就 msgbox "数据传送完毕"但不知要判断那个条件