comunicación serial (UART)

6

Solo tengo algunas preguntas generales que aquellos con más experiencia podrían responder fácilmente.

Estoy trabajando con un arduino e interactuando con varios dispositivos, como la PC que utilizo para escribir el código C de arduino, que obviamente está conectado a través de USB, y he tenido éxito con un enlace serial a un iPhone con conectando los pines tx / rx.

  • ¿Qué tipo de garantías de integridad de datos existen para el enlace serial? Por ejemplo, si el cable que conecta dos dispositivos se deshilacha o se daña, ¿qué tipo de cambios puedo esperar que sufra mi flujo de datos? ¿Podría comenzar a recibir datos confusos o simplemente se cortará?

  • ¿Está su funcionalidad completamente encapsulada por un flujo de bytes? Supongamos que quiero transmitir números de 16 bits. Mi primer y único instinto es que debo crear mi propio protocolo (big-endian o little, por ejemplo) para empaquetar mis datos en un flujo de bytes y escribir en el puerto. Funciona más o menos como un socket de red (menos el concepto de paquetes) ¿no es así?

pregunta Steven Lu

2 respuestas

16
  • Async serial no tiene garantías de integridad de datos. Si la integridad de los datos es importante para su aplicación, agregue una suma de comprobación. Pero si todo está conectado correctamente, debería ser bastante sólido.

  • Obtienes una serie de bytes. El resto depende de ti.

  • Si la serie está conectada mientras la transmisión está en curso, no se sincronizará automáticamente. Aparecerá algo de basura en la línea.

Un esquema común es representar datos con paquetes. Entonces el formato del paquete es como:

[byte de sincronización] [byte de longitud de datos] [bytes de datos] [byte de suma de comprobación]

Hay muchas variaciones en él. El byte de sincronización permite que el receptor se sincronice si recibe un mensaje parcial. El byte de sincronización se puede escapar si aparece en otra parte del paquete, o no. La suma de comprobación puede ser una suma de todos los bytes o XOR, o CRC16, etc.

Una alternativa es usar solo ASCII para las comunicaciones seriales. Luego puede sincronizar en '\ n' al final del mensaje. Este es un buen formato para la depuración, ya que puede usar su emulador de terminal favorito.

    
respondido por el markrages
5

Solo para aclarar los diversos comentarios sobre la sincronización en el nivel de bits, he esbozado algunos ejemplos de patrones de bits (¡no muy bien!). Primero, recuerde que el flujo de bits asíncrono consiste en un bit de inicio bajo lógico, un número de bits de datos (generalmente 7 u 8), un bit de paridad opcional y un número de bits de parada alto lógico (típicamente 1 o 2). ). Los bits de datos se envían primero a LSB. La paridad no se usa a menudo, ya que la integridad que proporciona es mínima en comparación con una suma de comprobación vertical, como lo han recomendado los índices de márgenes. El formato más común es 8 bits de datos, sin paridad y un bit de parada.

La primera traza muestra un par de 0x55 bytes: los rectángulos verde y rojo representan los bits de inicio y de detención, respectivamente. Como puede ver, esta es una onda cuadrada, por lo que el receptor no puede saber qué bit bajo es el bit de inicio, ya que cada bit bajo está precedido por un bit alto (que podría ser un bit de parada). Cualquiera que sea la forma en que el receptor lo vea, esto representa un par de 0x55 bytes, pero solo una forma tiene el encuadre correcto. Esta fue la base de mi comentario anterior.

La segunda traza representa un par de 0x10 bytes. Sin embargo, el receptor puede ver los bits marcados por los triángulos como bits de marco y (incorrectamente) decodificar un par de 0x04 bytes.

El tercer rastreo representa un par de bytes 0xFF. No hay ambigüedad aquí ya que todos los bits bajos son auténticos bits de inicio, de ahí el comentario anterior de JustJeff.

Una secuencia típica es como dice markrages en su respuesta. Tradicionalmente, 0x01 (Inicio de encabezado) o 0x02 (Inicio de texto) se han utilizado como un byte de inicio, pero un par de bytes de 0xFF es más confiable como lo dice JustJeff. También es posible que desee poner un 'byte de parada' al final. Tradicionalmente, se han utilizado 0x04 (fin de transmisión) y 0x03 (fin de texto) para este propósito. Por último, compruebe siempre el estado de error de trama de sus receptores.

    
respondido por el MikeJ-UK

Lea otras preguntas en las etiquetas