Avatar billede gobbles Nybegynder
13. november 2005 - 20:26 Der er 14 kommentarer og
1 løsning

test funktion til streng i C

Hej
Jeg sidder og roder med en µC der taler med et modem.
Når jeg sender en kommando til modemet gør jeg det vha. af printf afsluttet med "carriage retur" \r

Modemet svarer nu, hvis alt går vel, med et "OK"\r\n

Jeg ville gerne sende kommandoen og derefter lade systemet vente til "OK" returneres, i C++ ville jeg opfatte "OK" som en streng og teste den mod en anden "OK"streng men den går ikke i C

jeg har prøvet noget ligende det her

void get_put_char(void)
{
char *true = "OK";         
char output[10];                   
printf("AT+CPIN=1234\r");
while (output != true);
gets(output);
printf("\n status er %c\n",output);//bare for at kunne teste..
}

Men den går jo ikke :(  hvis nogen kunne hjælpe mig lidt på sporet af hvordan jeg kan løse det ville jeg blive glad.
(kommunikationen foregår over RS232)

Tak
Avatar billede arne_v Ekspert
13. november 2005 - 22:24 #1
strcmp virker da fint i C
Avatar billede bertelbrander Novice
13. november 2005 - 22:50 #2
#include <string.h>
#include <stdio.h>

int main()
{
  char Array[10] = "";
  while(strcmp(Array, "OK\n"))
      fgets(Array, sizeof(Array), stdin);
}

Du skal måske sammenligne med "OK\r\n"
Jeg går ud fra at stdin og stdout er forbundet med modemet.
Avatar billede gobbles Nybegynder
14. november 2005 - 07:32 #3
Hej og tak begge to

No function prototype "fgets" in scope
Identifier "stdin" not defined within current scope

jeg kører half-duplex da modemet bare venter på input og derefter kun kan svare "OK" eller "ERROR" så jeg sender min kommando ud på den serielle forbindelse og sætter bare C til at vente på en af de 2 svar, hvis svaret er ERROR har jeg mine kommandoer i et array og prøver at sende den samme kommando igen hvis ikke laver jeg increment ++ og sender samme kommando igen.
Problemet er vist at jeg ikke helt ved hvordan jeg skal "læse" at modemet svarer med et "OK\n\r" i et hug, ved ikke helt hvilket slags type det er og hvordan et sådant læses.
Avatar billede gobbles Nybegynder
14. november 2005 - 07:33 #4
increment ++ og sender EN NY kommando. (det er lidt tidligt ;) )
Avatar billede gobbles Nybegynder
14. november 2005 - 07:49 #5
arne_v >

jeg prøver den her..

{
  char szKey[] = "OK";
  char szInput[80];
  do {
    printf ("indtast kommando\n ");
    gets (szInput);
  } while (strcmp (szKey,szInput) != 0);
  printf ("status = OK\n");
}

Det kompilerer fint og (jeg tester via. en terminal) jeg får "indtast kommando" skrevet ud på terminalen, men når jeg indtaster OK\r , OK\n , OK\r\n eller bare OK sker der intet, den forstår ikke lige sammenhængen mellem OK og OK...hvis man kan sige sådan
Avatar billede arne_v Ekspert
14. november 2005 - 14:29 #6
du indtaster OK og trykker på retur tasten ikke

jeg mener at gets/fgets læser \n (det er iøvrigt bedre at bruge fgets !!) så du skal

szInput[strlen(szInput)-1]='\0';

for at smide den væk.
Avatar billede gobbles Nybegynder
14. november 2005 - 20:15 #7
Hej Arne
Ja jeg trykker selfølgelig "retur" :) og mit "OK" bliver sendt ud på forbindelsen men jeg får ikke det ventede output fra C, hvilket må betyde at det er formateret forkert.

Jeg prøvede at bruge fgets, det ville min kompiler ikke med til(No function prototype "fgets" in scope ), noget specielt jeg skal inkludere?.. læg mærke til jeg er på en microcontroller.

hmm træls sted at sidde fast, men tak for jeres hjælp begge to.
Avatar billede bertelbrander Novice
14. november 2005 - 23:01 #8
fgets og stdin ligger i stdio.h, men hvis det er en micro er det ikke sikkert at den har dem.

Kan du se hvad du modtager, eller om du modtager noget? Kan du f.ex. udskrive det?
Avatar billede gobbles Nybegynder
15. november 2005 - 09:56 #9
Hej
Jeg er ret overbevist om at de ikke fungere med uC..
Når jeg sætter terminalen til Z8(min uC) og starter den udskriver den "indtast kommando" (programmet ovenover) nu står den så og venter på jeg indtaster "OK" (jeg skal jo simulere det på en eller anden måde) når den så har registreret et korrekt indtastet "OK" skulle den jo svare status "OK" .. det gør den ikke ligemeget hvad jeg indtaster og hvor mange gange jeg trykker return..

Jeg tror problemet hænger ved at C ikke forstår "OK" korrekt, hvis I skulle lave dette i et simpelt konsol program og uden at bruge fgets og stdin hvordan ville det så se ud? jeg prøver lige at sætte modemet til og så kopiere præcist hvad det returnere med \r og \n måske det kan hjælpe.
Avatar billede arne_v Ekspert
15. november 2005 - 11:55 #10
det var rart at vide præcist hvilke tegn der bliver sendt
Avatar billede gobbles Nybegynder
15. november 2005 - 15:31 #11
Så langt nåede jeg også så jeg fik output i binært sendt ud og har oversat det her:

01000001
01010100  } = AT  (terminal)
00001101  } =<cr> (terminal)



00001101  } =<cr> (modem)
00001010  } =<lf> (modem)
01001111  } = O  (modem)
01001011  } = K  (modem)   
00001101  } =<cr> (modem)
00001010  } =<lf> (modem)

håber det giver mening, den binære kode er output/input <cr> carriage return \r og <lf> line feed \n . (terminal er det jeg taster og modem self. det modem svarer)

Håber ikke det står rodet når jeg trykker send...
Avatar billede bertelbrander Novice
15. november 2005 - 23:42 #12
I så fald skal du vel sammenligne med "\r\nOK\r\n"

Eller blot check om der står OK et sted i strengen:
if(strstr(szInput, "OK"))
  // Det var ok
Avatar billede gobbles Nybegynder
16. november 2005 - 08:39 #13
Tak for hjælpen begge 2

Da systemet i teorien skal ud og sidde på en bøje (i teorien) tror jeg det bliver nødvendigt at skrive en statemachine, hvis der skulle være lidt rod med outputtet..(den mindste fejl/støj på linien bliver til mærkelige karaktere)
Men jeg vil bruge lidt fra hver af jeres forslag.

Så hvis I ikke syntes det er helt hen i vejret må I gerne smide et svar begge 2.

Tak igen.
Avatar billede arne_v Ekspert
16. november 2005 - 13:06 #14
svar kommer her
Avatar billede bertelbrander Novice
16. november 2005 - 20:09 #15
Jeg samler ikke på point.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester