Det er mange måter å skrive en seriell protokoll avhengig av hvilken funksjonalitet du måtte ønske deg og hvor mye feilkontroll du trenger.
Noen av de vanligste tingene du ser i punkt-til-punkt-protokoller er:
Slutt på melding
De enkleste ASCII-protokollene har bare slutten på meldingstegnets sekvens, ofte \ r eller \ n da dette er det som blir skrevet ut når enter-tasten trykkes. Binære protokoller kan bruke 0x03
eller annen vanlig byte.
Start av melding
Problemet med å bare ha slutten på meldingen er at du ikke vet hvilke andre byte som allerede er mottatt når du sender meldingen. Disse bytene vil da bli prefikset til meldingen og føre til at den tolkes feil. For eksempel, hvis Arduino nettopp våknet av søvn, kan det være noe søppel i den serielle bufferen. For å komme deg rundt dette har du en start på meldingssekvensen. I eksempelet ditt, ^
, i binære protokoller ofte 0x02
Feilkontroll
Hvis meldingen kan bli ødelagt, vi trenger feilkontroll. Dette kan være en kontrollsum eller en CRC-feil eller noe annet.
Escape Characters
Det kan være at kontrollsummen legger til et kontrolltegn, som f.eks. begynnelsen på meldingen eller slutten på meldingen, eller meldingen inneholder en verdi lik et kontrolltegn. Løsningen er å introdusere en rømningskarakter. Flukttegnet plasseres foran et modifisert kontrolltegn slik at det faktiske kontrolltegnet ikke er til stede. F.eks. hvis et starttegn er 0x02, kan vi bruke rømningstegnet 0x10 ved å sende verdien 0x02 i meldingen som byteparet 0x10 0x12 (byte XOR-kontrolltegn)
Pakke nummer
Hvis en melding er ødelagt, kan vi be om å sende den på nytt med en nack- eller prøv-melding, men hvis flere meldinger er sendt, kan bare den siste meldingen sendes på nytt. I stedet kan pakken gis et nummer som ruller over etter et visst antall meldinger. For eksempel, hvis dette nummeret er 16, kan den sendende enheten lagre de siste 16 sendte meldingene, og hvis noen ble ødelagt, kan den mottakende enheten be om å sende på nytt ved hjelp av pakkenummer.
Lengde◄
Ofte ser du i binære protokoller en lengdebyte som forteller mottakerenheten hvor mange tegn som er i meldingen. Dette legger til et annet nivå av feilkontroll som om riktig antall byte ikke ble mottatt, så var det en feil.
Arduino spesifikk
Når du kommer med en protokoll for Arduino, er den første vurderingen hvor pålitelig kommunikasjonskanalen er. Hvis du sender over de fleste trådløse medier, XBee, WiFi, etc, er det allerede innebygd feilkontroll og prøver på nytt, og dermed ikke noe poeng i å sette disse i protokollen din. Hvis du sender over RS422 et par kilometer, vil det være nødvendig. De tingene jeg vil inkludere er starten på meldingen og slutten på meldingstegnene, slik du har gjort. Min typiske implementering ser ut som:
>messageType, data1, data2,…, dataN \ n
Å avgrense datadelene med et komma gjør det enkelt å analysere , og meldingen sendes med ASCII. ASCII-protokoller er gode fordi du kan skrive meldinger i den serielle skjermen.
Hvis du vil ha en binær protokoll, kanskje for å forkorte meldingsstørrelsene, må du implementere escaping hvis en databyte kan være den samme som en kontrollbyte. Binære kontrolltegn er bedre for systemer der hele spekteret av feilkontroll og prøvinger er ønsket. Nyttelasten kan fremdeles være ASCII hvis ønskelig.