0

I'm currently working on a PiBot project in Python (chassis with 4 wheels, controlled by Android app via bluetooth for now). I made a prototype in Python, i can create a BT server, subscribe to it and pair the device via Android, and send information through the BT socket : a joystick gives me the strength and angle on Android, and i succesfully read them from the server. I use Struct for decoding the integers array from the stream bytes.

Here's a piece of my BTServer class, the loop where i display values on server :

def goToControls(self):
    while True:
        data = self.client_sock.recv(1024)
        size = len(data)
        print size, 'bits'

        try:
            angle, strength = struct.unpack('>ii', data)

            print angle, strength
            #self.cHandler.move(angle, strength)
        except struct.error:
            print 'bad scheme...'

On Android side, the function which sends data :

if (btDevice.getMmSocket().isConnected()){
                int[] values = {angle, strength};

                ByteBuffer byteBuffer = ByteBuffer.allocate(values.length * 4);
                IntBuffer intBuffer = byteBuffer.asIntBuffer();
                intBuffer.put(values);

                byte[] array = byteBuffer.array();

                try {
                    btDevice.getMmSocket().getOutputStream().write(array);
                    btDevice.getMmSocket().getOutputStream().flush();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

Here's my console output, from server :

enter image description here

So it works great. As soon as i uncomment the line self.cHandler.move(angle, strength), which gives data to my controls handler and make wheels turn, or if i replace it with anything, such as a time.sleep(0.1), here's what i get :

enter image description here

It looks like the scheme is changing, i can't understand anything... Has someone got a clue ?

Thanks a lot

-- EDIT :

I found a part of the answer : I was trying to send 8 bytes from android and receiving 1024 from struct.

So I changed it for that :

data = self.client_sock.recv(8)
angle, strength = struct.unpack('>ii', data)
print angle, strength
self.cHandler.move(angle, strength)

And it works, but it's now terribly slow. How can I decode those 8 bytes without slowing the process like this ?

Blackwaxx
  • 45
  • 7
  • `struct.unpack` in python is really fast, could you try the `cProfile` to check who is slow? ref: https://stackoverflow.com/questions/582336/how-can-you-profile-a-script – Brett7533 Feb 07 '18 at 05:53
  • Hi, I found where the problem was, somewhere else in my code, a time.sleep was slowing the whole process... ^^ So struct was working fine :) But thanks for that link, i'll use that... – Blackwaxx Feb 07 '18 at 17:58

0 Answers0