Hallo,
folgendes Problem möchte ich lösen. Ich habe einen char Buffer dieser
enthält einen Text. Nun soll zur Laufzeit, wenn ein bestimmtrest Wort
vorkommt soll
ab diesem Wort danach alles mit printf ausgegeben werden.
Welche Möglichkeit gibt es da?
Flo schrieb:> Welche Möglichkeit gibt es da?
Die einfachste Möglichkeit ist in einem Forum deiner Wahl zu betteln,
dass dir jemand den Code schreibt.
Das funktioniert immer, und du musst nicht einmal denken.
Flo schrieb:> Hab das mit strst getestet. Ist langsam. Gibt es eine schnellere> Möglichkeit?> Es wird beim Empfang von seriellen Daten eingesetzt.
Es ist erst Donnerstag.
Den einen Tag hättest du noch warten können.
Flo schrieb:> Hab das mit strst getestet. Ist langsam. Gibt es eine schnellere> Möglichkeit?
Hast du dir denn vorher Gedanken gemacht, was schnell und langsam in
diesem Fall bedeutet? Oder ist es einfach nur gefühlt langsam?
Flo schrieb:> Hab das mit strst getestet. Ist langsam. Gibt es eine schnellere> Möglichkeit?> Es wird beim Empfang von seriellen Daten eingesetzt.
Dass das auf einem PC zu langsam zum Empfang von seriellen Daten ist,
halte ich für sehr unwahrscheinlich.
Flo schrieb:> Hab das mit strst getestet. Ist langsam. Gibt es eine schnellere> Möglichkeit?> Es wird beim Empfang von seriellen Daten eingesetzt.
Wahrscheinlich wartet er noch auf das fehlende r.
Oder wie sieht dein Programm aus?
Die Applikation ist in C/C++ geschrieben. Ich benutze windows.h um auf
die relevanten Funktionen für die serielle Schnittstelle zu nutzen. In
einem Thread wird ständig geprüft ob Daten von der seirellen
Schnittstelle anliegen.
OldMan schrieb:> Klaus W. schrieb:>> Oder wie sieht dein Programm aus?>> Das will niemand wirklich sehen ;-)
Doch
Damit ich heute noch mal ein Lächeln im Gesicht habe.
PittyJ schrieb:> OldMan schrieb:>> Klaus W. schrieb:>>> Oder wie sieht dein Programm aus?>>>> Das will niemand wirklich sehen ;-)>> Doch>> Damit ich heute noch mal ein Lächeln im Gesicht habe.
Gerade den Code gesehen, es war sogar ein Lachen.
PittyJ schrieb:> Gerade den Code gesehen, es war sogar ein Lachen.
Was hilft diese Arroganz jetzt dem TE?
Um's konkret zu machen:
* der gezeigte Code enthält keinerlei Auswertung der empfangenen
Zeichen; aber genau um diese geht es ja eigentlich im Thread hier
* immer mal was zu lesen und dann eine ganze Sekunde warten beschwört ja
(je nach Baudrate) Datenverluste regelrecht herbei; ich habe keine
Ahnung vom Windows-API, aber es sollte doch irgendeine API-Methode
geben, mit der man auf ein (oder mehrere) Zeichen warten kann, genau an
der Stelle sollte der Thread warten
* einen Zeiger zuerst zu benutzen
(pSeriell->LastInterruptTime=pSeriell->LastTime;) und danach zu testen,
ob er nicht 0 ist, ist natürlich Humbug
Flo schrieb:> Hab das mit strst getestet. Ist langsam. Gibt es eine schnellere> Möglichkeit?> Es wird beim Empfang von seriellen Daten eingesetzt.
Ah, fein, 2 weitere Salamischeiben.
Ja, üblicherweise verwendet man eine state-machine als Parser für
Einzelzeichen, der im state sich merkt wie viele Zeichen vorher korrekt
waren und bei erkannter Zeichenfolge ein flag setzt so dass nachfolgende
Zeichen ausgegeben werden.
Wie viele braucht es noch bis die Salami komplett ist ?
Flo schrieb:> Die Applikation ist in C/C++ geschrieben
Ähm, nein. Du hast irgendwas von irgendwo her kopiert ohne zu wissen was
es tut.
Jörg W. schrieb:> PittyJ schrieb:>> Gerade den Code gesehen, es war sogar ein Lachen.>> Was hilft diese Arroganz jetzt dem TE?>
Nein, die hilft ihm überhaupt nicht. Allerdings ist der Code nicht von
ihm. Wer sich in Callbacks etc. begibt, der sollte schon mal einfache
Stringverarbeitung kennen.
Die Stelle, wo er die Vergleich machen möchte, befindet sich nicht im
Sourcecode, sondern müßte komplett ergänzt werden.
Das, was wir als Source sehen, ist ein Copy& Paste, ohne dass der TO
wirklich eine Ahnung davon hat.
Ich plädiere immer dafür, erst einmal ein paar Basics zu lernen. So
einfach mal alle Stringfunktionen. Oder auch std::string, weil die
angenehmer sind.
Sorry: 90% Copy und Paste, die restlichen 10% aus dem Forum hier? So
geht die Welt nicht.
Ja genau nur eine Millisekunde.
Ich bin aktuell dabei das ganze nochmals durchzugehen woran es genau
liegen könnte. Im Prinzip werden mittels Thread geprüft ob Daten
anliegen wenn ja sollen diese im Puffer gespeichert werden. Die Daten
von der seriellen Schnittstelle haben eine Enderkennung "\r\n". Und ein
gültige Nachricht beginnt immer mit einem + danach folgenden die Daten
und zum Schluss werden zur Enderkennung die zwei Zeichen gesendet
"\r\n".
DerEgon schrieb:> Jörg W. schrieb:>> immer mal was zu lesen und dann eine ganze Sekunde warten>> Sleep wartet nicht eine Sekunde, sondern eine Millisekunde.
Ah OK.
Trotzdem Mist: man wartet auf ein Ereignis und nicht stur 'ne Zeit ab.
Unter Posix würde man poll() benutzen. Was auch immer Win-API da hat,
sollte man nehmen.
Der Code wo ich da habe ich echter Mist. Bin da etwas überfragt. Brauche
eigentlich nur für einen Test eine funktionierende serielle
Kommunikation kann auch in C# sein.
Flo schrieb:> Brauche> eigentlich nur für einen Test eine funktionierende serielle> Kommunikation
Gegenstelle ist ein Arduino?
dann hätte ich als etwas schrägen Vorschlag:
"processing" am PC.
https://processing.org/
Diese API kommt dir dann evtl. vertraut vor:
https://processing.org/reference/libraries/serial/index.html
das ganze Graphik-Künstler-Video-Zeug was mitkommt muss man ja nicht
nutzen.
Um das also abzukürzen: du suchst also einen „AT Parser“.
Wenn Du nicht in der Lage bist, einen nach Deinen Vorstellungen zu
entwickeln, nimm doch als Vorbild eins der ca. 42 Fantasillionen
Beispiele: google „at parser“.
Na dann!
Frau zum Shoppen/Freundin schicken, Kanne Kaffee kochen und frisch ans
Werk!
Morgen mittag hast Du es halbwegs am laufen…🥳
Wenn Du dann noch konkrete Fragen hast…
So ich bins nochmal.
Hab nun mal was eigenes aufgesetzt. Jetzt ist es aber nach wie vor so,
dass
wenn ich zyklisch jede 100ms UART Nachrichten (pro Frame 256 bytes)
versende die von der Gegenstelle gesendeten Nachrichten nicht sofort
empfangen kann.
Bist du sicher, dass du das aufgesetzt hast?
Einerseits die teilweise ordentlichen, nicht trivialen Programmteile,
die du postest.
Andererseits das Unverständnis von Basics und mangelnde Kenntnis von
einfachsten Stringroutinen.
Deine ersten Tests waren in C. Jetzt kommt hier C++?
Für mich sieht das mehr so aus, als dass du nur eine neue Quelle für
Copy&Paste erschlossen hast.
Flo schrieb:> Gibt es dazu noch Möglichkeiten dies zu optimieren?
Code verstehen, deinen tatsächlichen Flaschenhals finden, dann
reparieren.
So kann dir das keiner sagen. Selbst mit 'ner UART von 1 MBaud ist ein
heutiger PC locker in der Lage, da einige strstr()-Aufrufe auf das
Resultat anzuwenden, ohne dass irgendwas klemmt. Wenn da bei dir was
nicht funktioniert, liegt das also ganz sicher nicht an strstr() (oder
ähnlichen Standardfunktionen), sondern an irgendwas ganz anderem.
Dafür müsstest du aber erstmal wissen, was du da überhaupt tust. Danach
müsstest du analysieren, warum es bei dir zu langsam wird. Erst dann
brauchst du drüber nachzudenken, wie man es "optimiert".