Buenos protocolos basados en RS232 para comunicación integrada en la computadora

8

Estoy trabajando en un proyecto que implica una buena comunicación de datos entre un Arduino remoto y una computadora. La conexión inalámbrica es a través de un par de XBees, por lo que tenemos un enlace RS232 entre el Arduino y la computadora. Para pequeñas cantidades de datos, es bastante fácil juntar un protocolo de comunicación simple. Sin embargo, para proyectos más grandes, ¿cuáles son algunos buenos protocolos de comunicación simples?

He visto MODBUS, que parece una opción viable, pero quería ver si había otras opciones mejores.

    
pregunta Computerish

6 respuestas

4

El O.P. solicita un protocolo en serie para una situación en la que " no muchos [de datos] y la velocidad no es un gran problema ". MODBUS se menciona en el O.P. MODBUS sobre RS-485 no es un protocolo rápido. Si bien esto no es una especificación, esto da una idea sobre el nicho.

Puedo pensar en solo dos protocolos estándar comunes para este nicho:

  • NEMA 0183 . Protocolo simple de texto ASCII. Legible por humanos Sólo punto a punto. No admite bus multipunto.
  • MODBUS que ya se mencionó en la O.P.

Muy a menudo, cuando los programadores integrados se encuentran en una situación como la O.P., diseñan sus propios protocolos de comunicación serie desde cero.

    
respondido por el Nick Alexeev
8

Algunos protocolos de sistemas embebidos, varios de ellos extremadamente simples, se enumeran en Sistemas integrados: Protocolos comunes , incluyendo:

Tal vez uno de estos protocolos sería adecuado para su aplicación tal como está, o con solo algunos ajustes menores.

    
respondido por el davidcary
5

Yo votaría rodando el tuyo y lo mantendré lo más simple posible.

He tratado muchos protocolos en serie para varias aplicaciones de control, y algunas cosas que puedo recomendar que incluyas son:

  • Iniciar & caracteres de parada que no se utilizan en ningún otro lado
  • Algún tipo de comprobación de comprobación / error
  • Algún método de control de flujo / señalización, especialmente si necesita comunicaciones bidireccionales.

Como ejemplo muy básico, puede convertir sus datos a caracteres ASCII y pegarlos dentro de los caracteres de inicio / parada como este:

Para enviar el valor de byte 0x7A, los datos enviados serían (7A), donde () son los caracteres de inicio / parada elegidos y 7 y A son dos caracteres ascii. De acuerdo, agrega mucha sobrecarga, pero significa que puede depurar con el software básico de la terminal.

    
respondido por el John U
5

Si sus datos pasan por XBees, debe poner los módulos en modo API con caracteres de escape, dividir sus datos en paquetes lógicos y aprovechar el hecho de que en el modo API un paquete que se entrega a un XBee Llegar intacto o no llegar en absoluto. Diseñe su protocolo alrededor de la transmisión de fragmentos de 1-255 bytes, y deje que los módulos XBee se preocupen sobre cómo entregar los datos dentro de cada fragmento. No se preocupe por mantener la integridad de los paquetes individuales o las subdivisiones entre ellos. Los módulos de Digi harán un buen trabajo cuidando eso. Lo más importante de lo que debe preocuparse es el hecho de que incluso si el nodo que transmite un paquete cree que no se entregó y envía un reemplazo, el destinatario puede obtenerlo de todos modos, posiblemente incluso después de recibir el reemplazo. Las cosas pueden ser más fáciles si diseñas tu protocolo de modo que un lado sea el "maestro"; Si el maestro solicita un dato, el esclavo debe enviarlo una vez y no preocuparse por si el maestro lo recibe. Si el maestro no obtiene los datos que desea, puede solicitarlos nuevamente.

El esclavo debe asignar algún tipo de números de secuencia a los datos, y el maestro debe asignar números de secuencia a las solicitudes para que el esclavo cambie de estado. Si la solicitud del maestro es de la forma "enviar el primer elemento cuyo número de secuencia es mayor que XXX", y cada parte del elemento de datos del esclavo incluye su propio número de secuencia y el del elemento anterior (si no están numerados consecutivamente ), los paquetes que llegan tarde pueden hacer que el esclavo envíe datos de manera redundante al maestro, pero el maestro no tendrá dificultad en ignorar las consiguientes respuestas que llegan tarde. Si el esclavo recibe una solicitud de cambio de estado cuyo número de secuencia es inferior al de una solicitud anterior, debe ignorar esa solicitud, ya que fue reemplazada incluso antes de que se recibiera.

    
respondido por el supercat
3

¿Qué hay de Firmata ? Tiene soporte para varios sistemas operativos y lenguajes de programación. El lado del controlador Arduino y PICduino son compatibles, pero eso no debería ser demasiado difícil de trasladar a un microcontrolador.

    
respondido por el jippie
3

Tuve una pregunta similar a esta y nunca encontré nada simple y lo suficientemente pequeño como para pequeños AVR, etc. Así que rodé algo inspirado en CAN. Se llama MIN (red de interconexión de microcontroladores):

enlace

He blogeado sobre esto aquí:

enlace

Hay ganchos para datos de bloque, pero está dirigido principalmente a señales para sensores / actuadores. He definido un formato JSON para describir las señales y su empaquetamiento dentro de cuadros MIN y espero obtener un disector Wireshark que lo use.

    
respondido por el Ken Tindell

Lea otras preguntas en las etiquetas