draaser Geschrieben 21. Oktober 2001 Geschrieben 21. Oktober 2001 Problemerklqrung: Für ein Projekt auf meiner Technikerschule muss ich den COM-Port dirket ansprechen um acht Endschalter einzulesen (mit interrupt funktion). der Parallelport wir von einer Schrittmotorkarte benuzt. Frage: Ist es möglich den COM-Port unter C (Borland 5.02) anzusprechen und wie? <FONT COLOR="#a62a2a" SIZE="1">[ 21. Oktober 2001 15:04: Beitrag 2 mal editiert, zuletzt von draaser ]</font> Zitieren
Crush Geschrieben 21. Oktober 2001 Geschrieben 21. Oktober 2001 Also normaler kann man das über die Funktion bdos() und int86() machen (steht in meinen Büchern und der MSDN) aber ich konnte nirgendwo diese Funktionen includen (komisch, aber auch egal) denn es ist viel eleganter und einfacher das ganze im Inline-Assembler zu machen: int inputbyte=0; unsigned int y=0x80000000; CString port; __asm { /* 279, 379, 3bd sind die Printer Port status Register Bit / Pin 0 =1 -> Timeout 3 15 4 13 5 12 6 10 7 11 278, 378, 3bc sind die Data Register vom Printer Ein Byte wird übergeben, wobei bit 0-7 Pin 2-9 auf dem Parallel-Port entsprechen 3be ist das Printer Control register Bit / Pin 0 1 1 14 2 16 3 17 4 0=IRQ disable ; 1=IRQ enable */ push ax push dx mov dx,0x3bc ; je nachdem auch entweder 278, 378 oder halt 3bc (Port im Bios) in al,dx; mov byte ptr inputbyte,al mov dx,0x3bd in al,dx; mov byte ptr inputbyte+1,al mov dx,0x3be in al,dx; mov byte ptr inputbyte+2,al pop dx pop ax } do { if (inputbyte&y) port+="1"; else port+="0"; } while (y>>=1); m_Edit1.SetWindowText(port); // CString irgendwo ausgeben m_Edit1.UpdateWindow(); // falls nötig Sind die Ports kleiner als 255 kann man die auch direkt eintippen: in al,10; mov byte ptr inputbyte,al Übrigens ist das auch der Beweis für ein anderes Forum, daß Referenzen auch Pointer sind!!! ( http://217.115.144.9/cgi-bin/ubbcgi/ultimatebb.cgi?ubb=get_topic&f=21&t=000386&co unterhit=yes ) Bei Borland klappt das vielleicht ja auch mit dem Int86(), leider weiß ich die genaue Interrupt-Nr vom Bios nicht und die entsprechende Registerbelegung um den Parallelport abzufragen (war auch zu faul zum Suchen), falls Du das noch rausfinden solltest, schreibs in diesem Thread noch irgendwo rein. Deshalb nur das Prinzip: #include <stdio.h> #include <dos.h> // Ich glaube das hier ist für int86() notwendig struct wreg { unsigned int ax; unsigned int bx; unsigned int cx; unsigned int dx; unsigned int si; unsigned int di; unsigned int cflag; }; struct breg { unsigned char al, ah; unsigned char bl, bh; unsigned char cl, ch; unsigned char dl, dh; }; union reg { struct wreg x; struct breg h; }; #define INTERRUPT 0x3bc; union reg inregs,outregs; inregs.h.ah=0x30; inregs.x.bx=0x3523; int86(INTERRUPT,&inregs,&outregs); usigned int Abgefragterwert=inregs.x.ax; Naja, irgendwie so sollte das jedenfalls klappen. Die DOS-Funktionen bdos() ruft man auch mit dieser Regs-Konstruktion auf, aber wie Du siehst ist das obere Beispiel etwas eleganter und schlanker, wodurch auch übersichtlicher. Assembler spart halt viel Zeit, Sourcecode und Ärger wenn´s um Hardware-Zugriffe geht. Beim Borland kann man das auch irgendwie so definieren, vielleicht heißt nur die initialisierung anders als __asm, bei manchen Compilern und Konstruktionen ist es notwendig __asm vor JEDER EINZELNEN ASSEMBLER-ZEILE zu schreiben, damit auch alles richtig läuft. Ich arbeite halt mit Studio ... <FONT COLOR="#a62a2a" SIZE="1">[ 21. Oktober 2001 19:10: Beitrag 2 mal editiert, zuletzt von Crush ]</font> Zitieren
draaser Geschrieben 21. Oktober 2001 Autor Geschrieben 21. Oktober 2001 danke crush für die schnelle antwort. aber wenn ich es richtig verstandenhabe ist das für die abfrage am lpt port, jedoch ist dieser von einer schrittmotorkarte belegt (also nicht nutzbar). die daten müssen also vom com port eingelesen werden ( nur einlesen). kann ich dafür auch dieses prog anwenden und nur die adressierung umändern? Zitieren
Crush Geschrieben 21. Oktober 2001 Geschrieben 21. Oktober 2001 Klar doch, such mal im Internet nach HelpPC, da ist alles wichtige übers Bios und IRQs, Assembler und C erklärt! Also COM1 sammelt scheints über 3F8, 2F8 die Bits zusammen (per Handshaking) und dort kannst Du dann auch abfragen - vielleicht auch noch über das Scratch PAD Register 3FF 2FF - frag mich aber nicht was das schon wieder sein soll (weiß ich doch selber nicht). Wenn Du die Pinbelegung hast kannst Du über 3FA/2FA, 3FB/2FB, 3FC/2FC, 3FD/2FD, 3FE/2FE noch weitere Bits von den Ports ablesen. <FONT COLOR="#a62a2a" SIZE="1">[ 21. Oktober 2001 19:25: Beitrag 2 mal editiert, zuletzt von Crush ]</font> Zitieren
draaser Geschrieben 21. Oktober 2001 Autor Geschrieben 21. Oktober 2001 danke, du hast mir sehrviel geholfen! ich gebe bescheid wies geklapt hat Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.