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!!!
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.
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 | }
|
:
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.