Introduktion till AT-kommandon

Alla utvecklare som måste arbeta med ett mobilmodem måste någon gång använda sig av så kallade AT-kommandon. AT-kommandon är i huvudsak modeminstruktioner. Ursprungligen utvecklades AT-kommandon av modemtillverkaren Hayes som medel för att driva deras produkter för uppringd fast telefoni, men AT-kommandon – ”AT” står för ”come to ATtention” – används nu av alla modem, av alla typer.

AT-kommandon används i första hand för att konfigurera ett modem och upprätta dess nätverksanslutning. De kan också användas för att få information om modem- och anslutningsstatus, vilket kan vara till stor hjälp vid felsökning av program och för att bekräfta att ett modem fungerar korrekt: det har anslutit sig till rätt nätverk, använder rätt mobilteknik, har roaming aktiverat osv. Vi kommer att titta på några användbara kommandon för uppgifter som dessa inom kort.

Hur man skickar AT-kommandon

AT-kommandon skickas till modemet som ren text via en seriell (UART) anslutning som består av två trådar, en för mottagning (RX) och en för sändning (TX), eller via USB. På fältet hanterar en mobilaktiverad IoT-enhet sitt modem genom att skicka AT-kommandon, men under applikationsutveckling och felsökning är det inte ovanligt att man kopplar av modemets anslutning. På så sätt kan du starta en terminal och interagera med modemet direkt genom att utfärda egna AT-kommandon.

Hur man formaterar AT-kommandon

De kommandon som du skickar måste följa följande grundläggande syntax:

AT<COMMAND><SUFFIX><DATA>

Detta kallas för en ”kommandorad”. Som du kan se börjar den med AT, följt av ett kommando, ett suffix för att ange kommandoläge eller ”typ” och slutligen vissa data, även om det inte är alla kommandon som behöver detta fält.

Den här strukturen kallas för ”kommandorad” och den avslutas alltid med en enkel vagnhämtning. Du kan inkludera flera kommandon i raden, var och en separerad av ett semikolon:

AT<COMMAND><SUFFIX><DATA>;<COMMAND><SUFFIX><DATA>;<COMMAND><SUFFIX><DATA>

Alla rader, oavsett hur många kommandon de innehåller, har bara ett AT, i början. Du får ett fel om du inkluderar AT mer än en gång i en enda rad. Kommandona i rader med flera kommandon behandlas sekventiellt. Linjelängden är vanligtvis begränsad till 80 tecken.

AT kommandoradsfält

Fältet <COMMAND> anger vad du vill att modemet ska göra. Äldre, ”grundläggande” kommandon har namn med ett enda tecken; senare tillägg till kommandosatsen, kallade ”utökade” kommandon, föregås av ett +-tecken, t.ex. AT+COPS (söka efter nätverk) och AT+CGMI (hämta modemtillverkare). Vissa kommandon har prefixet & – till exempel AT&F, som återställer modemets inställningar. Alla cellkommandon är utökade kommandon. Enligt AT-kommandospecifikationen måste kommandon bestå av versaler, men många modem tillåter att kommandon även skickas med små bokstäver. Vi håller oss till standarden.

Värdena i fälten <DATA> och <SUFFIX> beror på kommandotypen, av vilka det finns fyra:

.

Type Suffix Role
Read ? Hämta inställningar för modemkonfiguration
Inställ = Inställ en modemkonfiguration setting
Execute None Trigger en modemoperation
Test =? Kontrollera om ett modem har stöd för det namngivna kommandot – men observera att AT+COPS=? fungerar något annorlunda, som vi kommer att se strax

Vi kommer att se hur dessa typer påverkar användningen av AT-kommandon om en stund, men låt oss först se hur modemet svarar på kommandon.

AT-kommandosvar

När ett AT-kommando utfärdas kan modemet, beroende på vilket kommando som skickas, returnera data eller inte, dvs. göra vad som kallas ett ”informationssvar”. Hur som helst slutar kommandot alltid med att modemet returnerar en ”resultatkod”.

Antag att vi till exempel frågar efter namnet på modemets tillverkare med följande kommando:

AT+CGMI

Detta kommer att generera följande svar när det anropas på ett u-blox-modem:

u-bloxOK

Varje enhet i svaret – informationen (översta raden) och resultatkoden (nedersta raden) – är omgärdad av tecken för Carriage Return och Line Feed (Ascii-kod 0x0D respektive 0x0A), därav den tomma raden före OK.

OK är en returkod; den andra är ERROR – du har gjort ett misstag. Kanske svarar modemet inte på AT-kommandot du skickade, eller så har du skrivit fel. Kanske har du angett för få eller för många datavärden eller kommandoparametrar. Som standard ger modem kanske inte mycket förklaring. Som tur är kan vissa av dem ställas in så att de returnerar utökad felinformation; återigen måste du skicka ett AT-kommando för att tillämpa denna inställning: AT+CMEE=2.

Det är viktigt att förstå att du också kan få ERROR från ett helt giltigt AT-kommando. När detta händer är det en indikation på att modemet befinner sig i ett tillstånd som är inkompatibelt med kommandot. Om du till exempel försöker ändra modemets Access Point Name (APN) medan det är aktivt, returneras vanligtvis ERROR. Lösningen är att avaktivera modemet, göra APN-ändringen och sedan återaktivera det.

AT-kommandotyper och testning

Du kan mildra problemet med till synes korrekta kommandon som ger fel genom att använda suffixet testkommando (=?), som används för att fråga modemet om det har stöd för det givna kommandot. Om det inte gör det får du en ERROR returkod; du vet då att du inte ska ge detta kommando. Om modemet stöder kommandot får du ett informationssvar som anger kommandots parametrar, om det har några, följt av OK.

Exemplet ovan kan användas för att demonstrera testning av kommandon. Vi kan fråga modemet om det stöder kommandot +CGMI:

AT+CGMI=?

och det kommer att svara OK eftersom det stöder kommandot. Men eftersom modemets tillverkare är fast, kommer försök att ändra den alltid att resultera i ERROR. Hur kan vi ha försökt ändra dess värde? Med ett suffix för ett inställt kommando (=):

AT+CGMI="Fintlewoodlewix"ERROR

Bemärk hur strängdata placeras inom dubbla citationstecken – även detta är ett krav för AT-kommandon.

Lämna en kommentar