Endoplasma
Endoplasma

Reputation: 31

Android sending info via Bluetooth, fast logging

I am trying to write an app that passes the coordinates of a ball to Arduino via BT. The coordinates are being sent every 4 ms. For this test I send "123" instead of full coordinates. What am I getting now (on Arduino serial monitor) is "123123123123123..." and it refreshes only after I close the application.

What I want to achieve is "123" in every line, that shows immediately after the message is sent.

Android code BT:

 private class ConnectThread extends Thread {
    private final BluetoothSocket mmSocket;
    private final BluetoothDevice mmDevice;
    private OutputStream outStream ;

    UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");

    public ConnectThread(BluetoothDevice device) {
        // Use a temporary object that is later assigned to mmSocket
        // because mmSocket is final.
        BluetoothSocket tmp = null;
        mmDevice = device;
        try {
            // Get a BluetoothSocket to connect with the given BluetoothDevice.
            // MY_UUID is the app's UUID string, also used in the server code.
            tmp = device.createInsecureRfcommSocketToServiceRecord(uuid);
        } catch (IOException e) {
            Log.e(TAG, "Socket's create() method failed", e);
        }
        mmSocket = tmp;
    }

    public void run() {
        // Cancel discovery because it otherwise slows down the connection.
        mBluetoothAdapter.cancelDiscovery();

        try {
            // Connect to the remote device through the socket. This call blocks
            // until it succeeds or throws an exception.
            mmSocket.connect();
            Log.i(TAG, "run: CONNECTED");
        } catch (IOException connectException) {
            Log.i(TAG, "run:  NOT CONNECTED");
        }
    }

    // Closes the client socket and causes the thread to finish.
    public void cancel() {
        try {
            mmSocket.close();
            if(outStream != null)
                outStream.close();
            finish();
        } catch (IOException e) {
            Log.e(TAG, "Could not close the client socket", e);
        }
    }

    //Sending Message
    public void writeData(String data){
        String info = data;
        try {
            outStream = mmSocket.getOutputStream();
            outStream.write(info.getBytes());
            Log.i(TAG, "writeData: MSG SENT");
        } catch (IOException e) {
            e.printStackTrace();
            Log.i(TAG, "run: CANT SEND MSG");
        }
    }

    public boolean isConnected(){
        return mmSocket.isConnected();
    }
}

In my main function I call:

if(connectThread.isConnected())
    connectThread.writeData("123");

Arduino code:

String incomingByte;

void setup() {
  //pinMode(53, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  // see if there's incoming serial data:
  if (Serial.available() > 0) {
    // read the oldest byte in the serial buffer:
    incomingByte = Serial.readString();
    Serial.println(incomingByte);
    delay(10);
    }
  }

Upvotes: 1

Views: 162

Answers (2)

gre_gor
gre_gor

Reputation: 6813

There is no concept of messages in serial communication, unless you make it yourself.

Serial.readString() delimits your "messages" with time (1 second by default) and you are sending "messages" 4 ms apart. This obviously concatenates your "messages".

To actually send messages you need to delimit them. You can do that by sending lines.

On Android, you need to end the message with a new line character:

outStream.write(info.getBytes());
outStream.write(10); // send a new line character (ASCII code 10)

And on Arduino, you need to read, until you find a new line character:

incomingByte = Serial.readStringUntil('\n');
Serial.read(); // remove the leftover new line character from the buffer

Upvotes: 2

dda
dda

Reputation: 6203

You need to put at least \n (or maybe \r\n) after the coordinates, or the Bluetooth module just keeps buffering.

Upvotes: 2

Related Questions