Zum Inhalt springen

einzel Pinabffage COM-Port (direkt hex) unter C


draaser

Empfohlene Beiträge

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>

Link zu diesem Kommentar
Auf anderen Seiten teilen

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>

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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>

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...