Forum: PC-Programmierung Mit PC verbundene MCU prüfen


von K. Eisbär (Gast)


Lesenswert?

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

von Arc N. (arc)


Lesenswert?

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.

von K. Eisbär (Gast)


Lesenswert?

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?

von Arc N. (arc)


Lesenswert?

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

von K. Eisbär (Gast)


Lesenswert?

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.

von Alexander F. (alexf91)


Lesenswert?

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

von Markus (Gast)


Lesenswert?

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.

von Arc N. (arc)


Lesenswert?

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...

von K. Eisbär (Gast)


Lesenswert?

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.

von Freddy (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.