现有一个设备,源源不断的往COM1上送数据:数据格式如下:
一个数据字包括2个字节(高字节和底字节)
高8位(二进制): ********
底8位(二进制): ########问题:现在我从VB程序中通过MSCOMM控件发指令读某一时刻的数据,请问我如何才能正确的将数据读到呀?? 最后要保存为double 或者float类型? 
没有用过MSCOMM控件,请多指点!!

解决方案 »

  1.   

    你的传感器采集的数据不经过处理吗?要处理的话就得经过CPU,既然有CPU,就可以控制啊
      

  2.   

    传感器是一个激光式的,它自身将探测到的与被测物体之间的距离源源不断的发送到串口上,这部分是和PC独立的,换句话说,就是你把PC关掉,只要传感器还有24V电,它就不断的往于之相连的串口上发送数据,虽然此时PC无法接受该数据。
    而我现在就是要间断的从串口读取传感器发送回来的数据,而且还要正确的读取!传感器发送数据的格式就是:
    一个数据字包括2个字节(高字节和底字节)
    高8位(二进制): ********
    底8位(二进制): ########
    即:********########********########********########********########
      

  3.   

    这样的,接收就不能用触发事件了。
    你想读取时,先清输入缓冲区,再去读取,读到数据结束符后,再读取下一个数据,第二个数据肯定是正确的。
    也可以多读取一些数据,把buff里的数据全读出来在取平均数(当然是短时间内,距离变化太快就不成了)。  
    其中你要知道高位和低位的判断,也就是之间的一种协议要自己搞清。
      

  4.   

    事先,你需要将你的MSCOMM控件的波特率、握手协议、奇偶校验等东西设置到和你的外部设备一致,否则你是不会接收到数据的。
    然后你可以这样做:在MSCOMM控件的OnComm事件中写代码,当COM口接收到数据的时候会触发这个事件。
    Private Sub Com1_OnComm()
    Dim Temp as String   '是字符型没错
    If Com1.CommEvent=comEvReceive Then
       Temp = Com1.Input   '这里你已经接收到了来自COM口的数据
       '这里你需要把你接收到的16进制的字符串转化为你需要的10进制数字,
       '这个代码我就不写了。
    End If
    End Sub
      

  5.   

    补充一下,MSCOMM控件中使用INPUT属性可以接收并同时删除接收缓冲区中的数据流。还可以设置InputLen属性来限定你每次读入的数据的长度。
    具体的问题请自己参考一下MSDN吧,里面有例程。这里实在是说不清。
      

  6.   

    其实你这个有个问题还没有解决,那就是数据的起始位和停止位,不知道你的外部设备是用什么东西来代表两个16进制数之间的间隔的。如果你知道的话就可以使用SLIPE函数来将这个长字符串拆分到一个字符串数组中。然后再一个个转换成10进制。
      

  7.   

    1、你需要将你的MSCOMM控件的波特率、握手协议、奇偶校验等东西设置到和你的外部设备一致,否则你是不会接收到数据的2、在MSCOMM控件的OnComm事件中写代码进行数据的存储与处理,但是用MSCOMM接收时正确的做法是按字节接收,而不是按字符接收,你可以一次接收一个数据帧再作处理(在你的情况中,一个数据帧就是两个字节),这样收到的数据是10进制数整形数,你需要按照发送端的规则转成相应的浮点型数。3、由于传输的数据没有经过校验,可能会收到错误数据,你还需要一个错误数据处理的机制。4、由于没有帧头(帧尾)所以无法判断帧的起始位置,因此可能出现收到的第一个字节是上一帧数据的第二个字节,而收到的第二个字节可能是下一帧的第一个字节的情况,无法保证数据帧的正确性!5、上面sunny8226(袋鼠)提到的CPU不是PC的CPU,而是你那个设备的CPU(比如单片机之类的)。如果你的那个设备仅仅是个传感器的话,那么正确的做法在你的设备那边先用硬件做个接口来接收数据,然后给收到的数据进行适当的处理(比如加上帧头、校验等),然后再转发给PC,再由PC做处理!至于MSCOMM的用法很简单,没什么可说的,看看MSDN帮助就行了!
      

  8.   

    楼主oceanslan (公安局长) :大家都说的很清楚了,不知道你清楚没有??
      

  9.   

    1、你需要将你的MSCOMM控件的波特率、握手协议、奇偶校验等东西设置到和你的外部设备一致,否则你是不会接收到数据的2、在MSCOMM控件的OnComm事件中写代码进行数据的存储与处理,但是用MSCOMM接收时正确的做法是按字节接收,而不是按字符接收,你可以一次接收一个数据帧再作处理(在你的情况中,一个数据帧就是两个字节),这样收到的数据是10进制数整形数,你需要按照发送端的规则转成相应的浮点型数。3、由于传输的数据没有经过校验,可能会收到错误数据,你还需要一个错误数据处理的机制。4、由于没有帧头(帧尾)所以无法判断帧的起始位置,因此可能出现收到的第一个字节是上一帧数据的第二个字节,而收到的第二个字节可能是下一帧的第一个字节的情况,无法保证数据帧的正确性!5、上面sunny8226(袋鼠)提到的CPU不是PC的CPU,而是你那个设备的CPU(比如单片机之类的)。如果你的那个设备仅仅是个传感器的话,那么正确的做法在你的设备那边先用硬件做个接口来接收数据,然后给收到的数据进行适当的处理(比如加上帧头、校验等),然后再转发给PC,再由PC做处理!
    请问各位高手,有没有这部分的源程序供参考呀?
      

  10.   

    给你个简单的COM设置程序,假设MSCOMM控件的名字为Com1:
    sub Form_load()
    With Com1
       If .PortOpen Then .PortOpen = False '先关闭端口
       .CommPort = 1                       '使用com1             
       .InputMode = comInputModeText       '使用文本模式传送
       .Settings = "9600,n,8,1"            '设置波特率等       
       .Handshaking = 0                    '设置握手方式
       .InBufferCount = 0                  '清空接受缓存 
       .PortOpen = True                    '打开端口
    End With
    End sub
    照着用就是了,把串口号、波特率、传送模式和握手方式改成你要用的
      

  11.   

    Dim word As String
    Dim data As String
    Select Case MSComm1.CommEvent
    Case comEvReceive
        word = Trim(MSComm1.Input) + word
        If Len(word) < 10 Then
            GoTo error
        Else
            StatusBar1.Panels(3).text = Left(word, 30)
            po = InStr(1, word, "//")
            data = Mid(word, po + 2, 36)
            information(0) = Left(data, 2)
            information(1) = "20" & Mid(data, 3, 6)
            information(2) = Mid(data, 9, 6)
            information(3) = Mid(data, 15, 4)
            information(4) = Mid(data, 19, 4)
            information(5) = Mid(data, 23, 4)
            information(6) = Mid(data, 27, 4)
            information(7) = Mid(data, 31, 4)
            Form3.Text1.text = information(1) & information(2) & information(3) & information(4)
        End If
    End Select
    error:
        Exit Sub
    俺的一個小程序. 是以//開始的.供參考