Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
Hallo!!!!!
Ich habe ein sehr grosses Problem. Ich arbeite an einen Projekt und weiß nicht mehr weiter.
Mit meinem beigesteltem vi möchte ich noch folgendes ermöglichen:
Nach dem Einloggen schicke ich dem Microkontroller alle 20 ms das große K. Dann werden Werte ausgelesen und folgendes ausgefiltert zB.:
pos: 01
Es soll dann auf einem Balken die einzellnen Positionen von 1 bis 16 ersichtlich sein.
Es wäre toll wenn mir jemand helfen könnte!!
Danke
Hallo Bertl,
ich habe mir dein VI angeguckt. Was genau läuft denn nicht?
Ich habe gesehen du hastnur eine While-Schleife in der du einen Eventhandling machst. Wobei 200 ms als Timeuot angeschlossen ist. Du wolltest aber doch 20 ms ?!
Ich würde vorschlagen, du machst noch eine zusätzliche While-Schleife (Task), die nur alle 20 ms einen K zum uC sendet. Und eine weitere Task zum Auslesen der seriellen Schnittstelle.
Die Aufgabe an sich ist nicht schwer, ich mache schon seit einem Jahr solche Aufgaben (wobei ich mit bis zu 8 Units gleichzeitig kommuniziere). Und ich will dir dazu sagen, dass du ohne Multithreading nicht weiter kommst. Also benutze die Suchfunktion des Forums und lese was darüber.
Ich habe mich etwas schlau gemacht und ein vi gefunden.
Ich wollte dich nur fragen, wie ich es in mein Projekt einbinden kann und funktioniert es überhaubt? Wenn ja gibt es eine Möglichkeit die einzelnen Positionen auf einem Balken beobachten zu können.
dieses VI ist zum Parsen eines Strings, den du z.B. von der seriellen Schnittstelle empfängst. Am Ausgang gibt dieses VI alle Strings, die durch Zeilenende voneinander getrennt sind und mit einem Doppelpunkt anfangen. Natürlich kannst du dieses VI in deins einbinden (warum nicht?).
Die Frage ist nur:
ist dein String, den du vom uC empfängst genauso oder so ähnlich aufgebaut?
Dann ist zu beachten, dass du über serielle Schnittstelle nicht nur komplette Nachrichten empfängst, sondern auch abgebrochene (hängt davon ab, wie schnell du die serielle ausliest und wie der uC sendet). Du hast also mit einem Datenstrom zu tun. Deshalb müssen die abgebrochenen Zeilenteile evtl. "gepuffert" werden. Zu diesen Resten soll dann eine neue Portion Daten hinzukommen. Dafür eignet sich sehr gut eine Queue (Synchronisationspalette) oder ein Schieberegister in der Parsetask.
Wie ist das Protokoll? ASCII oder binär?
Ich empfehle dir, wie schon gesagt verschiedene Aufgaben in getrennte Tasks zu aufzuteilen. Bei dir wären das:
1. Eventhandling
2. Sendetask
3. Lesetask (evtl. mit dem Parsen und Anzeigen zusammen)
4. evtl. Parsetask
5. evtl. Anzeigetask
Das heist du machst 3 bis 5 parallellaufende Whileschleifen, die miteinander z.B. über lokale Variablen kommunizieren.
Wenn du es gemacht hast, wirst du sehen, wie übersichtlich und einfach dein Programm wird.
Alles, was ich bis jetzt gesagt habe, ist mehr für grosse Projekte gedacht, ist aber auch für kleine anwendbar.
Wenn in deinem Projekt nur ein paar Strings vom uC empfangen, gesendet und angezeigt werden müssen, dann programmiere weiter so, wie bis jetzt. Es ist natürlich fraglich was am schnellsten ist. Meine Methode ist auf jeden Fall effizienter.
Hallo Eugen!
Danke für deinen Tipp! Ich habe gestern mich wieder mit dem Projekt befaßt und habe mir deine Tipps angesehen.
Ich bin leider nicht sehr weit gekommen. Vielleicht kannst du mir einen Ansatz basteln.
Alles passiert im Programm in Binär.
Das beigefügte Dokument liest das große K aus, wobei pos: 01 die Haltestelle ist.
Habe gestern am Abend ein bei meinem Projekt weitergemacht. Habe das Problem, daß das gewünschte nicht ausgelesen und am Balken nicht angezeigt wird. Dafür habe ich es mit der 3. Position versucht.
Vieleicht kannst du mir weiterhelfen???
Danke
Hallo Eugen!
Danke für deine Mithilfe!!!Ich habe es heute ausprobiert. Es funktioniert. Es hat noch einen kleinen Fehler. Wenn ich in die 2. Haltestelle einfahre gibt mir der Tank kurz die 2 aus. Hast du einen Vorschlag wie man so etwas lösst? Wie kann man mehrere Halltestellen herausfiltern aus dem vi, wenn ich die restlichen Haltestellen auf meinem Tank ansehen möcht?