2 votos

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

Tenemos un Razor IMU (10736) placa de sensores conectada a un Salida RS-485 placa, hablando RS485 al ordenador a través de un Interfaz serie USB-RS485 . Utilizamos el IDE Arduino para programar el ATmega328 integrado del Razor (el código se basa en el Razor AHRS firmware de código abierto).

Todo funciona bien, salvo por un detalle: La Razor programada con Arduino parece necesitar un pequeño retardo entre la lectura y la escritura de un mensaje serie. La forma en que funciona, es: el ordenador sondea la maquinilla de afeitar, la maquinilla de afeitar lee la solicitud y luego responde mediante la presentación de informes de sus datos. El código es el siguiente (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 retardo mínimo de 1 milisegundo 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 siempre obtuvimos paquetes de datos corruptos como resultado. Este problema no ocurre cuando sólo se sondea la maquina de afeitar de vez en cuando, sino cuando se la sondea repetidamente a intervalos cortos de tiempo (la computadora espera una respuesta y luego automáticamente dispara un nuevo sondeo). Todo esto está ocurriendo a una tasa de baudios de 76800 en este momento.

A continuación hicimos pruebas programando el ATmega328 integrado en el Razor directamente con código C. ¡Y esto eliminó la necesidad del valor de retardo! La lectura y escritura de datos en serie podría suceder inmediatamente después de la otra. Pero - como nos gustaría permanecer dentro del lenguaje Arduino (por varias razones) - nos gustaría averiguar cómo podríamos resolver este problema de otras maneras.

En el firmware de Arduino, la librería Serial, ¿hay alguna razón por la que tendría que haber un retardo de 1ms entre la entrada Serial y la salida Serial? Y si es así, ¿hay alguna forma de cambiarlo?

0voto

evsc Puntos 151

Este problema se solucionó programando con una versión más antigua del IDE de Arduino (utilicé Arduino 0022). Aparentemente Arduino 1.0 tiene un sistema de colas de escritura con buffer diferente. Ver el respuestas sobre el Arduino para más información.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X