Forum: PC-Programmierung Probleme mit strstr, strcmp und RS232 communication


von Genadi D. (gddilm)


Angehängte Dateien:

Lesenswert?

Hallo,

ich bin Anfänger mit dem Programmieren, ich wollte Kommunikation 
zwischen einer Steuerung(Atmel Chip) und einem 
Microblaze-Prozessor(Xilinx) erstellen. Dafür wollte ich erst ganz 
einfach die Steuerung beim Initializieren erkennen. Die Steuerung 
schickt seine Initializierungszeilen und ich wollte entweder mit 
"strstr" oder mit "strcmp" nach einem Wort suchen. Das Problem ist es 
funktioniert nicht ganz richtig und ich verstehe nicht warum. Hier mein 
Code im File und 2 Bilder, welche zeigen wie ich die 
Initializierungszeilen empfange. Das Bild1 bezieht sich auf 
xil_printf("%s",receivedBufferFromMotor); Bild2 auf 
xil_printf("%s/n",receivedBufferFromMotor);. Ich habe es gemacht um zu 
sehen wie ich die Bytes in Wirklichkeit bekomme. Etwas stimmt aber nicht 
weil die Bilder  nicht identisch sind und damit meine ich nicht "/n". 
Ich will wenn es möglich ist auch nach dem Wort READY! oder M1F suchen.

Danke im Voraus!!!

von Karl H. (kbuchegg)


Lesenswert?

Genadi D. schrieb:

> "strstr" oder mit "strcmp" nach einem Wort suchen. Das Problem ist es
> funktioniert nicht ganz richtig und ich verstehe nicht warum.

Dein Problem ist, dass du davon ausgehst, dass du hier
1
         receivedBytesCountFromMotor = XUartLite_Recv(&RS232_1, receivedBufferFromMotor, fifoBytesSize);
2
          
3
4
                                if (receivedBytesCountFromMotor != 0)

eine komplette Zeile bekommst.
Dem ist nicht so.

Du bekommst das zurück, was zu diesem Zeitpunkt bereits in der UART war. 
Aber das muss nicht notwendigerweise eine komplette Zeile sein.

Eine komplette Zeile hast du dann, wenn du das <CR><LF> empfangen hast. 
Erst dann macht es Sinn die auszuwerten.

Du musst also solange Zeichen von der UART holen und in einem char-Array 
zusammensetzen, bis du in den Daten ein <CR><LF> findest (in C 
schreibweise also ein \r\n). Erst dann hast du deine Zeile.

von Genadi D. (gddilm)


Lesenswert?

Du hast deine Gedanken sehr gut formuliert, genau das wollte ich fragen, 
wie kann ich es so machen dass ich erst nach dem Empfang alle Bytes oder 
die ganze Information meine Strings suche. Was ich noch sagen kann ist 
dass, jetzt suche ich nach dem "F" was nur ganz am Ende kommt bei "M1F", 
und es funktioniert, aber ich weiß das es nicht schön und auch nicht 
ganz richtig ist so zu machen.

von Karl H. (kbuchegg)


Lesenswert?

Genadi D. schrieb:
> Du hast deine Gedanken sehr gut formuliert, genau das wollte ich fragen,
> wie kann ich es so machen dass ich erst nach dem Empfang alle Bytes


In dem du alle Bytes auch empfängst!

Zu Deutsch. Es reicht nicht einmalig XUartLite_Recv aufzurufen!

Bei jedem Aufruf kriegst du ein paar Zeichen. Aus dem Returnwert weisst 
du, wieviele das sind. Die hängst du an deinen String an (der natürlich 
am Anfang leer war). Und erst dann, wenn das letzte Zeichen ein CR war 
(ein \n) erst dann weisst du, dass du jetzt den String komplett hast.

Das dir XUartLite_Recv die Möglichkeit gibt, einen größeren Buffer 
anzugeben, ist zwar nett, aber in deinem Fall eher hinderlich. Es ist 
einfacher, wenn du die Zeichen einzeln holst.

So in etwa
1
char ReceiveBuffer[200];
2
int  ReceiveBufferCount;
3
4
char tmp;
5
...
6
7
   ReceiveBufferCount = 0;
8
   while( 1 ) {
9
10
     receivedBytesCountFromMotor = XUartLite_Recv( &RS232_1, &tmp, 1 );
11
12
     if( receivedBytesCountFromMotor > 0 ) {
13
       if( tmp == '\r' )
14
         ; ignorieren
15
16
       else if( tmp != '\n' ) {     // normales Zeichen
17
         ReceiveBuffer[ReceiveBufferCount++] = tmp;
18
       }
19
20
       else {                       // bleibt nur noch \n
21
                                    // wenn \n kommt, ist der String komplett
22
         ReceiveBuffer[ReceiveBufferCount] = '\0';
23
24
         xil_printf("Hab verstanden: %s\n",ReceiveBuffer);
25
         ReceiveBufferCount = 0;
26
       }
27
     }
28
  }

: Bearbeitet durch User
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.