Raketenmodellbau.org Portal > Forum > Rund um Elektronik und Programmierung > Programmiersprachen > C (C+) (C++) > Abfragen der Seriellen Schnittstelle
Du kannst keine neue Antwort schreiben


Autor Thema 
Blackpuma

Epoxy-Meister

Blackpuma

Registriert seit: Jul 2006

Wohnort: Graz

Verein:

Beiträge: 374

Status: Offline

Beitrag 102619 , Abfragen der Seriellen Schnittstelle [Alter Beitrag23. Juli 2006 um 19:48]

[Melden] Profil von Blackpuma anzeigen    Blackpuma eine private Nachricht schicken   Besuche Blackpuma's Homepage    Mehr Beiträge von Blackpuma finden

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

Reinhard

Registriert seit: Sep 2003

Wohnort: Österreich

Verein: TRA #10691, AGM

Beiträge: 1186

Status: Offline

Beitrag 102623 [Alter Beitrag23. Juli 2006 um 21:36]

[Melden] Profil von Reinhard anzeigen    Reinhard eine private Nachricht schicken   Besuche Reinhard's Homepage    Mehr Beiträge von Reinhard finden

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

Blackpuma

Registriert seit: Jul 2006

Wohnort: Graz

Verein:

Beiträge: 374

Status: Offline

Beitrag 102648 [Alter Beitrag24. Juli 2006 um 14:48]

[Melden] Profil von Blackpuma anzeigen    Blackpuma eine private Nachricht schicken   Besuche Blackpuma's Homepage    Mehr Beiträge von Blackpuma finden

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


Administrator

Neil

Registriert seit: Aug 2000

Wohnort: Delft

Verein: SOLARIS

Beiträge: 7776

Status: Offline

Beitrag 102650 [Alter Beitrag24. Juli 2006 um 15:14]

[Melden] Profil von Neil anzeigen    Neil eine private Nachricht schicken   Neil besitzt keine Homepage    Mehr Beiträge von Neil finden

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:
Dazu hätte ich gerne den Code.


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

Blackpuma

Registriert seit: Jul 2006

Wohnort: Graz

Verein:

Beiträge: 374

Status: Offline

Beitrag 102651 [Alter Beitrag24. Juli 2006 um 15:32]

[Melden] Profil von Blackpuma anzeigen    Blackpuma eine private Nachricht schicken   Besuche Blackpuma's Homepage    Mehr Beiträge von Blackpuma finden

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 [Alter Beitrag24. Juli 2006 um 23:36]

[Melden] Profil von AlexanderM anzeigen    AlexanderM eine private Nachricht schicken   Besuche AlexanderM's Homepage    Mehr Beiträge von AlexanderM finden

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


Administrator

Christian Fruth

Registriert seit: Jun 2002

Wohnort: Großfischlingen

Verein: Solaris-RMB e.V., RMV 82 e.V.

Beiträge: 603

Status: Offline

Beitrag 102681 [Alter Beitrag27. Juli 2006 um 19:07]

[Melden] Profil von Christian Fruth anzeigen    Christian Fruth eine private Nachricht schicken   Christian Fruth besitzt keine Homepage    Mehr Beiträge von Christian Fruth finden

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
[Zurück zum Anfang]
Du kannst keine neue Antwort schreiben