LSSuper2004
29-09-2005, 17:11
Hallo,
in meinem C++-Buch habe ich von den Möglichkeiten der Programmierung des COM-Ports gelesen und es hat mein Interesse geweckt. Dort war auch so ein Anwendungsbeispiel (die Betonung liegt auf Beispiel) mit einer kleinen Ampel, also aus den drei Pins TxD, DTR und RTS Strom ziehen und zurück alles wieder in GND. Die Pinbelegung wurde da alles sehr gut erklärt, und Beispielcode für DOS und Windows war dort abgedruckt. Leider gibt's unter Linux die conio.h nicht (und ich würde sagen, das ist auch besser so - weiß nicht, wa<rum ich das meine) und der Code nützt mir nichts.
Also auf die harte Tour (nachdem ich durch die Kernelroutinen nicht durchblicke). Wollte per Assemblercode an die 0x3F8 schreiben (COM1) bzw. 0x2F8 (COM2). Dort war alles schön beschrieben mit den Registern, und wollte erst mal zum Test den Strom an DTR legen. Also den Wert 0x1 an die Adresse PORT+4 schreiben (PORT habe ich mit dem COM1-Wert getestet), später könnte ich dann auch immer erst den alten Wert auslesen und dann maskieren, um das RTS beizubehalten, aber das ist jetzt erst mal egal.
Meine Quelltextdatei sieht so aus:
/* penma's Serial I/O - Licensed under the GNU General Public License */
#include <stdio.h>
int main()
{
printf("Serial I/O IOIOI\n\n");
fflush(stdout);
asm("mov dx,1020");
asm("out dx, 0x1");
return 0;
}
(ich liebe es, meine Programme unter die GPL zu stellen - für Besserwisser: später kann ich den "Original"-Kommentar dorthin setzen)
Hier die Ausgabe:
lars@Lars-72QAJJS5MR:~/Documents/KDevelop/COM1> g++ -save-temps main.cpp
main.s: Assembler messages:
main.s:34: Error: too many memory references for `mov'
main.s:35: Error: too many memory references for `out'
lars@Lars-72QAJJS5MR:~/Documents/KDevelop/COM1>
und ich mache ihm extra das Leben (noch) leichter mit der dezimalen Adresse, nichtsdestoweniger weist mein treuer GNU-Compiler den Code zurück und zwar mit einer Meldung, aus der ich nicht schlau werde. Muss man vielleicht die Speicheradressen erst per Geheimbefehl freischalten???
Oder mir nennt jemand eine andere Möglichkeit, am besten (muss aber nicht sein) eine, wo ich die Spannung auch variieren kann. Der Dirk Louis meinte, man könnte die Ausgangsspannung zwischen -10 Volt und +10 Volt verändern --- fürxs Erste reicht mir auch die Tatsache, überhaupt Strom dranzubekommen.
Fakt ist, unabhängig davon, welche Wege genommen werden: Ich möchte Routinen der folgenden Art benutzen können (Header-Definitionen):
void TxD(int state);
void DTR(int state);
void RTS(int state);
wobei int 0 oder 1 für an oder aus sein darf oder, bei der Spannung, soll int Werte von -10 bis +10 aufnehmen, die die Spannung regeln. Die Funktionen sollen die jeweiligen Pins ansteuern. (Also TxD für Pin 3, DTR für Pin 4, RTS für Pin 7 und an Pin 5 oder GND wird alles wieder angelötet.) Um drei separate Anschlüsse zu haben (Pins 3, 4, 7) die in Pin 5 wieder zusammengeführt werden. (Sozusagen 3 Pluspole und ein Minuspol)
Hoffe, das hat euch nicht allzusehr verwirrt ( :confused: ), aber mir geht es nicht darum, irgendwelche Daten über den Anschluss zu übertragen, sondern Strom an die Pins zu legen und das natürlich kontrolliert.
-- penma --
in meinem C++-Buch habe ich von den Möglichkeiten der Programmierung des COM-Ports gelesen und es hat mein Interesse geweckt. Dort war auch so ein Anwendungsbeispiel (die Betonung liegt auf Beispiel) mit einer kleinen Ampel, also aus den drei Pins TxD, DTR und RTS Strom ziehen und zurück alles wieder in GND. Die Pinbelegung wurde da alles sehr gut erklärt, und Beispielcode für DOS und Windows war dort abgedruckt. Leider gibt's unter Linux die conio.h nicht (und ich würde sagen, das ist auch besser so - weiß nicht, wa<rum ich das meine) und der Code nützt mir nichts.
Also auf die harte Tour (nachdem ich durch die Kernelroutinen nicht durchblicke). Wollte per Assemblercode an die 0x3F8 schreiben (COM1) bzw. 0x2F8 (COM2). Dort war alles schön beschrieben mit den Registern, und wollte erst mal zum Test den Strom an DTR legen. Also den Wert 0x1 an die Adresse PORT+4 schreiben (PORT habe ich mit dem COM1-Wert getestet), später könnte ich dann auch immer erst den alten Wert auslesen und dann maskieren, um das RTS beizubehalten, aber das ist jetzt erst mal egal.
Meine Quelltextdatei sieht so aus:
/* penma's Serial I/O - Licensed under the GNU General Public License */
#include <stdio.h>
int main()
{
printf("Serial I/O IOIOI\n\n");
fflush(stdout);
asm("mov dx,1020");
asm("out dx, 0x1");
return 0;
}
(ich liebe es, meine Programme unter die GPL zu stellen - für Besserwisser: später kann ich den "Original"-Kommentar dorthin setzen)
Hier die Ausgabe:
lars@Lars-72QAJJS5MR:~/Documents/KDevelop/COM1> g++ -save-temps main.cpp
main.s: Assembler messages:
main.s:34: Error: too many memory references for `mov'
main.s:35: Error: too many memory references for `out'
lars@Lars-72QAJJS5MR:~/Documents/KDevelop/COM1>
und ich mache ihm extra das Leben (noch) leichter mit der dezimalen Adresse, nichtsdestoweniger weist mein treuer GNU-Compiler den Code zurück und zwar mit einer Meldung, aus der ich nicht schlau werde. Muss man vielleicht die Speicheradressen erst per Geheimbefehl freischalten???
Oder mir nennt jemand eine andere Möglichkeit, am besten (muss aber nicht sein) eine, wo ich die Spannung auch variieren kann. Der Dirk Louis meinte, man könnte die Ausgangsspannung zwischen -10 Volt und +10 Volt verändern --- fürxs Erste reicht mir auch die Tatsache, überhaupt Strom dranzubekommen.
Fakt ist, unabhängig davon, welche Wege genommen werden: Ich möchte Routinen der folgenden Art benutzen können (Header-Definitionen):
void TxD(int state);
void DTR(int state);
void RTS(int state);
wobei int 0 oder 1 für an oder aus sein darf oder, bei der Spannung, soll int Werte von -10 bis +10 aufnehmen, die die Spannung regeln. Die Funktionen sollen die jeweiligen Pins ansteuern. (Also TxD für Pin 3, DTR für Pin 4, RTS für Pin 7 und an Pin 5 oder GND wird alles wieder angelötet.) Um drei separate Anschlüsse zu haben (Pins 3, 4, 7) die in Pin 5 wieder zusammengeführt werden. (Sozusagen 3 Pluspole und ein Minuspol)
Hoffe, das hat euch nicht allzusehr verwirrt ( :confused: ), aber mir geht es nicht darum, irgendwelche Daten über den Anschluss zu übertragen, sondern Strom an die Pins zu legen und das natürlich kontrolliert.
-- penma --