Hallo Forum, ich habe ein PC-Programm (Windows) geschrieben was mit meiner MCU (MSP430) einige Daten austauscht. Klappt soweit alles wunderbar. Auch die Abfrage welche Com-Ports den "belegt" und aktiv habe ich realisiert. Diese werden in einer ComboBox angezeigt. Nun möchte ich die Funktion noch etwas erweitern; ich möchte eine Abfrage realisieren bei der ich einen "Erkennungsabfrage" an die Endgeräte hinter den Schnittstellen schicke. Meine MCU soll mit einem "V1", "V2" oder welche Version es ist antworten. Das ist auch gar kein Problem, so etwas ähnliches habe ich schon drin. Mein Frage(n): - wenn ich, z.B. an den Drucker, die Erkennungsabfrage sende und dieser mit der ja wohl nichts anfangen kann, wird diese dann ignoriert oder habe ich mit Problemen seitens der weiteren Endgeräten zu rechnen? - da es bis zu 255 Com-Ports bei Windows geben und ich mehrere MCUs an einen PC haben kann und nun am Ende alle in der ComboBox angezeigt haben möchte, müsste ich alle Com-Ports abfragen. So wie ich das sehe müsste ich bei allen Schnittstellen mit einem anderen Endgerät auf ein Timeout warten. Wie kann ich das handhaben, dass alle in einer erträglichen Zeit (<1s) abgefragt wird und trotzdem das Timeout nicht geringer gesetzt zu werden (aktuell bei 500 ms) braucht? Wäre ein massives Multithreading eine Option? Schonmal Danke für eure Vorschläge und Ideen. Ich hoffe es war soweit alles verständlich. -K. Eisbär
Sind das richtige COM-Ports oder virtuelle wie bei den FTDI-Chips? Falls das virtuelle sind, lassen diese sich mit Seriennummern etc. versehen und über das API des Herstellers/von Windows abfragen ohne alle möglichen abklappern zu müssen. Die Programmiersprache auf dem PC wäre u.U. auch noch interessant.
Das sind virtuelle Com-Ports. Die MCU verbindet sich über die RS232 Schnittstelle und einen "Wandler"-IC mit den PC. Als Programmiersprache setze ich C++ mit dem 07er Standard ein. Compiler ist der aktuelle g++ Compiler (müsste 4.x sein, bin gerade nicht am PC zum nachschauen). Auf der MCU Programmierer ich mit C. Arc Net schrieb: > Falls das virtuelle sind, lassen diese sich mit Seriennummern etc. > versehen und über das API des Herstellers/von Windows abfragen ohne alle > möglichen abklappern zu müssen. Hast du eine Quelle/Tutorial/Paper dazu wie das geht/funktioniert?
K. Eisbär schrieb: > Das sind virtuelle Com-Ports. Die MCU verbindet sich über die RS232 > Schnittstelle und einen "Wandler"-IC mit den PC. Es wäre schon praktisch zu wissen welcher das genau ist... http://www.silabs.com/Support%20Documents/TechnicalDocs/an197.pdf http://www.ftdichip.com/Support/Documents/ProgramGuides/D2XX_Programmer%27s_Guide%28FT_000071%29.pdf
Arc Net schrieb: > Es wäre schon praktisch zu wissen welcher das genau ist... Ein FTDI-FT232RL, hier der Farnelllink: http://de.farnell.com/ftdi/ft232rl/usb-uart-smd-ssop28-232/dp/1146032?Ntt=1146032 Ganz gut wäre es auch wenn die Lösung nicht "Windows-only" ist. Wenigstens Linux wäre mir noch wichtig. (Die Kommunikation über die serielle Schnittstelle ist aber schon in einer Win und einer Linux-Version, wäre aber blöd wenn eine Version mehr kann als die andere) Danke für deine Hilfe bisher. Die PDFs schaue ich mir heute Abend noch an.
boost::asio wäre eine Option. Da geht das, ohne explizit Threads zu starten. Der Timeout lässt sich mit einem Timer und einem asynchronen wait realisieren, die Kommunikation mit einem serial_port, ebenfalls asynchron. Wird die Callback Funktion vom Timer ausgeführt, dann brichst du die Serial-Port Operation ab. http://www.boost.org/doc/libs/1_56_0/doc/html/boost_asio.html
Lass deine MCU ein alive Signal senden, wenn keine Kommunikation mit dem PC läuft Am PC öffnest du einfach alle verfügbaren COM-Ports und überprüfst nach kurzer Zeit den Empfangspuffer auf das alive Signal. Geht in einem einzigen Thread und die benötigte Timeoutzeit ist mit der Zykluszeit des alive Signals bestimmbar.
K. Eisbär schrieb: > Ganz gut wäre es auch wenn die Lösung nicht "Windows-only" ist. > Wenigstens Linux wäre mir noch wichtig. (Die Kommunikation über die > serielle Schnittstelle ist aber schon in einer Win und einer > Linux-Version, wäre aber blöd wenn eine Version mehr kann als die > andere) Da gäbe es mindestens zwei Möglichkeiten: libftdi (auch unter Windows oder OSX) http://www.intra2net.com/en/developer/libftdi/ oder http://www.ftdichip.com/Drivers/D2XX.htm die es auch für Linux gibt...
Danke an alle die mir eine Antwort gegeben haben. Ich denke ich werde Markus seinen Lösungsvorschlag probieren, dieser erscheint mir am einfachsten in meine bisheriges Programm einzupflegen und für die Zukunft bestimmt auch am geeignetsten.
meine MCU haben immer ein "Heartbeat" Signal, was eigentlich nichts anderes als ein Counter oder eine Clock. Das kann man ganz abfragen oder notfalls regelmäßig senden und dann wie von Markus vorgeschlagen die Com Ports auf dieses Signal abklappern...
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.