Datos perdidos al escribir en el puerto serial de Arduino. ¿Rebosar?

1

Tengo un Arduino conectado a una caja de Linux (una Raspberry Pi). Estoy leyendo un pin analógico y lo escribo con Serial.println() junto con el valor de millis() El puerto serie se está ejecutando a 9600bps

Algo en las líneas de:

void Setup() {
Serial.begin(9600)
}
void loop() {
    Serial.print(analogRead(A0));
    Serial.print("\t");
    Serial.println(millis());
}

En el extremo de recepción, veo un flujo continuo de 5 o 6 segundos, luego un espacio de 2 segundos sin datos, luego otros 5 o 6 segundos llenos de datos. No lo "veo" en vivo, pero graficando el valor de millis () con datos leídos desde el puerto serie.

Creo que podría ser que los datos se pierdan en el búfer de escritura del arduino, o que otra cosa lleve el tiempo del procesador cada 5 o 6 segundos (hay un escudo Ethernet no utilizado) o tal vez el puerto serie escribe en ráfagas .

Cuando aumente la velocidad en baudios a 115200, sigo teniendo intervalos de tiempo, pero parecen más aleatorios.

Actualización:

El aumento de la velocidad en baudios a 38400 eliminó las brechas en las muestras (brechas medidas en tiempo de arduino millis ())

Otra cosa extraña fue:

En el extremo receptor, estaba haciendo cat /dev/ttyACM0 y canalizándolo a awk , lo que agregó el reloj del sistema a cada línea recibida. Luego graficé el tiempo recibido frente al sistema, y no era una línea recta, sino una trama como una escalera. Se eliminó el cat innecesario y el tiempo volvió a la normalidad.

Resulta que cat /dev/ttyACM0 | awk {print} no es lo mismo que </dev/ttyACM0 awk {print} . Parece que el gato hace algunos búferes extraños.

Ahora parece que el arduino lee todos los valores.

    
pregunta marianov

2 respuestas

2

analogRead () devolverá valores de 2 a 3 dígitos, digamos que 3. millis () crecerá rápidamente a valores de 4 y 5 caracteres, y con la pestaña y la nueva línea, eso es aproximadamente 10 caracteres generados en cada ejecución del bucle .

A 9600 baudios, su puerto serie puede escribir un poco menos de 1000 char / seg o un poco menos de 100 líneas de 10 caracteres / seg. Su bucle podría ejecutarse fácilmente a más de 100 veces por segundo y, si es así, el búfer de salida en serie sin duda está desbordado. Debe retrasar 10ms o más en el bucle para que el puerto serie se ponga al día. 115K baudios es 12 veces más rápido por lo que podría reducir la demora (una vez que sepa cuánto necesita) en ese factor para obtener una mayor velocidad de baudios.

    
respondido por el JRobert
0

Dos posibilidades como yo lo veo:

  1. Su programa es en realidad mucho más grande de lo que nos está mostrando y, de hecho, está experimentando algún tipo de desbordamiento de pila que resulta en reinicios aleatorios

  2. Es mucho más probable que su "problema" esté en el Rasp Pi y que el tráfico Serial entrante se esté almacenando en búfer antes de ser enviado a su (arriba de la pila de aplicaciones), probablemente Python, aplicación

Si desea asegurarse de que los bytes salgan del Arduino ASAP, llame a Serial.flush () al final de cada bucle (o después de cada Serial.print *)

    
respondido por el vicatcu

Lea otras preguntas en las etiquetas