Com Port mit PC ansteuern

Software für PC wie Open Office, Antvirenprogramme, Firewalls usw. Programmiersprachen wie Visual Basic, Pascal, C++.

Software für PC wie Open Office, Antvirenprogramme, Firewalls usw. Programmiersprachen wie Visual Basic, Pascal, C++.

Moderator: Moderatorengruppe

Com Port mit PC ansteuern

Neuer Beitragvon St3fan0 am Donnerstag 15. März 2007, 19:20

Hi,
ich habe eine Schaltung mit dem PC anzusteuern.
Da diese im PC-Gehäuse sein wird, und ich auf meinem Mainboard eine interne Com-Schnittstelle besitze, dachte ich mir ich steuere die Schaltung mit diesem an.
Jedoch bin ich in genau diesem Punkt leider so ziemlich vollkommen aufgeschmissen, da ich nicht weiß wie ich dies bewerkstelligen soll, bzw. ob es hierfür Programme gibt etc.
Dass Ausgangssignal sollte nur zum Ein- und Ausschalten der Schaltung genutzt werden. Soll heißen:

Logisch 1 (im besten Fall 12V; jedoch bei anderen Werten auch verwendbar)
-> Schaltung ist ein
Logisch 0
-> Schaltung ist aus

Ich würde eben mit diesem "Signal" direkt die Stromzufuhr zu der Schaltung realisieren, die per Programm steuerbar sein sollte.

Über die Pin-Belegungen des Com Ports habe ich mich schon erkundigt und war der Meinung ich sollte meine Schaltung mit denm Pins:
TD (Transmit Data)
und
GND (Ground) ansteuern

Jedoch wurde ich in diesem Punkt noch gar nicht fündig und würde mich über eine Lösungsmöglichkeit dieses Problems freuen.

MfG Stef alias St3fan0
St3fan0
Threadstarter
25424
 
Beiträge: 1
Registriert: Donnerstag 15. März 2007, 19:08

Re: Com Port mit PC ansteuern

Neuer Beitragvon derguteweka am Donnerstag 15. März 2007, 21:01

Moin,

Wie man unter Linux eine LED am Seriellen Port ansteuern kann, hab' ich hier (im 2. Post des threads) mal kurz gezeigt:
http://www.linuxforen.de/forums/showthread.php?t=193255
Vielleicht hilft das ein bisschen weiter.
Gruss
WK
derguteweka
25425
Moderator
 
Beiträge: 1048
Registriert: Freitag 18. August 2006, 15:47

Neuer Beitragvon karahead am Freitag 16. März 2007, 14:41

Zu deinem Thread aus dem Linux Forum.
Geh richtig von der Annahme aus, dass die Diode 1N4148 zum Schutz gegen die -12 V eingebaut wurde, die an einem RS-232 anliegen können? :)
karahead
25438
Bronze Mitglied
 
Beiträge: 69
Registriert: Mittwoch 21. September 2005, 17:03

Neuer Beitragvon derguteweka am Freitag 16. März 2007, 17:06

Moin,

karahead hat geschrieben:Zu deinem Thread aus dem Linux Forum.
Geh richtig von der Annahme aus, dass die Diode 1N4148 zum Schutz gegen die -12 V eingebaut wurde, die an einem RS-232 anliegen können? :)


Yepp, so ists gedacht. Geruechteweise soll's LEDs geben, die keine so "hohe" Sperrspannung moegen - aber wenn jemand meinen wuerde, diese Diode waere ueberfluessig - da wuerde ich nicht so richtig wirklich widersprechen :)

Gruss
WK
derguteweka
25442
Moderator
 
Beiträge: 1048
Registriert: Freitag 18. August 2006, 15:47

Neuer Beitragvon karahead am Samstag 17. März 2007, 11:09

Sollte auch kein Wiederspruch oder Verbesserungsvorschlag sein :)

Bin als AZUBI nur noch nicht so Praxisfest und wollt mal nachfragen was dahintersteckt. Man versucht ja überall was wissenswertes aufzzuschnappen :)
karahead
25456
Bronze Mitglied
 
Beiträge: 69
Registriert: Mittwoch 21. September 2005, 17:03

Neuer Beitragvon derguteweka am Samstag 17. März 2007, 11:30

Moin,

karahead hat geschrieben:Sollte auch kein Wiederspruch oder Verbesserungsvorschlag sein :)

Bin als AZUBI nur noch nicht so Praxisfest und wollt mal nachfragen was dahintersteckt. Man versucht ja überall was wissenswertes aufzzuschnappen :)

Ich hab' nix gegen Verbesserungsvorschlaege (imm er her damit) - und besonders schoen ist diese Loesung nicht (weil die Spannungen, die sich an den zwei gesperrten Dioden ausbilden, nicht so richtig definiert sind). Eigentlich ist es "schoener", die 1N4148 antiparallel zur LED zu schalten. Aber da haett' sich das Schaltbild nicht mehr so schoen in eine Zeile ASCII-Art quetschen lassen...

Mal was anderes: Findet sich vielleicht noch ein Windows-programmierer, der sich den entsprechenden Sourcecode fuer Windows ausm Kreuz leiern laesst? Ist doch weiter verbreitet als Linux denk' ich mal - nur ich hab' keines mehr hier am Laufen.

Gruss
WK
derguteweka
25458
Moderator
 
Beiträge: 1048
Registriert: Freitag 18. August 2006, 15:47

Neuer Beitragvon Master-Jimmy am Mittwoch 11. April 2007, 21:36

Da steht wie man's unter Windows macht(32Bit-Windows):
http://msdn2.microsoft.com/en-us/library/ms810467.aspx

(Da versteh ich so auf den ersten Blick mal vorallem "Bahnhof"; du vielleicht nicht...)

Ach, übrigens: Ist es richtig das man als I/O-Port eigentlich nur die Handshake-Leitungen nehmen kann.-Die Datenleitungen kann man nicht wirklich unter Kontrolle bringen, weil dieser UART dazwischen ist, der alles automatisch macht...???
Benutzeravatar
Master-Jimmy
25982
Titanium Mitlgied
 
Beiträge: 401
Registriert: Mittwoch 11. April 2007, 10:21
Postleitzahl: 00000
Land: not selected

Neuer Beitragvon derguteweka am Donnerstag 12. April 2007, 08:39

Moin,

Master-Jimmy hat geschrieben:Da steht wie man's unter Windows macht(32Bit-Windows):
http://msdn2.microsoft.com/en-us/library/ms810467.aspx

(Da versteh ich so auf den ersten Blick mal vorallem "Bahnhof"; du vielleicht nicht...)


Puha, sieht nach umfangreichen Studien aus :)

Master-Jimmy hat geschrieben:Ach, übrigens: Ist es richtig das man als I/O-Port eigentlich nur die Handshake-Leitungen nehmen kann.-Die Datenleitungen kann man nicht wirklich unter Kontrolle bringen, weil dieser UART dazwischen ist, der alles automatisch macht...???

Naja, was heisst Datenleitungen - Es gibt bei der Seriellen nur eine TxD Leitung, auf der kommen die Bits eines Datenworts der Reihe nach. Den Status dieser TxD Leitung kannst du gezielt manipulieren (Entweder nichts senden oder "Break" senden). Wenn du aber normale serielle Signale darueber senden willst, dann macht der UART das fuer dich "automatisch".
Die 2 Handshake-Ausgaenge gehen 1:1 auf Bits in den Kontrollregistern des UARTs, sind also bei Registerzugriff auf den Baustein recht simpel zu programmieren.
Bei dem Senden von Break ueber die TxD Leitung ist's eigentlich auch so.

Gruss
WK
derguteweka
25987
Moderator
 
Beiträge: 1048
Registriert: Freitag 18. August 2006, 15:47

Neuer Beitragvon Master-Jimmy am Samstag 14. April 2007, 15:29

Habe ich denn nicht das Problem, dass wenn ich über die Datenleitung ein Low herausgeben will, immer noch irgendwelche Stopbits usw. dazwischen sind?
Benutzeravatar
Master-Jimmy
26050
Titanium Mitlgied
 
Beiträge: 401
Registriert: Mittwoch 11. April 2007, 10:21
Postleitzahl: 00000
Land: not selected

Neuer Beitragvon derguteweka am Samstag 14. April 2007, 15:55

Moin,

Master-Jimmy hat geschrieben:Habe ich denn nicht das Problem, dass wenn ich über die Datenleitung ein Low herausgeben will, immer noch irgendwelche Stopbits usw. dazwischen sind?

Da Problem mit den Stopbits haettest du nur dann, wenn du das Low dadurch erreichen wolltest, dass du seriell ein Datenwort mit vielen Nullen senden wolltest.
Wenn du aber am UART die Break Condition einschaltest, ist der Ausgang fuer unbegrenzte Zeit auf Low (der Ausgang des UARTs, an der Buchse heisst das dann ca. +12V).
Genau so funktioniert mein Beispiel in dem Linuxforum.

Gruss
WK
derguteweka
26051
Moderator
 
Beiträge: 1048
Registriert: Freitag 18. August 2006, 15:47

Neuer Beitragvon Master-Jimmy am Samstag 14. April 2007, 16:24

Der Grund wieso man den COM über die WinAPI ansteuern muss, liegt doch darin, dass moderne Betriebssysteme(ab Win98) den direkten Zugriff auf die Schnittstellen unterbinden, oder?

Nun ist es so, dass ich mittlerweille immerhin ganz gut denn LPT-Port steuern kann. Und zwar ziemlich simpelst mit etwas ASM:

;;;;;;;;;;;;ASM-CODE;;;;;;;;;;;;
MOV DX, 378H
IN AL, DX
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Natürlich sollte dies eigentlich nicht funktionieren(ab Win98); der Witz ist: Tut es doch, wenn man sich vom Tool "UserPort" etwas helfen lässt:
http://www.embeddedtronics.com/public/E ... erPort.zip

Ich denke mal, das selbe sollte auch mit dem COM funktionieren, da man ja beliebige Adressen freischalten kann.-Nur bin ich hier dermassen unbeholfen, dass ich ein Beispielcode gut gebrauchen könnte.-Hat vielleicht mal jemand ein Beispielcode auflager wie man das damals zu DOS-Zeiten bewerkstelligte?
Benutzeravatar
Master-Jimmy
26054
Titanium Mitlgied
 
Beiträge: 401
Registriert: Mittwoch 11. April 2007, 10:21
Postleitzahl: 00000
Land: not selected

Neuer Beitragvon Master-Jimmy am Montag 16. April 2007, 16:43

Tja, das scheint niemand zu wissen wie das ginge...
Aber das weiss ganz sicher jemand:
RS232-Das ist negative Logik, oder hab ich Tomaten auf den Augen?

(-12V --> High)
(+12V --> Low)
Benutzeravatar
Master-Jimmy
26093
Titanium Mitlgied
 
Beiträge: 401
Registriert: Mittwoch 11. April 2007, 10:21
Postleitzahl: 00000
Land: not selected

Neuer Beitragvon derguteweka am Montag 16. April 2007, 18:46

Moin,

Master-Jimmy hat geschrieben:Tja, das scheint niemand zu wissen wie das ginge...

Ich hab' hier noch ne alte Festplatte gefunden, mit nem DOS drauf; da hatte ich mal was in C (mit dem djgpp-compiler) programmiert. Hier sind die Makros, mit denen ich die Handshakeleitungen gesetzt/abgefragt hab'. Das sollte sich auch noch von Hand in x86er Assembler uebersetzen lassen, wenns denn sein muss...
Code: Alles auswählen
/*** D E F I N E S *************************/

#define IR_COM_INIT                         \
{                                           \
    outportb(COMn+3,128); /* Baudrate */    \
    outportb(COMn+0,1);   /* 115200   */    \
    outportb(COMn+1,0);                     \
    outportb(COMn+3,0x02);/*  7,n,1   */    \
}                                           \

/*******************************************/

#define IR_WAIT_1_TICK                      \
{                                           \
    while ((inportb(COMn+5) & 0x20)==0);    \
    outportb(COMn+0,0x012);                 \
}

/*******************************************/

#define IR_DTR_LO                           \
{                                           \
    outportb(COMn+4,inportb(COMn+4) & 0xfe);\
}                                           \

/*******************************************/

#define IR_DTR_HI                           \
{                                           \
    outportb(COMn+4,inportb(COMn+4) | 0x01);\
}                                           \

/*******************************************/

#define IR_RTS_HI                           \
{                                           \
    outportb(COMn+4,inportb(COMn+4) | 0x02);\
}                                           \

/*******************************************/

#define IR_IS_DSR_HI                        \
    (inportb(COMn+6) & 0x20)

/*******************************************/

#define IR_DID_DSR_CHG                      \
    (inportb(COMn+6) & 0x02)

/*******************************************/


Die Register sind im Datenblatt des 16550 beschrieben, das sollt's ohne Probleme im www geben.

Master-Jimmy hat geschrieben:Aber das weiss ganz sicher jemand:
RS232-Das ist negative Logik, oder hab ich Tomaten auf den Augen?

(-12V --> High)
(+12V --> Low)


Yep, so ist's. Keine Tomaten :) Das kommt noch durch die UrUr-Pegelwandler, die im letzten Jahrtausend eingesetzt wurden, 75188 und 75189, wenn ich mich jetzt nicht taeusch'.

Gruss
WK
derguteweka
26100
Moderator
 
Beiträge: 1048
Registriert: Freitag 18. August 2006, 15:47

Neuer Beitragvon Master-Jimmy am Montag 16. April 2007, 18:53

So ich hab mich jetzt doch an den Speck heran gemacht.-Und es läuft!!!!!!!!!!!!!! :D

Ich habe den Source mal in den Anhang geladen.
(Ist natürlich nur eine erste Version, um zu sehen ob's überhaupt funzt...)

-->Ich habe das Programm noch nicht in dem Sinne getestet, dass ich geschaut habe ob am anderen Ende auch wirklich die entsprechenden Signale kommen.-Das Programm selbst behauptet aber steif und fest dass es funktioniert...
Sie haben keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Zuletzt geändert von Master-Jimmy am Samstag 7. Juli 2007, 14:16, insgesamt 1-mal geändert.
Benutzeravatar
Master-Jimmy
26101
Titanium Mitlgied
 
Beiträge: 401
Registriert: Mittwoch 11. April 2007, 10:21
Postleitzahl: 00000
Land: not selected

Neuer Beitragvon Master-Jimmy am Montag 16. April 2007, 19:09

@derguteweka: Du weisst nicht zufällig mit welchem String/Zeichen man dem COM1 beibringt "break" zu senden?-Oder geht das ganz anders?

/*

WriteFile(
hCom,
"???", /*Breakanweisung*/
???, /*Grösse von "break" in Byte(Wie viele Zeichen?)*/
&anzahl_herausgeschriebener_bytes,
NULL);

*/
((((((((((((((((((((((((((((((Hat sich schon geklärt, sorry!))))))))))))))))))))))))))))))

Nichts senden(break) --> +12V auf TxD
NUL(ASCII: 0x00) senden --> -12V auf TxD
Richtig?

P.S.: Was machst du dich lustig über meinen Versuch mit Assembler? :wink:
Oder gehörst du auch zu denen die sich täglich die Köpfe einschlagen, weill sie alle glauben "ihre" Sprache sei die beste...???
Finde ich persönlich einfach nur lächerlich, es ist doch am sinnvollsten, die Sprache einzusetzen mit welcher man die Lösung am ehesten erreicht, od. etwa nicht?-WinAPI in Assembler kann ich halt nicht und auch sonst bin ich primär auf C/C++.
Abgesehen davon gehört HW und ASM für mich irgendwie zusammen, was mich eigentlich auf die Idee brachte.
Benutzeravatar
Master-Jimmy
26102
Titanium Mitlgied
 
Beiträge: 401
Registriert: Mittwoch 11. April 2007, 10:21
Postleitzahl: 00000
Land: not selected

Nächste

Zurück zu Computer Software

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 9 Gäste