Hi,
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:
Was mir dazu bisher als Fehlerquellen einfällt:
(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.
Sascha F. schrieb:> Hat jemand eine Idee, woran es scheitert?
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.
Sascha F. schrieb:> obwohl der gesuchte> String im Array liegt.
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
Rahul D. schrieb:> Poste mal bitte mehr Code, so dass man den Kram auch selber compilieren> könnte.
Ist zwar für "auf'm PC" aber geht, damit habe ich gestern mal
rumgespielt:
str.c:
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.
Vergessen, der Output:
Wastl schrieb:> Kein Wunder dass man damit in ein Timeout fällt.
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: