Fylla ett obestämt antal variabler med "varierande data", C

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
kimachren
Inlägg: 104
Blev medlem: 15 september 2010, 21:27:18
Ort: Vasa

Fylla ett obestämt antal variabler med "varierande data", C

Inlägg av kimachren »

Jag håller på att göra ett program som ska kommunicera med en sim900 gsm-modul. Modulen använder AT-kommandon.
När man skickar ett kommando till modulen, svarar den ofta med en textsträng innehållande diverse data. T.ex.:

+CMGR: “REC UNREAD”,“+8613918186089”,,”02/01/30,20:40:31+00”
test

För att plocka ut data ur denna används t.ex. sscanf();

Kod: Markera allt

sscanf("+CMGR: “REC UNREAD”,“+8613918186089”,,”02/01/30,20:40:31+00”<CR><LF>test", 
"+CMGR: “%s”,“%s”,,”%s”<CR><LF>%s", status, number, datetime, message);
Nu vill jag dock gärna göra någon sorts "array of struct" där jag kan lägga in

Kod: Markera allt

"+CMGR: “%s”,“%s”,,”%s”<CR><LF>%s"
men även

Kod: Markera allt

char *status, char *number, char *datetime, char *message
för att sedan mata dessa åt sscanf()-funktionen. Variablerna typ och antal behöver kunna anpassas efter vilket svar man får.

T.ex.

Kod: Markera allt

typedef struct {
char *mask;
char *variables...;
} answer;
Är jag ute på för djupt vatten med detta, eller finns det månne någon enkel lösning?
Jag är medveten om att det är enklare att göra en skild funktion per svar, men då blir programmet snabbt mycket stort.
Användarvisningsbild
Icecap
Inlägg: 26803
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Fylla ett obestämt antal variabler med "varierande data"

Inlägg av Icecap »

Jag har lekt en del med GSM-modul och har löst detta fats på ett annat sätt. Om "mitt" sätt sedan är "bättre" vetefan...

Men tänk som så: Om du gör en array av sträng-pekare istället, då kan du ha texten i inkommande buffer och sedan peka på de olika delar med pekarna. Evt. kan du lägga till strängarnas längd for de enstaka delar också i arrayen.
kimachren
Inlägg: 104
Blev medlem: 15 september 2010, 21:27:18
Ort: Vasa

Re: Fylla ett obestämt antal variabler med "varierande data"

Inlägg av kimachren »

Kan du ge exempel?

Edit: Dessutom behöver jag ju info om vart jag peka vad.
kimachren
Inlägg: 104
Blev medlem: 15 september 2010, 21:27:18
Ort: Vasa

Re: Fylla ett obestämt antal variabler med "varierande data"

Inlägg av kimachren »

Ditt svar gav mig en idé; om man gör så som du skriver och skapar en array med strängar, bygger en egen funktion likanande sscanf() som istället för %s,%i osv. använder %0, %1... osv där siffran ger index i arrayen så kunde man ju senare ganska enkelt omvandla strängarna till vad man nu behöver.

Edit: Problemet med array of strings i en AVR blir ju att man måste fördefiniera längden på strängarna. Om man tänker sig att man ska ha allt från en liten statusflagga till ett helt textmeddelande i sin array of strings måste man ju göra ganska långa strängar helt i onödan.
Användarvisningsbild
bit96
Inlägg: 2536
Blev medlem: 3 september 2007, 10:04:29
Ort: Säffle

Re: Fylla ett obestämt antal variabler med "varierande data"

Inlägg av bit96 »

Nu kan jag inte din GSM-modul, men jag har gjort liknande på GPS-moduler.
Men jag antar att GSM-modulen har en bestämd maxlängd på hela strängen samt ett max antal kommaseparerade delsträngar.

Utifrån det kan man skanna hela strängen och hitta de kommaseparerade delsträngarna.
Max antal delsträngar vet man samt att ingen sträng kan vara längre än maxlängden på hela strängen.
Man kan/bör/SKALL naturligtvis under skanning kolla så att maxlängd inte överstigs.

Om man sen väljer index eller pekare eller kopierar ut dom till var sin egen strängvariabel beror på smak och tillämpning.

Själv skulle jag nog kopiera originalsträngen till en egen sträng, därefter leta upp start (,") på varje delsträng och spara det värdet som ett index i en array. Slutet (") på varje delsträng skulle jag ersätta med nolltecken (\0). På så sätt får jag via arrayen en startposition till varje delsträng.

Allmänt tycker jag gäller att man delar upp problemet i små enkla delar och löser dom för sig. Länka sedan ihop lösningarna till det du behöver. Lätt att felsöka, lätt att förändra. Unix-style. :)
Användarvisningsbild
Icecap
Inlägg: 26803
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Fylla ett obestämt antal variabler med "varierande data"

Inlägg av Icecap »

Faktisk behöver man inte att flytta data, man kan istället ha 2 buffrar om det behövs, när det har kommit in en serie data byter man bara ut vilken buffer data ska gå in i och det problem är klart.

Jag förstår inte helt varför att stränguppdelningen måste vara på ett visst sätt (alltså med "%0, %2"), är det för att ha en relativ enkel tabell-styrd uppdelning av vilken sträng det rör sig om? När jag hämtar SMS är uppdelningen konstant om än med olika långa strängar och det är ju synnerligt enkelt att specificera vilket del som är vilken information, det är ju bara att räkna delimiter (i mitt fall ',') och sedan sätta pekare till texterna.

Samtidig med detta kan man lägga in EOL (alltså 0x00) över delimterna och *poof* har man ett antal strängar som man kan leka med.

EDIT: fan, nu jag ser detta inser jag att jag nog ska göra om en del i min hantering... *suck*
Skriv svar