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?