Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Serielle Schnittstelle - Signal auswerten ??

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
10.11.2003, 16:26 Uhr
~Schnittstelle
Gast


Hallo ! Vielleicht kann mir jemand weiterhelfen?!:
ich möchte an meiner
seriellen Schnittstelle einen Schalter anschließen und auswerten. Wenn also ein angeschlossener Schalter geschlossen wird, soll das mein C++ Programm feststellen und mir dann eine bestimmte Funktion ausführen.
Wie kann ich aber die serielle Schnittstelle auf so ein Signal hin beobachten ?
Im Internet habe ich nur viel zu "Datenübertragung" gefunden, ich will aber nur ein einfachen Schalter auswerten, das sollte doch möglich sein oder ?
Vielen Dank für Eure Hilfe,
Gruß Simon
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
10.11.2003, 17:08 Uhr
ao

(Operator)


Schaltungsvorschlag:

Code:
RTS ----+
        |
        o
         / Schalter
        o
        |
CTS ----+
        |
       10K  Widerstand
        |
GND ----+



Programm:

Code:
Initialisierung:
RTS = Hi (12 V)

Messen:
if (CTS == Hi)
{
    bSwitch = Closed;
}
else
{
    bSwitch = Open;
}



Das High-Setzen von RTS und Abfragen von CTS geht nur mit systemspezifischen Funktionen. Welches Betriebssystem verwendest du?

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
10.11.2003, 18:09 Uhr
~Schnittstelle
Gast


Danke schon mal für den Vorschlag.
Also ohne Widerstand geht nichts ?
Ich verwende Windows ME, das Programm muss aber auch auf Windows NT laufen. Dort geht aber eine LowLevel Programmierung nicht, so wie ich gehört habe.
Mit deinem Code kann ich leider noch nicht viel anfangen: was ist denn bei dir bSwitch ?
Wie muss ich RTS ansprechen ? ich kann doch nicht einfach RTS= Hi setzten oder ? Muss ich nicht erst wie unten stehend anfangen ?
Bei WaitComm macht er dann nichts, eigentlich sollte er doch weiterarbeiten, wenn ich Pin4 und Pin8 verbinde ( habe ich gemacht, allerdings ohne Widerstand)...
DAnke für deine Hilfe!! Simon

HANDLE hCom;
DWORD dwEvtMask;
hCom = CreateFile( "COM1", GENERIC_READ, 0, NULL,OPEN_EXISTING,0,NULL);
SetCommMask(hCom,EV_RXCHAR | EV_CTS | EV_DSR | EV_RLSD | EV_RING );
WaitCommEvent(hCom, &dwEvtMask, NULL);
MessageBox("Zur Bestätigung, damit ich merke, dass er den Kontakt festgestellt hat.","Meldung",MB_OK);
CloseHandle(hCom);
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
11.11.2003, 08:33 Uhr
ao

(Operator)


Aha, also Windows. Ich verschieb uns mal nach WinAPI, hier bei C sind wir falsch. Bis gleich.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
11.11.2003, 08:55 Uhr
ao

(Operator)


So.

Der Widerstand: Hat die Aufgabe, CTS auf Masse zu ziehen (d.h. für einen definierten Pegel zu sorgen) wenn der Schalter offen ist. Kann sein, dass es auch ohne funktioniert. Wenn du Pech hast, kannst du einen offenen Schalter nicht richtig erkennen, weil der CTS-Pin offenliegt und zufällige Pegel hat ("floating pin", wie der Elektroniker sagt).

Windows ME / NT: Alle Windows-Versionen (von 3.1 mal abgesehen) haben für serielle Schnittstellen weitgehend dasselbe API, von Low-Level-Programmierung (Port-IO direkt programmieren) würde ich abraten, außer das Ganze ist hochgradig zeitkritisch.

Aber auch dann: erst mal auf dem "guten" Weg ans Laufen bringen, böse Optimierungen kann man immer noch machen.

Zur Programmierung:
CreateFile ist schon gut. Damit anschließend die Events funktionieren, musst du anstelle der letzten NULL eine ausgefüllte OVERLAPPED-Struktur reinreichen und irgendwo ne OVERLAPPED-Flagge setzen, aber ich schlage fürs erste was anderes vor:

Lass CreateFile, wie es ist, und vergiss (vorläufig) die Eventgeschichte. Solange man experimentiert, ist es meist besser, die Hardware selber zu pollen als sich vom Betriebssystem Events schicken zu lassen. Da gibts zu viele Fehlerquellen.

Dann erzeugst du eine DCB-Struktur und setzt darin das Feld "fRtsControl" auf RTS_CONTROL_ENABLE. Ob man noch mehr machen muss, weiß ich nicht. Aber jetzt hast du ja ein paar neue Stichwörter, nach denen du googeln kannst. Mit diesem DCB und dem Filehandle machst du SetCommState (). Danach sollte RTS auf High gehen und bleiben. Nachmessen!

Zum zyklischen Abfragen von CTS nimmst du GetCommModemStatus () und untersuchst in dem zurückgegebenen DWORD die Flagge MS_CTS_ON.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
12.11.2003, 15:13 Uhr
~Schnittstelle
Gast


Hi ao !

Danke für deine hilfreiche Antwort !

Gut, es klappt !! Ich habe
CreateFile dann
DCB-Struktur mit "fRtsControl" und sonstigen Einstellungen
SetCommState ()
und dann im Moment noch eine Abfrage mit WaitCommEvent()
Es klappt unter Win NT und WIn ME (hier konnte ich es testen).
Jetzt werde ich noch die schöne Feinarbeit machen und das ganze mit GetModemStatus() (viell. in einer while-Schleife) abfragen, dann wird das Programm nicht durch WaitCommEvent blockiert...
Ich werde dann in den nächsten Tagen meine komplette Funktion hier reinstellen, vielleicht hat jemand anderes genauso eine "Schalteranwendung"... Du kannst es dir ja dann auch noch mal anschauen; interessiert dich bestimmt. Vorab: in der DCB-Struktur muss so manches definiert sein, sonst funktionert SetCommState nicht !
Find ich toll, wie du geholfen hast!
Merci ;Simon
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
28.11.2003, 18:26 Uhr
~Schnittstelle
Gast


So, um also einen Schalter auszuwerten, muss folgendes gemacht werden:
die Verkabelung wie folgend:

RTS ----+
|
o
/ Schalter
o
|
CTS ----+
|
10K Widerstand
|
GND ----+

Pinbelegungen: RTS PIN 7
CTS PIN 8
Ground PIN 5
siehe auch: http://home.t-online.de/home/th-steinhauer/serielle.htm#Abschn1_2
In Quellcode muss folgendes gemacht werden:
Ich habe eine MFC Anwendung gewählt.
Folgende Variablen anlegen

HANDLE hCom;
DWORD dwEvtMask;
DCB sDcb;


//Comm initialisieren
void CSerial1_2Dlg::OnInitialize()
{
memset(&sDcb,0,sizeof(sDcb));
sDcb.DCBlength = sizeof(sDcb);
sDcb.BaudRate = 9600; // Baudrate
sDcb.fDtrControl = DTR_CONTROL_ENABLE; // muss auf ENABLE stehen
sDcb.ByteSize = 8; // 8 Datenbits
sDcb.fRtsControl= RTS_CONTROL_ENABLE; // RTS flow control , muss
auf ENABLE stehen
das sind die minimalen Einstellungen der Structure DCB (siehe Hilfe). Wird weniger verwendet, funktioniert nichts !

"Device anlegen" mit:
hCom = CreateFile( "COM1", GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);

Structure an Gerät weitergeben und laden
SetCommState(hCom,&sDcb)

hier wird festgelegt, was beobachtet wird (EV_CTS)
SetCommMask(hCom,EV_CTS)

jetzt wird Taster abgefragt.
WaitComm wartet, bis Event eingetreten ist, erst dann wird der Quellcode weiter ausgeführt. also zum Beispiel eine Messagebox aufgerufen:
WaitCommEvent(hCom,&dwEvtMask , NULL);
{ MessageBox("Schalter wurde betätigt !","Meldung",MB_OK);
//dein Quellcode

}

Device wieder schließen mit
CloseHandle(hCom);

Alles Funktionen sind in der MicrosoftVisualC++ Hilfe zu finden.
Außerdem ist sehr empfehlenswert:
www.sbox.tugraz.at/home/x/xyz007/
unter Beschreibungen findet man etwas über serielle und parallele Schnittstellen.

Ich hoffe, das hat geholfen, bei Fragen könnt ihr mir auch eine email an isostar@directbox.com schicken.
Gruß
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: