Arduino: ¿Es necesario un retraso de 1 ms entre Serial.read y Serial.write?

2

Tenemos una Razor IMU (10736) placa del sensor conectada a una RS-485 Breakout , hablando RS485 a la computadora a través de una Interfaz serial USB-RS485 . Usamos el Arduino IDE para programar ATmega328 a bordo de Razor (el código se basa en el Razor AHRS firmware de código abierto).

Todo funciona bien, pero por un detalle: la Razor programada por Arduino parece necesitar un pequeño retraso entre la lectura y la escritura de un mensaje en serie. La forma en que funciona es: la computadora sondea la afeitadora, la afeitadora lee la solicitud y luego responde informando sus datos. El código se ve así (simplificado):

if(Serial.available() > 0) {

  int incoming = (int) Serial.read();    // read data
  delay(1);                              // ??? why necessary ???
  digitalWrite(RTS_PIN, HIGH);           // RE high, sets RS485-board to transmit
  Serial.write(c);                       // send data
  delay(1);
  digitalWrite(RTS_PIN, LOW);            // RE low, sets RS485-board to receive

}

Es necesario un retraso de 1 milisegundo como mínimo entre la ejecución de Serial.read () y cualquier forma de salida (digitalWrite y / o Serial.write ()). Intentamos establecer el valor más bajo en el rango de microsegundos, pero como resultado siempre conseguimos paquetes de datos dañados. Este problema no se produce cuando solo sondea la afeitadora de vez en cuando, sino cuando la encuesta repetidamente en intervalos cortos de tiempo (la computadora espera una respuesta y luego activa automáticamente una nueva encuesta). Todo esto está ocurriendo a una velocidad de 76800 en baudios en este momento.

A continuación, hicimos las pruebas programando el ATmega328 a bordo del Razor directamente con el código C. ¡Y esto eliminó la necesidad del valor de retardo! La lectura y la escritura de datos en serie pueden suceder uno tras otro. Pero, como nos gustaría permanecer en el lenguaje Arduino (por varias razones), nos gustaría ver cómo podemos resolver este problema de otras maneras.

En el firmware de Arduino, la biblioteca Serial, ¿hay alguna razón por la que tendría que haber un retraso de 1 ms entre la entrada Serial y la salida Serial? Y si es así, ¿hay formas de cambiar eso?

    
pregunta evsc

1 respuesta

0

Este problema se resolvió programando con una versión anterior del IDE de Arduino (usé Arduino 0022). Aparentemente, Arduino 1.0 tiene un sistema diferente de cola de escritura en búfer. Consulte las respuestas en el foro Arduino para obtener más información.

    
respondido por el evsc

Lea otras preguntas en las etiquetas