tjekke på en lidt speciel streng.

Tags:    c++

<< < 12 > >>
Hej!

Jeg sidder og roder med en uC og et GPRS modem i forbindelse med et skole projekt.

jeg har lidt svært ved at få håndteret mit output rigtigt..

Jeg sender fra min uC nogle AT kommandoer i form af strenge til modemet(over RS232/UART og i C) og ønsker så at teste det den tilbagemelding modemet kommer med..

Problemet er nu at modemet pine død vil svare således..

<carriage return>
<line feed>
+CREG: 0,X
<cr>
<lf>
OK
<cr>
<lf>

i dette tilfælde er "X" en værdi mellem 0-4, værdien SKAL være "1" ellers er der en fejl..
Hvis jeg forsøger at gemme input fra modemet i en streng vil denne blive afsluttet hver gang der kommer et <lf> (det tolker C som slut på streng)

Ved de fleste andre kommandoer returnerer modemet "kun"
<cr>
<lf>
OK
<cr>
<lf>

det er til at gøre, men stadig "grimt" jeg har prøvet både løsninger med gets, getch og getchar men har stadig ikke kunne komme op med et simpelt script der tester for mig..

Er der nogen der udfra min mindre danske stil kan komme med en god ide?

Jeg vil blive meget taknemmelig..

pilfinger.....

[Redigeret d. 23/11-05 21:27:27 af Ricki G.]



12 svar postet i denne tråd vises herunder
0 indlæg har modtaget i alt 0 karma
Sorter efter stemmer Sorter efter dato
Sådan SKAL et modem svarre...

Jeg forstår ikke det med at "det tolker C som slut på streng", det gør C normalt ikke

Jeg tror at det er lettest at parse i hånden
Hvis du har stengen i et char arrray:
char S[123] = "\\r\\nCREG: 0,1\\r\\n"
Så kunne du bruge strstr til at finde "CREG"
Derpå tælle frem til ,
og læse næste tegn



Hej
Jeg har lavet en lille test:

char test_ch0[]="OK";
char test_ch1[]='1';
char input[80];
do{
gets (input);
printf("%s",input);
}
while(input != test_ch0);

Hvis jeg gør dette kan jeg indtaste hvad jeg vil også \\r programmet bliver "hængende" i gets indtil den får et \\n derefter udskriver den alt hvad jeg har indtastet.....

Det giver jo så et problem når modemet får sneget op til 3 \\n ind i et svar...dog nogen gange kun 2..

Jeg leder nok efter en måde at få hele modemets output gemt i en streng og så derefter, som du siger, bruge strstr...

Tak for svaret
pilfinger.....

[Redigeret d. 23/11-05 22:08:30 af Ricki G.]



Du kan ikke sammenligne to strenge som du gør med (input != test_ch0)

Er det get der læser fra modem?



Hej

Ja alt der skal læses er fra modemet, jeg har mine AT kommandoer liggende i et array og sender dem ud på UART vha. af printf() så jeg er bare nød til lige at have snor i hvad modemet svarer..


pilfinger.....



Man kunne bruge noget i stil med:

Fold kodeboks ind/udKode 


Man bør nok udvide checket lidt, så den ikke ender i en uendelig loop hvis ikke der modtages det korrekte.



HEj

Jeg er så nogenlunde med på hvad du mener, har du tid til at smide en kommentar eller 4 ind i koden..

så vidt jeg kan se finder den ',' og tæller en plads frem og returnere dette..?

jeg har lavet et eksempel der faktisk virker..men er grimt :(..

I det har jeg talt de her \\n der kommer fra modemet og placere et "dummy" gets() for dem hver indtil jeg kommer til det sted i strengen jeg ønsker.. ser nogenlunde sådan ud:

while(getch(input) !=',');
gets(input);
pch = strpbrk (input, key);
gets(input);
gets(input);
while(pch==NULL)
{
printf("%s",comm_set); //min kommando til modem
putch(0x0a);
gets(input);
gets(input);
pch = strpbrk (input, key);
gets(input);
gets(input);
}
}

men det er lidt noget rod og ikke 100% sikkert..
jeg prøver ligg at lave et eksempel med din kode..




Mit eksempel læser en streng, leder efter "CREG" hvis den finder det leder den efter den næste ','
Hvis den finder , hopper den én frem, trække '0' fra og returnerer dette. Så hvis næste tegn er '4' vil den returnere 4



Hej
Jeg tror faktisk lige den kode du sendte var noget modemet kunne li :)

jeg har sendt nogle strenge ala den her:

#013#010+CREG: 0,4#013#010OK#013#010

og svaret er perfekt hvere gang:)

da strengen altid vil indeholde et ',' kunne det så ikke være nok kun at kontrollere for det, eller er der en dybere mening jeg ikke lige har set med det dobbelte check.

Tak



Hej
Jeg kan se du ikke samler på point, men har du lyst må du gerne smide et svar.

Tak

[Redigeret d. 24/11-05 00:07:36 af Ricki G.]



Det er sansynligvis nok at lede efter et , men det vil måske kunne give nogle false resultater.
Men problemet er ikke så stort, da der sansynligvis ikke kommer andet end "CREG=..." fra modemmet.

Du har ret, jeg samler ikke på point.



<< < 12 > >>
t