Portal > Forum > Rund um Elektronik und Programmierung > Programmiersprachen > C (C+) (C++) > Abfragen der Seriellen Schnittstelle
Autor | Thema |
---|---|
Blackpuma
Epoxy-Meister Registriert seit: Jul 2006 Wohnort: Graz Verein: Beiträge: 374 Status: Offline |
Beitrag 102619
, Abfragen der Seriellen Schnittstelle
[23. Juli 2006 um 19:48]
Hallo alle zusammen!
Ich habe schon seit langem ein Problem und zwar wie kann ich in C oder C++ die Serielle Schnittstelle abfragen? Soll für einen Motorprüfstand sein der die Daten gleich zum PC schickt oder zum auslesen eines DAC! Bitte helft mir! LG Blackpuma Einmal Weltraum und zurück! http://www.modellraketen.at http://wiki.modellraketen.at |
Reinhard
Überflieger Registriert seit: Sep 2003 Wohnort: Österreich Verein: TRA #10691, AGM Beiträge: 1187 Status: Offline |
Beitrag 102623
[23. Juli 2006 um 21:36]
Hi,
an welche Architektur, welches Betriebssystem (falls überhaupt) und welchen Compiler hast du dabei gedacht? Ein paar oberflächliche (bin nicht gerade der Programmierkönig) Beispiele: WinAVR (oder generell avr-gcc): Stdiofunktionen (printf,...) auf den UART umbiegen Visual C++: HANDLE auf serielle Schnittstelle. Danach wie normalen FileIO ansprechen. Beides wird wahrscheinlich unter verschiedenen Umgebungen anwendbar sein, nur habe ich damit noch nichts zu tun gehabt. Gruß Reinhard |
Blackpuma
Epoxy-Meister Registriert seit: Jul 2006 Wohnort: Graz Verein: Beiträge: 374 Status: Offline |
Beitrag 102648
[24. Juli 2006 um 14:48]
Das kann doch net so kompliziert sein!
Also: Ich habe einen PIC Controller der die Daten Seriell schickt. Mit dem Hyperterminal von Windows empfange ich die Daten. Ich möchte jetzt unter Windows in C od. C++ ein Programm schreiben das mir die Daten aufbereitet und in eine Datei Schreibt. Mich interessiert jetzt nur mal das Einlesen der Daten über die Serielle Schnittstelle. Dazu hätte ich gerne den Code. LG Blackpuma Einmal Weltraum und zurück! http://www.modellraketen.at http://wiki.modellraketen.at |
Neil
99.9% harmless nerd
Registriert seit: Aug 2000 Wohnort: Delft Verein: SOLARIS Beiträge: 7776 Status: Offline |
Beitrag 102650
[24. Juli 2006 um 15:14]
Hi,
hast du schon mal die Onlinehilfe deiner Programmiersoftware befragt? Da stehen meistens auch noch Beispiele dabei. So mach ich es zumindest immer. Erstmal Onlinehilfe fragen. Zitat: Ist das eine Forderung oder eine Bitte? Da wir aber nicht wissen was für einen Compiler du verwendest, können wir dir auch nicht so direkt helfen. Gruß Neil Die Erde ist eine Scheibe. Egal in welche Richtung sich die Menschheit bewegt, sie geht immer auf einen Abgrund zu. |
Blackpuma
Epoxy-Meister Registriert seit: Jul 2006 Wohnort: Graz Verein: Beiträge: 374 Status: Offline |
Beitrag 102651
[24. Juli 2006 um 15:32]
Das war natürlich ein Bitte! Ich war nur verwundert wie schwer das ist ein paar Zeichen abzufragen! *g*
Ich verwende den gcc4 unter linux und visual studio unter windows. LG Einmal Weltraum und zurück! http://www.modellraketen.at http://wiki.modellraketen.at |
AlexanderM
Epoxy-Meister Registriert seit: Feb 2004 Wohnort: Düsseldorf Verein: FAR Beiträge: 238 Status: Offline |
Beitrag 102656
[24. Juli 2006 um 23:36]
Hallo,
am einfachsten ist es, wenn Du im Hyperterminal das Menü Übertragung>Text aufzeichnen auswählst, eine Datei angibst, in die alles geschrieben wird und die dann später auswertest. Wenn Du aber Deine Auswerte-S/W die Daten selber in Empfang nehmen soll, mußt Du schon etwas programmieren. Unter VB kann man dazu das MSComm Steuerelement verwenden. Die Benutzung (inkl. Beispielcode) ist in der online-Hilfe sehr gut dokumentiert. Hier ein einfaches B.S.: INIT (oder direkt in Eigenschaften): MSComm.CommPort = COMNr MSComm.Settings = "9600,N,8,1" MSComm.Handshaking = comNone MSComm.PortOpen = True Eingangspuffer leeren: MSComm.InBufferCount = 0 Wandlung starten: MSComm.Output = Ausgabestring warten, bis Wandlung fertig und Zeichen gesendet sind: Do DoEvents Loop Until MSComm.InBufferCount > 0 dann Wert einlesen: Wert = MSComm.Input Port wieder schliessen: MSComm.PortOpen = False Bei C/C++ sollte es so ähnlich sein, allerdings kenne ich mich da nicht so gut aus. Schau dazu mal hier nach. Das Problem mit seriellen Schnittstellen ist aber generell, daß, wie der Name schon sagt, die Daten nacheinander übertragen werden. Wenn man also z.B. ein Byte übertragen will, braucht man dazu schon ein Protokoll, das festlegt in welcher Reihenfolge die Bits ankommen, ob und wo ein Stoppbit sitzt, etc. Sollen nur einzelne Leitungen abgefragt werden (dafür eignet sich evtl. der Parallelport besser), so kannst Du die guten alten Inp() und Outp() verwenden. Ab NT geht das aber nicht mehr so ohne weiteres (wg. Kernelmodus vs. Usermodus). Da kannst Du dann aber InpOut verwenden. Das funktioniert auch prinzipiell mit dem seriellen Port, allerdings nur zum direkten Abfragen/Setzen der Bits in den Registern. Ich hoffe, das hilft Dir etwas weiter. Gruß, Alexander |
Christian Fruth
SP-Schnüffler
Registriert seit: Jun 2002 Wohnort: Großfischlingen Verein: Solaris-RMB e.V., RMV 82 e.V. Beiträge: 604 Status: Offline |
Beitrag 102681
[27. Juli 2006 um 19:07]
Hi
Wenn du unter Windows mittels C++ das ganze abrufen möchtest sollte der Code etwa so aussehen (nicht getestet): ---------------------------------------------------------------------------------------- HANDLE hComm; DCB dbc; char cBuffer; DWORD dwBytesRead; // COM-Port öffnen hComm = CreateFile("COM1", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); // Einstellungen des COM-Ports auslesen GetCommState(hComm, &dbc); // Einstellungen nach eigenen Wünschen anpassen dbc.BaudRate = 9600 dbc.ByteSize = 8 dbc.Parity = NOPARITY dbc.StopBits = ONESTOPBIT // Einstellungen wirksam machen SetCommState(hComm, &dbc); // Beginnen aus dem Port auszulesen while (ReadFile(hComm, &cBuffer, sizeof(cBuffer), &dwBytesRead, NULL)) { putchar(cBuffer); } // COM-Port wieder schließen CloseHandle(hComm); ---------------------------------------------------------------------------------------- Grüße Christian Kiff weniger und freß Pilze, Sei kreativ! - Jens Bögel |