Forum: Mikrocontroller und Digitale Elektronik PIC18F97J60 Frage zu String-Funktionen mit C18


von Ingo S. (schicki)


Lesenswert?

Hallo Zusammen,

irgendwie sehe ich vor lauter Bäumen den Wald nicht. Ich sende mit 
RS-232 ein Steuerkommando an den Kontroller MCT?, HDW? usw.

Im Prinzip funktioniert alles. Beim Testen habe ich jetzt festgestellt, 
wenn der String nur minimal abweicht (z.B. MCI? trotzdem als korrekt 
gelesen wird..

Ich habe es mit strncmp-Befehl probiert, komme aber nicht wirklich 
weiter. Weiß jemand wie man dies lösen kann.

unsigned char str_RS232[4];

if(strcmp(*"MCT?", *str_RS232) == 0)
{
 PORTB = 0X01;
 LcdPrintf(3,9, (const MEM_MODEL rom char *)"PIC18F97J60 ");
 printf("PIC18F97J60 \n\r");
}

Viele Grüße
Ingo

von Karl H. (kbuchegg)


Lesenswert?

Ingo Schick schrieb:

>
> unsigned char str_RS232[4];


?

Der String "MCT?" passt da aber gar nicht rein!

"MCT?" benötigt mindestens ein Array der Länge 5(!). Du hast das 
obligatorische abschliessende \0 vergessen. Und das muss da rein, damit 
du strcmp benutzen kannst.

>
> if(strcmp(*"MCT?", *str_RS232) == 0)

was machen die * hier?

Du vergleichst nicht deine Strings!

   if( strcmp( str_RS232, "MCT?" ) == 0 )

von Ingo S. (schicki)


Lesenswert?

Hallo Karl-Heinz,

das Array habe ich angepasst. Ohne die Sterne compiliert der compiler. 
Aber dann geht gar nichts. Mit den Sternen fragt er zuminstest 
einigermaßen ab. Sehr seltsam. Sowas hatte ich noch nie.

gets1USART(str_RS232,4);
LcdPrintf(2,9, (const MEM_MODEL rom char *)"%.4s", str_RS232);


if(strcmp(*"MCT?", *str_RS232) == 0)
{
     PORTB = 0X01;
     LcdPrintf(3,9, (const MEM_MODEL rom char *)"PIC18F97J60 ");
     printf("PIC18F97J60 \n\r");
}

von Karl H. (kbuchegg)


Lesenswert?

Ingo Schick schrieb:
> Hallo Karl-Heinz,
>
> das Array habe ich angepasst. Ohne die Sterne compiliert der compiler.
> Aber dann geht gar nichts. Mit den Sternen fragt er zuminstest
> einigermaßen ab.

Nö tut er nicht.
Ich könnte dir das jetzt auseinanderklamüsern, was da wirklich passiert, 
aber das ist mir ehrlich gesagt heute schon zu mühsam.

Das einzige was mich wirklich verblüfft: Wie hast du den Unsinn 
eigentlich durch den Compiler gekriegt?

> gets1USART(str_RS232,4);

was bedeuten die 4 hier?
Die Länge des übergebenen Arrays oder die Anzahl der druckbaren Zeichen?
Meistens ist es die Arraylänge. Also muss da auch 5 hin. Bzw. schreibs 
in dem Fall besser so

  gets1USART(str_RS232,sizeof(str_RS232));


> LcdPrintf(2,9, (const MEM_MODEL rom char *)"%.4s", str_RS232);

lass die 4 weg.


Mann - du versteckst ja überall deine Fehler!

von Karl H. (kbuchegg)


Lesenswert?


von Ingo S. (schicki)


Lesenswert?

habs am laufen. Mit dem Debuggerhabe ich mir die Strings angeschaut. Da 
stand nur Mist drin. Im Microchip Forum hatte jemand das gleiche 
Problem...

Der Compiler hat einen Fehler. Der selbe Queltext funktioniert auf dem 
CCS compiler einwandfrei....

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.