Hay muchas formas de escribir un protocolo en serie dependiendo de la funcionalidad que desee y de la cantidad de errores que necesite.
Algunas de las cosas comunes que ve en los protocolos punto a punto son:
Fin del mensaje
Los protocolos ASCII más simples solo tienen un final de secuencia de caracteres del mensaje, a menudo \r
o \n
ya que esto es lo que se imprime cuando se pulsa la tecla Intro. Los protocolos binarios pueden usar 0x03
o algún otro byte común.
Inicio del mensaje
El problema con solo tener el final del mensaje es que no sabe qué otros bytes ya se han recibido cuando envía su mensaje. Estos bytes se prefijarán al mensaje y harán que se interprete incorrectamente. Por ejemplo, si el Arduino acaba de despertarse del sueño, puede haber algo de basura en el búfer en serie. Para evitar esto, tiene una secuencia de inicio de mensaje. En su ejemplo ^
, en protocolos binarios a menudo0x02
Comprobación de errores
Si el mensaje puede corromperse, necesitamos alguna comprobación de errores. Esto podría ser una suma de verificación o un error de CRC u otra cosa.
Personajes de escape
Podría ser que la suma de verificación se agrega a un carácter de control, como el byte 'inicio del mensaje' o 'fin del mensaje', o el mensaje contiene un valor igual a un carácter de control. La solución es introducir un personaje de escape. El carácter de escape se coloca antes de un carácter de control modificado para que el carácter de control real no esté presente. Por ejemplo, si un carácter inicial es 0x02, utilizando el carácter de escape 0x10 podemos enviar el valor 0x02 en el mensaje como el par de bytes 0x10 0x12 (carácter de control XOR de bytes)
Número de paquete
Si un mensaje está dañado, podríamos solicitar un reenvío con un mensaje oculto o reintentar, pero si se han enviado varios mensajes, solo se puede reenviar el último mensaje. En cambio, el paquete puede recibir un número que se transfiere después de un cierto número de mensajes. Por ejemplo, si este número es 16, el dispositivo transmisor puede almacenar los últimos 16 mensajes enviados y, si alguno se dañó, el dispositivo receptor puede solicitar un reenvío utilizando el número de paquete.
Longitud
A menudo, en los protocolos binarios, se ve un byte de longitud que le dice al dispositivo receptor cuántos caracteres hay en el mensaje. Esto agrega otro nivel de comprobación de errores, ya que si no se recibió el número correcto de bytes, hubo un error.
Arduino específico
Al proponer un protocolo para Arduino, la primera consideración es qué tan confiable es el canal de comunicaciones. Si está enviando a través de la mayoría de los medios inalámbricos, XBee, WiFi, etc., ya hay una verificación de errores y reintentos incorporados y, por lo tanto, no tiene sentido incluirlos en su protocolo. Si envía RS422 durante un par de kilómetros, será necesario. Las cosas que incluiría son el comienzo del mensaje y el final de los caracteres del mensaje, como lo ha hecho. Mi implementación típica se parece a:
>messageType,data1,data2,…,dataN\n
La delimitación de las partes de datos con una coma permite un análisis fácil, y el mensaje se envía mediante ASCII. Los protocolos ASCII son excelentes porque puede escribir mensajes en el monitor en serie.
Si desea un protocolo binario, tal vez para acortar el tamaño de los mensajes, tendrá que implementar el escape si un byte de datos puede ser lo mismo que un byte de control. Los caracteres de control binario son mejores para sistemas donde se desea el espectro completo de verificación de errores y reintentos. La carga útil aún puede ser ASCII si se desea.