versuche mich gerade , ein ESP8266 per UART anzubinden. Der Uart läuft im Interrupt und füllt auch das Array. Nun will ich im Arry auf Strings vergleichen:
(1) strstr() checkt auch auf Groß-/Kleinschreibung, ok != OK
(2) das durchchecken des Strings dauert länger als man denkt (Timeout)
(3) delay_ms() ist aktives warten nehme ich mal an, wird in der Zeit tatsächlich was in den RxBuffer[] geschrieben (DMA, Interrupt)?
(4) wenn das Programm in der Schleife
1
for(uint32_tt=0;t<TimeOut_ms;t++)
steckt, wird CountOfParameter nicht geändert.
Ich kenne den ESP nicht aber ich gehe mal davon aus, dass die CPU den Wert von CountOfParameter bzw. den Inhalt von RxBuffer[] nur dann ändert, wenn die CPU das auch darf, also die for-Schleife auch mal verlässt und andere Dinge macht. Entweder ist da eine 2. CPU noch aktiv (Shared Memory u. dgl.) oder aber durch Interrupts werden die Inhalte geändert.
Zu Punkt (1): Aus der man-Page von strstr()
1
strstr(constchar*haystack,constchar*needle);
The strcasestr() function is like strstr(), but ignores the case of both arguments.
Poste mal bitte mehr Code, so dass man den Kram auch selber compilieren könnte.
Hast du deine Funktion mal mit konstanten Werten ausprobiert?
z.B. strstr("ABC", "ABCDEF")
Lass dir doch mal deine args ausgeben.
Groß- und Kleinschreibung hatte Hegy ja schon angesprochen.
Vorsicht, demnächst hast du evtl. das umgekehrte Problem, die Funktion wird immer Strings finden, die garnicht mehr im buffer vorhanden sind.
Problem: strstr (und andere str*-Funktionen) erwarten Null-Terminierte Strings.
Wenn deine UART-Receive-ISR das nicht sicherstellt, solltest du nach deinem delay_ms(1) ein
RxBuffer[RxBufferIndex]='\0'; einfügen, und für den Rest der Schleife die Interrupts sperren...
Very ugly, I know.
Ansonsten schaut das ganze Konzept schon sehr verkorkst aus
Mit
gcc -Wall -O2 -s str.c -o str
compilieren, geht ohne Fehler und Warnungen.
Ich habe ein paar printf()'s eingebaut, wie man sieht und ein paar kleine Änderungen.
Ich bin davon ausgegangen, dass die delay_ms() Funktion sowas in der Art ist und deswegen habe ich mir mal eben schnell so eine aktives-Warten-Funktion gebaut.
Bei mir sieht z. B. die HAL-Delay() Funktion so aus: