Kommunikation uC mit PC via UART und VCP



  • Hallo liebe Bastler und Programmierer!

    Ich stehe leider vor einem für mich noch sehr undurchsichtigen Problem. Ich weiß leider nicht genau an welche Stelle ich näher bohren muss. Daher suche ich hier um Rat, wie ich am besten beginnen kann...

    Also was will ich machen?
    Ich möchte gerne in C ein einfaches Programm schreiben, welches z.B. in einer Konsole läuft und Zeichenketten oder Variablen an meinen Mikrocontroller schickt und anders herum. Da ich an meinem Laptop keine V.24 Schnittstelle habe, möchte ich/muss ich einen der USB-Ports nutzen. Ich denke das ganze wird dann über Virtuelle COM Ports laufen...

    Was habe ich bereits?
    Ich habe einen AVR AT90CAN Mikrocontroller von Atmel mit welchem ich bereits ein LCD Display erfolgreich ansteuern kann. (An dem LCD möchte ich z.B. gerne Zeichenketten vom PC aus anzeigen lassen.) Dieser uC verfügt des weiteren über eine UART Schnittstelle, welche mit einem CP2101 UART-2-USB-Converter verbunden ist.
    Ebenso habe ich bereits einen Virtuellen COM PORT Treiber, welchen ich auf der Homepage des CP2101 gefunden habe.
    Was uC-Know-How betrifft bin ich bereits sehr gut bewandert. Leider hackt es bei mir auf der PC-Seite bzw. beim Schnittstellenzugriff 🙂

    Mein System:
    Ich programmiere mit MinGW in Eclipse. Benutze Windows 7 (64bit).
    Leider kenn ich mich mit dlls, kernel, API nicht besonders gut aus. Diese Stichwörter habe ich bei meinen bisherigen Recherchen sehr oft gelesen.

    Meine Frage(n):
    Für mich ist jetzt die Frage wie kann ich so ein C-Programm schreiben, welches irgendwie über einen USB-PORT Daten sendet und empfängt?

    Was mir unklar ist:
    Welche Möglichkeiten gibt es? Welche sind einfach zu realisieren?
    Was muss in den Header?
    Welche Include Dateien brauche ich?
    Wie steuere ich den USB an?
    Wie kann ich mich auf den VCP beziehen?

    Vielleicht kann mir da ja jemand von euch weiterhelfen! Wäre klasse!
    Dankeschön und viele Grüße
    Norbert



  • Der Begriff "virtual COM Port" wird üblicherweise für COM Ports verwendet an deren Ende kein "echter" RS232 Port hängt, sondern 'was gänzlich anderes. Wie z.B. ein anderer virtueller COM Port oder eine Netzwerkverbindung.

    Das was du von einem USB <-> RS232 Adapter bekommst nennt man normalerweise einfach COM Port. Es unterscheidet sich nicht grundlegend von einem COM Port der direkt am Mainboard drauf ist. Zumindest nicht aus der Sicht eines Usermode-Programms.

    > Welche Möglichkeiten gibt es? Welche sind einfach zu realisieren?
    Möglichkeiten für was?

    > Welche Include Dateien brauche ich?
    windows.h

    > Wie steuere ich den USB an?
    Gar nicht. Du machst nen COM Port auf und plauderst mit dem. Dass dieser COM Port über USB angebunden ist muss dich nicht interessieren. Macht für dich keinen Unterschied.

    > Wie kann ich mich auf den VCP beziehen?
    Was heisst VCP? Virtual COM Port etwa? Bitte keine Abkürzungen erfinden.
    Und was meinst du mit "dich auf den VCP beziehen"? Huch?

    ----

    Mach den Port auf ( CreateFile auf \\.\COMx mit x=die COM Port Nummer), konfiguriere den Port so wie du es brauchst ( BuildCommDCB , SetCommState , SetupComm , SetCommTimeouts ) und dann kannst mit ReadFile / WriteFile Daten lesen bzw. schreiben.
    Easy.
    Die oben genannten Funktionen sind alle recht gut in der MSDN dokumentiert. Bloss verwende nicht die Suchfunktion der MSDN - Google findet Dinge in der MSDN viel besser als die integrierte Suche!

    Oder du suchst dir eine der unzähligen Libraries/Hilfsklassen die es zur Kommunikation mit COM Ports so gibt, und verwendest diese.
    Wobei die Windows-Funktionen wirklich nicht so schwer zu durchschauen sind.



  • Hilfe, Hilfe. Der CP2101 ist seit mindestens 8 Jahren NRND: "The CP2101 is a mature product and is not recommended for new designs." Warum nimmst Du nicht wenigstens den CP2102?

    Siehe auch: CP210x Comparison Chart

    Ansonsten stimme ich hustbaer natürlich zu. Das einfachste Für Dich wird sein, den VCP zu verwenden. Von SiLabs gibt es hierzu die AN197. Für deren USBXpress schaust Du in die AN169. Aber wie gesagt, bleibe am Anfang besser beim COM-Port...



  • Ist VCP eine übliche Abkürzung? In dem Fall ziehe ich meine diesbezügliche (und dann deplazierte) Bitte zurück 😉
    EDIT: Tatsache, es ist. Man lernt nie aus 🕶



  • hustbaer schrieb:

    Mach den Port auf ( CreateFile auf \\.\COMx mit x=die COM Port Nummer)

    HANDLE hFile = CreateFile(lpszDevice, 
    			   GENERIC_READ|GENERIC_WRITE, 
    			   0, 0, OPEN_EXISTING, 0, 0);
    

    ,konfiguriere den Port soweit notwendig ...

    Wenn man sich nicht mit den ganzen Details rumschlagen will macht es Sinn eine der als gut funktionierend bekannten Quellen zu nutzen.

    Beispiel: Serial library for C++ by Ramon de Klein
    http://www.codeproject.com/Articles/992/Serial-library-for-C



  • Hallo zusammen,

    vielen Dank für die guten Antworten! Ich glaube das hilft mir erst mal sehr viel weiter, weil ich jetzt weiß wie ich beginnen kann. Hoffe dass die nächsten Tage mal etwas Zeit neben der Arbeit ist, damit ich das ausprobieren kann... 🙂

    Möchte noch auf eure Gegenfragen antworten:

    hustbaer schrieb:

    > Welche Möglichkeiten gibt es? Welche sind einfach zu realisieren?
    Möglichkeiten für was?

    --> Ich meine damit, welche prinzipiellen Möglichkeiten bestehen, wenn ich physikalisch einen uC, USART/USB-Wandler und PC mit USB-Buchse habe. Welche Methoden bestehen den uC mit dem PC kommunizieren zu lassen?
    (So wie ich das verstehe ist eine Methode über einen Virtuellen COM PORT und RS232. Mein Verständnis ist, dass es aber auch noch über eine echt USB-Verbindung gehen müsste oder?)

    hustbaer schrieb:

    > Wie kann ich mich auf den VCP beziehen?
    Was heisst VCP? Virtual COM Port etwa? Bitte keine Abkürzungen erfinden.
    Und was meinst du mit "dich auf den VCP beziehen"? Huch?

    --> Ich hab das mit VCP öfters schon gelesen. Ist nicht von mir erfunden 🙂
    --> Mit "mich auf den VCP beziehen" meine ich: Wie kann ich in meinem C-Code den Virtuellen COM Port ansprechen? Brauche ich dafür spezielle includes? Muss ich irgendwas installieren? Mit welchem Code kann ich den ansprechen (das wurde ja bereits weiter oben erklärt, danke dafür!!!)

    Mox schrieb:

    Hilfe, Hilfe. Der CP2101 ist seit mindestens 8 Jahren NRND: "The CP2101 is a mature product and is not recommended for new designs." Warum nimmst Du nicht wenigstens den CP2102?

    Siehe auch: CP210x Comparison Chart

    --> Sagen wir es so: Ich habe diese Platine inkl. uC und CP2101 schon seit mehreren Jahren so im Regal rumliegen. Erst seit kurzem habe ich wieder mehr Zeit für uC Projekte und würde ungern die Platine umbauen. Aber werde mir deinen Hinweis für spätere Projekte gerne im Hinterkopf behalten.

    merano schrieb:

    Beispiel: Serial library for C++ by Ramon de Klein
    http://www.codeproject.com/Articles/992/Serial-library-for-C

    --> Danke dafür. Der Code ist nur leider in C++. Gibts etwas ähnliches in C?



  • Bize schrieb:

    --> Danke dafür. Der Code ist nur leider in C++. Gibts etwas ähnliches in C?

    Ob du auf dem PC C oder C++ verwendest, ist ziemlich egal. Nutz doch die Gelegenheit um in C++ einzusteigen. 🙂



  • Bize schrieb:

    --> Ich meine damit, welche prinzipiellen Möglichkeiten bestehen, wenn ich physikalisch einen uC, USART/USB-Wandler und PC mit USB-Buchse habe. Welche Methoden bestehen den uC mit dem PC kommunizieren zu lassen?
    (So wie ich das verstehe ist eine Methode über einen Virtuellen COM PORT und RS232. Mein Verständnis ist, dass es aber auch noch über eine echt USB-Verbindung gehen müsste oder?)

    Natürlich geht das. Wird Dich aber erst recht überfordern, wenn du schon Probleme hast die Systemaufrufe aus einem C++ Programm (notfalls) auch mit C zu verwenden.



  • @merano
    Die von dir verlinkte Library ist halt schon etwas hardcore.
    Das ganze asynchrone Gedöns braucht man oft auch gar nicht.

    Gut, manchmal ist die einzige Alternative zu asynchronem IO Threads zu verwenden - wenn man damit keine Erfahrung hat ist es fraglich womit man besser fährt.
    Aber ich schätze dass der OP für sein Programm vielleicht überhaupt nix asynchron machen muss, weder mit Threads noch sonstwie.

    @Bize
    Hast du dir mal die von mir genannten Funktionen angesehen? Ich hab schon viel Code geschrieben der serielle Schnittstellen verwendet, alles direkt auf WinAPI aufbauend. Ich fand das nicht besonders erschreckend. Das Zusammensuchen der benötigten Funktionen um die ganzen Einstellungen des COM Ports programmatisch zu setzen war dabei das lästigste.





  • Mr C schrieb:

    schau ob damit weiter kommst:
    http://members.inode.at/anton.zechner/az/Seriell.htm
    http://softwaresouls.com/softwaresouls/2011/12/11/simple-c-class-example-using-serial-port/
    http://sourceforge.net/projects/cppserialcom/
    http://stackoverflow.com/questions/1652698/control-usb-ports

    Der erste Link geht wohl für C.

    2. und 3. Link
    Wenn der OP schon kein "normales" C++ mag wird er C++.NET erst recht nicht mögen.

    4. Link
    Der Hinweis auf libusb for win32 http://libusb-win32.sourceforge.net/ ist da schon eher das was er eigentlich will.
    Leider muss man dann aber erstmal einen Treiber (libusb0.sys) installieren.
    Das will man eigentlich ja auch nicht ...



  • merano der TE hat in seinem zweiten Post gefragt ob der Code nicht in C gibt, also der erster link wird passen zu mindest Ansatzweise.
    Währe nicht nötig mein letzten Post zu zitieren, bin nicht blind.



  • Der 1. Link sieht wirklich gut aus.
    Hält den Ball schön flach, was gut für Anfänger ist.
    Und er unterstützt sogar den Device-Path abzufragen. Was nützlich ist, wenn man den COM Port eines USB Geräts mit einer bestimmten VID/PID automatisch bestimmen möchte.







  • hustbaer schrieb:

    @merano
    @Bize
    Hast du dir mal die von mir genannten Funktionen angesehen? Ich hab schon viel Code geschrieben der serielle Schnittstellen verwendet, alles direkt auf WinAPI aufbauend. Ich fand das nicht besonders erschreckend. Das Zusammensuchen der benötigten Funktionen um die ganzen Einstellungen des COM Ports programmatisch zu setzen was dabei das lästigste.

    Hallo Hustbaer,

    ja, hab ich. Es klappt sehr gut!
    Kann nun die COM Schnittstelle öffnen, Baudrate setzen, Parität usw....
    Endlich kann ich mit meinem uC via serieller Schnittstelle kommunizieren.
    Ich brauch da meistens immer den ersten Anstupser bis ich weiß wie ich mal anfangen kann, danach läuft es dann meistens von selber. Und mit den Schnittstellen eines PCs habe ich bisher noch nie was gemacht.

    Vielen Dank dafür!!

    merano schrieb:

    4. Link
    Der Hinweis auf libusb for win32 http://libusb-win32.sourceforge.net/ ist da schon eher das was er eigentlich will.
    Leider muss man dann aber erstmal einen Treiber (libusb0.sys) installieren.
    Das will man eigentlich ja auch nicht ...

    Ja, mit der libusb für win32 habe ich mich auch schon mal ein wenig beschäftigt, leider hab ich das mit dem Treiber nicht hinbekommen. Ich denke ich werde mich erst mal mit der COM Schnittstelle beschäftigen wie oben geschrieben und dann mal schauen 🙂

    Merci!!


Anmelden zum Antworten