我正在做VB串口与单片机的通信  单片机发送1位起始位 8位数据 还有TB8  1位停止位总共
11数据
我不知道如何接收单片机发送来的第九位数据是1还是0 呢?
怎么判断呢?

解决方案 »

  1.   

    串口接受到的数据都是在INPUTBUFF里面,你每读取一次这个变量,就会自动清空,你用STRING或BYTE()去读,读完之后直接看BYTE(8)或者 mid(str,9,1)就是第9位
      

  2.   

    不是很明白 能否举个例子
    Dim Rec_Data as byte
    Rec_data=MSComm1.Input
    怎么判断第9位
      

  3.   

    LZ的问题是个较特殊的串口通信问题,请参阅以下网址:
    http://zhidao.baidu.com/question/48607087.html?si=3
    能否有帮助,不得而知.
      

  4.   


    一般来说,第 9 位不会是真正的数据,一般表示一种状态。RS-232 的数据位只能是 4-8 位,不可能设置为 9。此外,串口的缓存也是 8 位组,无法保存第 9 位。上位机发送第 9 位一般是通过 Parity 位,置为 Mark 或 Space。接收的时候,上位机应该是通过协议可以预知第九位的状态,并事先设置 Parity 属性、
      

  5.   

    LZ:如果你只是发1个字节的话,接收端按
    MSComm1.Settings = "9600,n,8,1"
    来接收。
    发送字节第9位是1的话,单片机按S校验发送
    发送字节第9位是0的话,单片机按N校验发送
    以下是测试:
    01 02 03 03 05 06 07 08 09 0A 0B 0C 0D 0E 0F
    S校验 01FF 02FF 03FF 04FF 05FF 06FF 07FF 08FF 09FF 0AFF 0BFF 0CFF 0DFF 0EFF 0FFF
    O校验 01FF 02FF 03 04FF 05 06 07FF 08FF 09 0A 0BFF 0C 0DFF 0EFF 0F
    E校验 01 02 03FF 04 05FF 06FF 07 08 09FF 0AFF 0B 0CFF 0D 0E 0FFF
    10 20 30 40 50 60 70 80 90 A0 B0 C0 D0 E0 F0
    S校验 10FF 20FF 30FF 40FF 50FF 60FF 70FF 80FF 90FF A0FF B0FF C0FF D0FF E0FF F0FF
    O校验 10FF 20FF 30 40FF 50 60 70FF 80FF 90 A0 B0FF C0 D0FF E0FF F0
    E校验 10 20 30FF 40 50FF 60FF 70 80 90FF A0FF B0 C0FF D0 E0 F0FF表格数据说明第9位是1接收到2字节,第9位是0,接收到1字节。
      

  6.   

    上位机应该是通过协议可以预知第九位的状态,并事先设置 Parity 属性、
    你的想法是对的  赞一个先
      

  7.   

    以下代码按固定时间间隔发送ASC在0-255数值的单字节,接收端收到511字节耗时间10.87s,除字节ASC为0,接收到1字节外,其它都为2字节。
    Option Explicit
        Dim i As Integer
        Dim sj(0) As BytePrivate Sub Command1_Click()
        Timer1.Enabled = True
        Print Timer
    End SubPrivate Sub Command2_Click()
        Timer1.Enabled = False
    End SubPrivate Sub Form_Load()
        MSComm1.Settings = "9600,s,8,1"
        MSComm1.PortOpen = True
        Timer1.Interval = 5
        Timer1.Enabled = False
    End SubPrivate Sub Timer1_Timer()
        sj(0) = i
        MSComm1.Output = sj
        i = i + 1
        If i >= 256 Then
            Print Timer
            Timer1.Enabled = False
            i = 0
        End If
    End Sub以下代码按固定时间间隔发送ASC在0-255数值的单字节与字节ASC为0单字节组成的双字节,接收端收到768字节耗时间10.55s,除第二字节ASC为0,接收到2字节外,其它都为3字节。
    Option Explicit
        Dim i As Integer
        Dim sj(1) As BytePrivate Sub Command1_Click()
        Timer1.Enabled = True
        Print Timer
    End SubPrivate Sub Command2_Click()
        Timer1.Enabled = False
    End SubPrivate Sub Form_Load()
        MSComm1.Settings = "9600,s,8,1"
        MSComm1.PortOpen = True
        Timer1.Interval = 5
        Timer1.Enabled = False
    End SubPrivate Sub Timer1_Timer()
        sj(1) = i
        MSComm1.Output = sj
        i = i + 1
        If i >= 256 Then
            Print Timer
            Timer1.Enabled = False
            i = 0
        End If
    End Sub
      

  8.   

    MSComm 控件的属性除CommPort 属性必须在打开端口之前设置,它的Settings 属性可以在运行中改变。关键是单片机的响应时间,上位机可瞬间改变Settings 属性,接收可在MSComm1_OnComm事件中完成.
    Option Explicit
        Dim strHex As StringPrivate Sub Command1_Click()
        Print Timer
        Dim sendSj() As Byte
        ReDim sendSj(1)
        sendSj(0) = &H1
        sendSj(1) = &HA0
        MSComm1.Settings = "9600,o,8,1" 'o奇校验
        Print Timer
        MSComm1.Output = sendSj
        Print Timer
        MSComm1.Settings = "9600,e,8,1" 'e偶校验
        ReDim sendSj(5)
        sendSj(0) = &HFF
        sendSj(1) = &HA0
        sendSj(2) = &H1A
        sendSj(3) = &HA0
        sendSj(4) = &H1B
        sendSj(5) = &HA0
        Print Timer
        MSComm1.Output = sendSj
        Print Timer
    End SubPrivate Sub Form_Load()
        MSComm1.Settings = "9600,e,8,1" 'e偶校验
        MSComm1.RThreshold = 1
        MSComm1.InputMode = comInputModeBinary
        MSComm1.PortOpen = True
    End SubPrivate Sub MSComm1_OnComm()
        Dim buffer() As Byte
        Dim i As Integer
        Select Case MSComm1.CommEvent
            Case comEvReceive
            buffer = MSComm1.Input
            For i = 0 To UBound(buffer)
                strHex = strHex & Right("0" & Hex(buffer(i)), 2)
            Next
            '写数据处理代码
            Text1 = strHex
        End Select
    End Sub
      

  9.   

    Option Explicit
        Dim strHex As StringPrivate Sub Command1_Click()
        Print Timer
        Dim sendSj() As Byte
        ReDim sendSj(1)
        sendSj(0) = &H1
        sendSj(1) = &HA0
        MSComm1.Settings = "9600,o,8,1" 'o奇校验
        Print Timer
        MSComm1.Output = sendSj
        Print Timer
        MSComm1.Settings = "9600,e,8,1" 'e偶校验
        ReDim sendSj(5)
        sendSj(0) = &HFF
        sendSj(1) = &HA0
        sendSj(2) = &H1A
        sendSj(3) = &HA0
        sendSj(4) = &H1B
        sendSj(5) = &HA0
        Print Timer
        MSComm1.Output = sendSj
        Print Timer
    End SubPrivate Sub Form_Load()
        MSComm1.Settings = "9600,e,8,1" 'e偶校验
        MSComm1.RThreshold = 1
        MSComm1.InputMode = comInputModeBinary
        MSComm1.PortOpen = True
    End SubPrivate Sub MSComm1_OnComm()
        Dim buffer() As Byte
        Dim i As Integer
        Select Case MSComm1.CommEvent
            Case comEvReceive
            buffer = MSComm1.Input
            For i = 0 To UBound(buffer)
                strHex = strHex & Right("0" & Hex(buffer(i)), 2)
            Next
            '写数据处理代码
            Text1 = strHex
        End Select
    End Sub