[SOLUCIONADO] Proyecto RaspDuino

Buenas tardes. Necesito ayuda desesperadamente ya que presento mi Trabajo Fin de Grado esta semana y esto me está trayendo de cabeza...

El proyecto consiste en comunicar la RasPi y el Arduino por el puerto serie, hasta ahí la cosa bien.

En el momento en el que la RasPi le envía el SlaveID al Arduino, éste lo lee bien con la salvedad de que incluye un "-1" que no se de donde narices sale justo después del 49 (que se corresponde con el ASCII del 1). He intentado TODO (darle el valor del -1 a una variable auxiliar, cambiar el nombre de la variable, pero siempre me sale ese -1 que me pisa el resto de variables).

Entiendo que el fallo está en el Sketch, ya que he probado a ver qué es lo que sale del python de la RasPi mediante un conector FTID directamente al PC y sale exactamente lo que tu le mandes sacar por teclado.

Os adjunto los códigos, tanto el sketch Arduino como el python de la RasPi, así como una imagen donde recojo por terminal serie el problema, a ver si alguien consigue solucionarme esto, porque de verdad que estoy desesperado.

Muchas gracias de antemano.
Saludos.

#include <SoftwareSerial.h>

#define pin_sensor1 A5
#define pin_sensor2 A4
#define pin_sensor3 A3
float tempC; // Variable para almacenar el valor obtenido del sensor (0 a 1023)
int pinLM35 = 0; // Variable del pin de entrada del sensor (A0)
int led = 7;
int motor = 8;
int algo = 4;
int SlaveID=49; //ASCII del 2
int datoEsclavo=0;
int datoFunc=0;
int array1[3];//aquí se aloja el estado de los dispositivos digitales controlados 
int valor;
int registro[]={0, 0, 0};
int regtemp[30];
float adc1, adc2, adc3;
float tension1, tension2, tension3;
float var1, var2, var3;
float rel_tens_var1, rel_tens_var2, rel_tens_var3  = 100.00;
long tiempoReg=10000; //Envío datos de los sensores cada 10 segundos.

      
void setup() {
Serial.begin(19200);
pinMode(algo, OUTPUT);
pinMode(motor, OUTPUT);
pinMode(led, OUTPUT);

}

void loop() {
  
  if (Serial.available() > 0){
   
    datoEsclavo=Serial.read();
    
  Serial.print(datoEsclavo); //depurar
    if (datoEsclavo==SlaveID){
      if(Serial.available() >0){ 
      datoFunc=Serial.read();
      Serial.print(datoFunc);
      }
      }
    
      switch (datoFunc) {
        case 51: //Read Holding Registers(3, 51 en ascii)
          adc1 = analogRead(pin_sensor1);
          Serial.print("Valor adc sensor 1: ");
          Serial.println(adc1);
          adc2 = analogRead(pin_sensor2);
          Serial.print("Valor adc sensor 2: ");
          Serial.println(adc2);
          adc3 = analogRead(pin_sensor3);
          Serial.print("Valor adc sensor 3: ");
          Serial.println(adc3);

          tension1 = adc1 * 5 /1023;
          Serial.print("Valor tension sensor 1: ");
          Serial.println(adc1);
           tension2 = adc2 * 5 /1023;
          Serial.print("Valor tension sensor 2: ");
          Serial.println(adc2);
           tension3 = adc3 * 5 /1023;
          Serial.print("Valor tension sensor 3: ");
          Serial.println(adc3);

          var1 = tension1 * rel_tens_var1;
          Serial.print("El valor de la variable es: ");
          Serial.println(var1);
          var2 = tension2 * rel_tens_var2;
          Serial.print("El valor de la variable es: ");
          Serial.println(var2);
          var3 = tension3 * rel_tens_var3;
          Serial.print("El valor de la variable es: ");
          Serial.println(var3);
          
            //Recoger datos sensores y guardarlos en el vector registro
            registro[0]=var1;
            registro[1]=var2;
            registro[2]=var3;
            
            Serial.write((byte*)registro, 3 * sizeof(registro[0]));
            
          break;

        case 54: //Preset Single Register (6, 54 en ascii)
          //Cambiar el valor de los elementos digitales y
          // mandar vector con estado de los mismos de vuelta
        for( int i=0; i<=3; i++){
        if (Serial.available() > 0){
          valor=Serial.read();
          array1[i]=valor;
         
        }
        }
          if (array1[0] == 49){
            digitalWrite(algo, HIGH);
            Serial.print("Cosa encendida.\n");
          }
          else{
            digitalWrite(algo, LOW);
            Serial.print("Cosa apagada.\n");
          }
          if (array1[1] == 49){
            digitalWrite(led, HIGH);
            Serial.print("Led encendido.\n");
          }
          else{
            digitalWrite(led, LOW);
            Serial.print("Led apagado.\n");
          }
          if (array1[2] == 49){
            digitalWrite(motor, HIGH);
             Serial.print("Motor encendido.\n");
          }
          else{
            digitalWrite(motor, LOW);
             Serial.print("Motor apagado.\n");
          }
          
          break;
          case 0:
          break;
      }
    
    
    }
   
  
  unsigned long currentMillis = millis();
  if( millis() - currentMillis > tiempoReg){
          adc1 = analogRead(pin_sensor1);
          adc2 = analogRead(pin_sensor2);
          adc3 = analogRead(pin_sensor3);
          
          tension1 = adc1 * 5 /1023;
          tension2 = adc2 * 5 /1023;
          tension3 = adc3 * 5 /1023;
     
          var1 = tension1 * rel_tens_var1;
          var2 = tension2 * rel_tens_var2; 
          var3 = tension3 * rel_tens_var3;
          int i = 0;
          int k = 0;
         
          for (i=0; i<=3; i++) 
            regtemp[k]=var1;
            regtemp[k+1]=var2;
            regtemp[k+2]=var3;
            k=k+3;
    if (k==30){
      k=0; //Reseteamos los registros iniciales 
    }
  
  }

//si la longitud del registro se excede, reiniciarlo.
}

Código Phyton RaspBerry:

import serial, time
vec = 3
VECTOR=[None] * vec
arduino = serial.Serial('/dev/ttyAMA0', 19200)

print("Comienzo")


slaveID = raw_input('Introduce el ID del esclavo: ')
arduino.write(slaveID)
time.sleep(5)

func = raw_input('Introduce el codigo de funcion: ')

if (func == 3):
 arduino.write(func)
 registro = arduino.readline()
 print("El registro tiene alojados los siguientes valores: ")
 print(registro)
 
elif (func == 6):
 for i in range(0,vec):
 elem = raw_input
 arduino.write(elem)
 i=i+1
 time.sleep(5)
arduino.close()

ConfiguracionFinal.ino (4.4 KB)

controladorFinal.txt (558 Bytes)

Tu problema esta en como crees que ocurren las cosas en Arduino.
Tu envias el SlaveId y luego crees que se queda esperando a tu proximo envió desde Raspi.
Las cosas ocurren rápidamente y cuando intenta leer algo justamente devuelve ese -1 porque no hay nada.

Lo que debes hacer es enviar todo de una vez, un comando que incluya todo lo que pretendes enviarle
Supongamos
1234 donde 1 es SlaveId y 234 es el numero a enviar.

De lo contrario lo que tienes que hacer es una espera de datos delimitada por el caracter != '\n'

Si tu ejemplo en el primero caso espera todo menos '\n' entonces detectas el primer envio y tendrás SlaveId
Si luego repites y haces lo mismo pero sin irte o sea con un while(datoSerial !='\n') y no solo if() porque en segundo caso se procesa 1 dato recibido y en el primero me quedo hasta recibir el line feed.

Muchísimas gracias por la temprana ayuda, atención y "aclaramiento" de concepto. Problema solucionado!!!
Pongo el tema como tal!