No obtengo datos completos del puerto serial

Buenas foro!

Estoy trabajando en un proyecto que consiste en controlar una cámara de visión con un arduino y obtener de ella datos de la medición (si todas las piezas miden OK o si hay alguna mala).
Todo esto mediante una conexión RS232.

Adquirí el modulo para la conexión serial (el MAX232)y ya he conseguido comunicarme con la cámara y hacer que empiece la medición.
Lo único estoy atascado en el punto de recibir los datos de la medición.
Tengo que recibir algo así:

AK 0 FC
ST C7
SE 1C610049 4.63 6B
DA 2016/07/07 18:11:07 80
MS 22 44
LO BB
CH AB
IT 1 63.428 mm Diámetro001 0.000 64.000 63.000 OK 1A
IT 2 Fail mm Diámetro002 0.000 4.400 4.000 Fail DE
EN B3
CP 0 03

El problema es que solo me muestra lo que voy a adjuntar:
PRUEBA METIENDO YO MANUALMENTE LA RESPUESTACON DELAY 500 DESPUES DE WHILE

La idea después es con los datos que me han salido, ver si alguna me ha dado mala y en función de cual sea la mala (IT 1 o IT2 o ...) activar una salida.

A ver si puede alguien echarme un cable...
Muchas gracias de antemano!!

Adjunto el código:

//DECLARACIÓN DE VARIABLES PARA E/S
int luz_azul_ok=5;
int luz_ama_ocupado=4;
int luz_roja_error=3;
int boton=2;
//DECLARACIÓN DE VARIABLES DE DATOS
char datos1=0;
char datos2=0;
String respuesta1="";
String respuesta2="";

void setup() {

  Serial.begin(115200); //INICIO COMUNICACION SERIE A 115200 BAUDIOS
  pinMode (luz_azul_ok, OUTPUT); //DECLARO E/S
  pinMode (luz_ama_ocupado, OUTPUT);
  pinMode (luz_roja_error, OUTPUT);
  pinMode (boton, INPUT);
}

void loop() {

digitalWrite(luz_ama_ocupado, HIGH);
delay (2000);
Serial.println ("SA B4"); //ENVÍO COMANDO DISPONIBILIDAD KEYENCE
digitalWrite(luz_ama_ocupado, LOW);
delay (1000);
while (Serial.available()){ //QUE AGRUPE EN RESPUESTA1 TODO LO QUE ENTRA POR EL PUERTO SERIE Y QUE VA LEYENDO EN DATOS1
  char datos1 = Serial.read();
  respuesta1 += datos1;
  if((respuesta1)=="SA 0 04"){ //SI LA RESPUESTA ES ESTA, ESTÁ DISPONIBLE PARA ENVIAR DATOS
    digitalWrite (luz_azul_ok,HIGH);
    delay(1000);
    Serial.println ("EX BD"); //PRIMER ENVÍO DE COMANDO MEDIR (POSICIONA LA BASE)
    datos1=0;
    respuesta1="";
    delay (5000); //ESPERO QUE SE POSICIONE LA KEYENCE PARA EMPEZAR A MEDIR
    Serial.println ("EX BD"); //ENVÍO DE NUEVO EL COMANDO PARA QUE EMPIECE A MEDIR
    digitalWrite (luz_azul_ok,LOW);
    delay (50000); //ESPERO 50SEG A QUE MIDA LAS PIEZAS
    while (Serial.available()){ //QUE AGRUPE EN RESPUESTA2 TODO LO QUE ENTRA POR EL PUERTO SERIE Y QUE VA LEYENDO EN DATOS2 (AQUÍ VAN LOS RESULTADOS DE LA MEDICIÓN) ?¿no obtengo todos los datos?¿
      delay(500);
      char datos2=Serial.read();
      respuesta2+=datos2;}
    Serial.print (respuesta2);//esto lo hago para ver los datos que me llegan
    digitalWrite (luz_roja_error,HIGH);//aviso fin secuencia
    delay(60000);
    digitalWrite (luz_roja_error,LOW);
    datos2=0;
    respuesta2="";
    }
  }
}
while (Serial.available()){ //QUE AGRUPE EN RESPUESTA2 TODO LO QUE ENTRA POR EL PUERTO SERIE Y QUE VA LEYENDO EN DATOS2 (AQUÍ VAN LOS RESULTADOS DE LA MEDICIÓN) ?¿no obtengo todos los datos?¿ 
  delay(500);
...

Si pones un delay de 0.5 segundos entre cada caracter recibido ¿cómo esperas no perder caracteres?
A 115200 bps, en 500 ms se reciben 5760 caracteres, el buffer serie tiene 64 bytes, o sea que no se llega a procesar el 2do caracter y ya se pierden caracteres.

¿Qué placa estás usando?
Vas a tener problemas conectando todo al mismo puerto serial.

Intenta trabajar sin tantos delay() por favor!!
Es como ver una pintura y luego tomas el tarro de pintura y se lo tiras al lienzo.
Arruinas todo.
coloca delay, cuando haga falta y en la medida que corresponda.
Otra cosa, no puedes hacer esto

while (Serial.available()){
.......
   while (Serial.available()){
    -.....
        while (Serial.available()){
  

es decir, poder puedes, lo estamos viendo pero es una mala programación.
Debes ser ordenado.

Se lee una cadena con

while (Serial.available()){

se detecta lo que se ha enviado y se toma acción.
El código entonces tiene estructura.
Es decir...
Empieza el loop() y esperas a que ingrese algo por el puerto serial.
Si ingresa lo procesas.
Si no ingresas, haces lo que tengas que hacer como prender un led o la acción que coresponda.
Entonces.. tienes una secuencia.
Enviar primero esto SA B4
Esperar respuesta positiva como SA 0 04 y con esto cumplimentas el paso 1.
Ahora lo mismo con el paso 2 etc.
se cuidadoso a la hora de enviar caracteres. Una cosa es "SA 0 04" y otra es SA 00 04" no se si la cámara los interpresta igual o no.
Esto

delay(60000);

Es horrible. La califación de horrible tiene que ver con que el microcontrolador se queda 1hora de brazos cruzados. Realmente quieres eso? Se puede lograr lo mismo sin tenerlo de brazos cruzados y seguir atento. Eso hace el delay y se combate con millis().

Elimina eso de tu codificación. Ve a Documentación y lee como hacer todo esto con máquina de estados y millis().
Cuando lo leas entenderás de que te estoy hablando.
Y cuando lo hagas veremos como mejorar esto.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.