0

I am using a BLE device (https://www.adafruit.com/product/1697) that I use to print data to an app. I can successfully connect the BLE to the app and receive the data but the result however gets chopped up.

What I am sending is a lat, lng value (that I gather with a library called TinyGPS++ http://arduiniana.org/libraries/tinygpsplus/) and the code looks like this:

BTLEserial.Print::print(gps.location.lat(), 8);
BTLEserial.print (", ");
BTLEserial.Print::print(gps.location.lng(), 8);

So for example if the latitude is: 32.12345678, it comes like this to the app: 3, new row, 2, new row etc.

So my question is, how can I adjust my code to make sure it does not send the result chopped up but instead sends it's complete value?

  • Your app code is invalidly assuming the data will arrive in a single receive API call. You can only fix the issue by fixing the app. Timing related things you do on the arduino mightvstatistically influence the outcome, but the only sound solution is fundamentally correct receiving code. – Chris Stratton Jan 7 '17 at 16:09
  • The answer below fixed my issue though by sending it as string – Martman Jan 7 '17 at 16:10
  • No, not really. It may unreliably appear to work more often but it is wrong and based on fundamental misunderstanding. Between your ardunio and your app you have a serial link and a packetized one neither of which respects your original grouping in a more than happenstance way. – Chris Stratton Jan 7 '17 at 16:14
  • As far as i can see it sends data my app and i receive it nicely just the way i want it (not chopped). I have tested it like 30 seconds though (as it keeps sending data each 2 seconds) and maybe i could face issues with a longer connection you mean? Or will there be a issue with lat, lng accuracay (value not updating)? – Martman Jan 7 '17 at 16:18
  • Or you could face an issue when the computational load on your phone or the phase of the moon or the local RF environment changes. That is the cost of invalid assumptions in software. The only valid solution is to find the end of a message by an explicit condition. – Chris Stratton Jan 7 '17 at 16:21
0

how can I adjust my code to make sure it does not send the result chopped up but instead sends it's complete value?

The BLE device uses a package approach and the print member functions only support strings (char vectors and Arduino String). Construct the message as a String:

double lat = gps.location.lat();
double lng = gps.location.lng();
String msg = String(lat, 8) + String(", ") + String(lng, 8);
BTLEserial.print(msg); 

Cheers!

| improve this answer | |
  • The first lat value works! But with the lng value a new row is created after 4 decimals has been made, so it look like this when I get it on the app now: 36.02331400, 19.7794(new row)4300 – Martman Jan 7 '17 at 15:18
  • So 4300 in this case gets on a new row – Martman Jan 7 '17 at 15:18
  • Ah, is it because 20 bytes is max to send? – Martman Jan 7 '17 at 15:19
  • With "." and "," and "space" the totalt amount of byte is 24 – Martman Jan 7 '17 at 15:20
  • 2
    Or fix your app so that it reconstructs a line of text, i.e. reads messages until new-line/carriage-return. – Mikael Patel Jan 7 '17 at 15:26

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.