App Crashes when recieving Values

Hey :slight_smile:

I'm building a Controler for my Airride System in my Car and want to show the pressure and the Battery value in the app.
To be a litle bit more flexible i send a value as command to request the Values (so i can adjust it with the app once i run into timing issues, since the Arduino is hardly reachable once it is in the car).

All functions are running flawlessly now, just recieving of the values konstantly keeps the app crashing once it´s getting the values via Bluetooth... I get the message : " List index too large"

Here is my Arduino Code snippet for sending the values:

case 7: // ask for analoge Values
        int sensorValue = analogRead(S1);  // Read the analog input
        value_pfr = sensorValue * (3.3 / 4095);  // Convert the sensor value to voltage (assuming 12-bit ADC)
	      int sensorValue1 = analogRead(S2);  // Read the analog input
        value_prr = sensorValue1 * (3.3 / 4095);  // Convert the sensor value to voltage (assuming 12-bit ADC)
	      int sensorValue2 = analogRead(S3);  // Read the analog input
        value_vcc = sensorValue2 * (3.3 / 4095);  // Convert the sensor value to voltage (assuming 12-bit ADC)
	      int sensorValue3 = analogRead(S4);  // Read the analog input
        value_ptot = sensorValue3 * (3.3 / 4095);  // Convert the sensor value to voltage (assuming 12-bit ADC)
        
        //ESP_BT.print("S");
        ESP_BT.print(value_pfr);
        ESP_BT.print("|");
	      ESP_BT.print(value_prr);
        ESP_BT.print("|");
	      ESP_BT.print(value_vcc);
        ESP_BT.print("|");
	      ESP_BT.print(value_ptot);
        //ESP_BT.print("E");

And here how i use it in my App (timer is set to 1sec [1000ms]):

I'm searching now since a while... I found this old post: List index too large. using ble blocks with listpicker - #14 by ChrisWard
but can´t use the fix with my problem.

Is there someone who has a idea what to change ?

Thanks

//moe

Be sure to use println() at the end of each message to send from the sending device, to signal end of message.

Only use print() in the middle of a message.

Be sure not to println() in the middle of a message, or you will break it into two short messages and mess up the item count after you split the message in AI2.

Do not rely on timing for this, which is unreliable.

In the AI2 Designer, set the Delimiter attribute of the BlueTooth Client component to 10 to recognize the End of Line character.
BlueToothClient1_Properties
Also, return data is not immediately available after sending a request,
you have to start a Clock Timer repeating and watch for its arrival in the Clock Timer event. The repeat rate of the Clock Timer should be faster than the transmission rate in the sending device, to not flood the AI2 buffers.

In your Clock Timer, you should check

  Is the BlueTooth Client still Connected?
  Is Bytes Available > 0?
     IF Bytes Available > 0 THEN
       set message var  to BT.ReceiveText(-1) 

This takes advantage of a special case in the ReceiveText block:

ReceiveText(numberOfBytes)
Receive text from the connected Bluetooth device. If numberOfBytes is less than 0, read until a delimiter byte value is received.

If you are sending multiple data values per message separated by | or comma, have your message split into a local or global variable for inspection before trying to select list items from it. Test if (length of list(split list result) >= expected list length) before doing any select list item operations, to avoid taking a long walk on a short pier. This bulletproofing is necessary in case your sending device sneaks in some commentary messages with the data values.