Probleme mit strstr, strcmp und RS232 communication

OP #3892016
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!!!
Angehängte Dateien:
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.
OP
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.
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
  }

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.