Android Question HC-06 Bluetooth Async Buffer

Discussion in 'Android Questions' started by RichardHirst, Oct 2, 2018.

  1. RichardHirst

    RichardHirst Member Licensed User

    Hello Erel

    I have a WIT-motion device which give Roll/Pitch/Yaw data via bluetooth HC-06.

    11 bytes, start with 0X55 with second byte as data type 0x53 is RPY. Byte 11 is CRC. This is not Prefix mode so I have used a ring buffer to find the data block.

    This code working but seems very slow, can you suggest a better method to 'find' the data in the buffer stream.

    Also when you 'read' or copy from the Async Buffer, does this clear the Async Buffer..?


    Code:
    Sub AStream_NewData (Buffer() As Byte)
        
        
    Dim i As Int = 0

        usLength = Buffer.Length
        usRxLength = usRxLength + usLength

        
    Bit.ArrayCopy(Buffer, 0, RxBuffer, usRxLength, usLength)

        
    Do While usRxLength >= 11
                
            
    If (Not ((RxBuffer(0) = 0x55And (Bit.And(RxBuffer(1), 0x50) = 0x50))) Then
                
    'Move Byte to the front un till Byte(0) = 0x55 and Byte(1) is Above 0x50
                For i = 1 To usRxLength - 1
                    RxBuffer(i - 
    1) = RxBuffer(i)
                
    Next
                usRxLength = usRxLength - 
    1
                
    Continue
            
    End If
                    
            
    If Bit.And(RxBuffer(0) + RxBuffer(1) + RxBuffer(2) + RxBuffer(3) + RxBuffer(4) + RxBuffer(5) _
                    + RxBuffer(
    6) + RxBuffer(7) + RxBuffer(8) + RxBuffer(9), 0xfF) = RxBuffer(10Then
                    
                
    If RxBuffer(1) = 0x53 Then
                    
    Dim Roll As Double = (((RxBuffer(3) * 256) + RxBuffer(2)) / 32768) * 180
                    
    Dim Pitch As Double = (((RxBuffer(5) * 256) + RxBuffer(4)) / 32768) * 180
                    
    Dim Yaw As Double = (((RxBuffer(7) * 256) + RxBuffer(6)) / 32768) * 180
                    
    Dim Temperature As Double =  ((RxBuffer(9) * 256) + RxBuffer(8)) / 340 + 36.53

                    
    Log($"T = $1.0{Temperature}"$ & TAB & TAB & $"R = $1.2{Roll}"$ & TAB & TAB & $"P = $1.2{Pitch}"$ & TAB & TAB & $"Y = $1.2{Yaw}"$)
                
    End If

            
    End If
                
            
    ' Remove 'Used' Data from Ring Buffer
            For i = 11 To usRxLength - 1
                RxBuffer(i - 
    11) = RxBuffer(i)
            
    Next
            usRxLength = usRxLength - 
    11
        
    Loop
    End Sub
    Many Thanks

    Richard
     
  2. Erel

    Erel Administrator Staff Member Licensed User

    Please don't limit your threads to a single member.

    Make sure to test performance in Release mode.

    Use BytesBuffer.
     
  3. RichardHirst

    RichardHirst Member Licensed User

    Hello

    Thank you. Would you be able to show an example using BytesBuffer

    Richard
     
    Last edited: Oct 3, 2018
  4. Erel

    Erel Administrator Staff Member Licensed User

  5. RichardHirst

    RichardHirst Member Licensed User

    So this is working a lot better.

    Code:
    Sub AStream_NewData (Buffer() As Byte)

        bb.Append(Buffer)

        
    Do While bb.Length >= 11

            DataIndex = bb.IndexOf2(
    Array As Byte(0x550x53), 0)
            
            
    If DataIndex = -1 Then
                bb.Clear
            
    Else
                RxBuffer = bb.SubArray2(DataIndex, DataIndex + 
    11)
                
                
    If Bit.And(RxBuffer(0) + RxBuffer(1) + RxBuffer(2) + RxBuffer(3) + RxBuffer(4) + RxBuffer(5) _
                        + RxBuffer(
    6) + RxBuffer(7) + RxBuffer(8) + RxBuffer(9), 0xfF) = RxBuffer(10Then
                        
                    
    Dim Roll As Double = (((RxBuffer(3) * 256) + RxBuffer(2)) / 32768) * 180
                    
    Dim Pitch As Double = (((RxBuffer(5) * 256) + RxBuffer(4)) / 32768) * 180
                    
    Dim Yaw As Double = (((RxBuffer(7) * 256) + RxBuffer(6)) / 32768) * 180
            
    '        Dim Temperature As Double =  ((RxBuffer(9) * 256) + RxBuffer(8)) / 340 + 36.53

                    lblRoll.Text = 
    NumberFormat2(Roll, 122False)
                    lblPitch.Text = 
    NumberFormat2(Pitch, 122False)
                    lblYaw.Text = 
    NumberFormat2(Yaw, 122False)
                    
                
    End If
                
                bb.Remove(DataIndex, DataIndex + 
    11)
            
    End If
        
    Loop
    End Sub
    Thank You for all your Help.

    Richard
     
    Erel likes this.
Loading...
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice