PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Parallel oder Serielle Schnittstelle einzelnen Pin auslesen.



Ron
23.11.2004, 14:51
Hi, ich muss nur einen Pin der LPT-Schnittstelle abfragen, ob dieser Low oder High ist. Ich nutze den Borland C++ Builder und Windows 2k. Wie komme ich da nun ran? Vielleicht ginge auch die Serielle Schnittstelle, eigentlich egal.

Ron

ronschulz
23.11.2004, 15:31
Ich hier noch einmal. Ich weiss nicht, ob es eindeutig ist, mit dem Borland C++ Builder. Es ist so ziemlich das gleiche wie MS Visual C++.. Hoffe, jemand kann mir helfen. =(

Ron

Xeus
23.11.2004, 16:16
Bin mir nicht ganz sicher aber ich glaub das geht so

unsigned char inportb (unsigned int portadr)
{
unsigned char value;
_asm move edx,portadr
_asm in al,dx
_asm move value,al
return (value);
}

gruß
xeus

Xeus
23.11.2004, 16:18
Oder
x = _inp(0x379)

dazu must du aber den header conio.h laden

Mobius
23.11.2004, 16:44
OK, jetzt ich! :D

Also, die codeschnipsel laufen afu dos - win98/winME, aber leider nicht auf Windows 2K/NT/XP, weil dieser keinen direkten zugriff auf das LPT-Port erlaubt.

Die Funktionen, die du verwenden könnest lauten:
CreateFile()
WriteFile()
SetCommState()
GetCommState()
...

also schaut der Beispiel ca. so aus:


void Create_LPT()
{
HANDLE hCom=CreateFile("LPT1",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING, OPEN_EXISTING,0,NULL);
if(hCom==INVALIDE_HANDLE)
// Da ist was schief gelaufen

DCB dbc;
if(!GetCommState(hCom,&dbc))
// Da haben wir was versch....
//Ab hier kannst du alles machen, was du möchtest (natürlich mit den Einschränkungen, die dir Windoof auferlegt ;) einfach MSDN durchlesen...
dbc.
}

Naja, wie immer, "dieser Code wurde nicht durch einen Compiler gejagt und ich übernehme keine Haftung für etwaige Fehlfunktionen", d.h. wenn ein Fehler drinn ist, bin ich nicht schuld...
MfG
Mobius

P.S.: gehörte eher unter PC- Notebook, aber wurscht :D hat ja auch was mit elektronik zu tun :)

23.11.2004, 17:48
erst mal danke für das alles! =) Nun geht es los. Wenn ich jetzt das Signal auf PIN2 des LPT-Ports auslesen möchte, welcher auch als Data0 bezeichnet wurde in meinem Schaltbild muss was für ein Code eingefügt werden? Der erste Teil dient dazu, die Schnittstelle bereit zu stellen, oder? Und dann kommt DCB...... Wie ist diese Zeile zu verstehen und wie muss sie aussehen, wenn sie auslesen soll für D0 (Pin2)?

Mobius
23.11.2004, 18:35
Nö, also die struktur DBC dient dazu, die Optionen des Ports zu erhalten und zu interpretieren. Wenn es nichts anderes ist, als den Buffer zu lesen, dann kannst du einfach den Befehl


ReadFile(HANDLE,BUFFER,BUFFER_LENGHT,BYTES_READ,OV ERLAPPED);

benutzten. Danach musst du vielleicht noch ein Mask auf deinen Buffer legen (welche nur 1 char, also 8 bits, lang ist) legen.



char buffer[1];
buffer=3; //0b.0000.0011
buffer=buffer & 0b.0000.0001; //buffer = 1


Naja,ich hoff das hilft weiter :D
Mobius

ronschulz
23.11.2004, 19:18
Ich habe mal mich versucht, was aber ja noch nicht klappt:

void __fastcall TForm1::Button1Click(TObject *Sender)
{

int i=0;

HANDLE hCom=CreateFile("LPT1",GENERIC_READ | GENERIC_WRITE,0,NULL, OPEN_EXISTING,0,NULL);

ReadFile(hCom,i,1,0,0); //lese lpt1

Form1->Edit1->Text=i();

}

ich wollte also in i das Ergebniss schieben, was an LPT anliegt. Dann soll er einfach das Ergebnis im Editfenster anzeigen. Aber ich mache da etwas falsch.

ronschulz
23.11.2004, 19:21
Sehe gerade, hattest hier schon etwas geschrieben. Die Readfilezeile macht mir zu schaffen. Wie muss man die Zeilen verstehen und was muss dafür eingesetzt werden?

ronschulz
23.11.2004, 19:26
Also i darf schon mal kein int sein. Mist. Ok. Char setzen.

void __fastcall TForm1::Button1Click(TObject *Sender)
{

char buffer[1];

HANDLE hCom=CreateFile("LPT1",GENERIC_READ | GENERIC_WRITE,0,NULL, OPEN_EXISTING,0,NULL);

buffer = ReadFile(hCom,"LPT1",1,0,0); //lese lpt1

Form1->Edit1->Text=buffer();

}


Habe da ein Problem mit der Interpretation von:

ReadFile(

HANDLE hFile, // handle of file to read
LPVOID lpBuffer, // address of buffer that receives data
DWORD nNumberOfBytesToRead, // number of bytes to read
LPDWORD lpNumberOfBytesRead, // address of number of bytes read
LPOVERLAPPED lpOverlapped // address of structure for data
);

Mobius
23.11.2004, 19:49
Also, Readfile....

HANDLE: Ein HANDLE zu einem vorher geöffneten PORT (im oberen Beispiel hCom)...
LPVOID: Ein buffer, WOHIN die erhaltenen Daten geschrieben werden
DWORD: Die größe des Buffers (kann auch mit dem Befehl sizeof(xyz) ausgefüllt werden)
LPDWORD: Ein pointer zu einem DWORD, wohin die Funktion schreibt, wie viele Bytes gelesen wurden (einfach & vor dem DWORD setzten). z.B.:

DWORD xyz;

ReadFile(xxx,xxx,xxx,&xyz,NULL);

LPOVERLAPPED: Ob eine Overlapped-Funktion benutzt werden soll (wenn du ein LPDWORD eingeschaltet hast, kannst du diesen Wert auf --> NULL <-- setzten.)

Und nicht 0, sondern "NULL". Die zwei sind NICHT gleich, weil sich NULL auf eine logische 0 bezieht, wobei 0 einfach einen leeren Byte übergibt. Hier ist das kein Problem, aber das kann einer werden, wenn du z.B.: keinen Byte übergeben musst, sondern 2 (DWORD). Dann gibt 0 einen Fehler zurück, NULL aber nicht

MfG
Mobius

P.S.: ich geh schlafen, cu @all morgen :)

ronschulz
23.11.2004, 21:42
Jep, n8 du! Ich bin noch am kämpfen.... der will nicht bits_read annehmen.... aber ich gucken noch..

ronschulz
24.11.2004, 02:45
Soweit bin ich damit:

void __fastcall TForm1::Button1Click(TObject *Sender)
{

char i;

unsigned long bits_read=1;

HANDLE hCom=CreateFile("LPT1",GENERIC_READ,0,NULL, OPEN_EXISTING,0,NULL);

BOOL tmp=ReadFile(hCom,&i,1,&bits_read,NULL);

Form1->Edit1->Text=i;
}

Da kommt aber nix sinnvolles bei raus: $7
¸
Xú



Es startet also, aber diese kryptische Ausgabe verändert sich nicht. Jetzt habe ich noch zusätzlich eine allgemeine "dumme" Frage. Wenn ich den LPT-Port nutzen möchte, muss ich doch die jeweiligen Leitungen auf Masse ziehen, oder? Also Pin 2 bis Pin 7 stehen hierfür zur Verfügung, oder?

ronschulz
24.11.2004, 03:11
Und ich habe im Bios geschaut, der Parallelport ist auf "2-Wege" geschaltet.

Bitte bitte helft mir... =(

Das im Edit-Fenster einfach der Wert drinsteht, der an der Parallelschnittstelle vorliegt. Oder halt an Pin 2, dem D0 Pin. Ob dieser High oder Low ist. ICQ habe ich nun auch noch hinzu gefügt.

ronschulz
30.11.2004, 06:52
Hilfe, geht noch nicht..... Hilfe Hilfe Hilfe ! ! ! !

ronschulz
30.11.2004, 07:29
Hier für jeden, der selber einen Eingang am PC braucht:

Erstmal das hervorragende Tool von Anton Zechner runterladen von seiner Seite:
http://members.inode.at/anton.zechner/az/index.html

Dann seine Anleitung befolgen:

*) Zuerst musst du die Dateien LptTools.h und LptTools.cpp
dein Projekt kopieren und einfügen.

*) Beim Programmstart rufst du folgendes auf:


C++:


#include "LptTools.h"
void StartProgramm()
{...if(!LptInit()) // Treiber initialisieren
{ // printf("Der Treiber ist nicht installiert.");
// printf ging nicht. habe dafür das hier gesetzt, ein Meldefenster bei Borland:
MessageDlg("LPT-Treiber nicht geladen!",mtError,TMsgDlgButtons()<< mbOK, 0);

return -1; // der muss rein
}
}






*) Bei deiner Taste rufst du folgende auf


C++:



void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i;i=LptPortIn (0,1);
// Diverse Bits einlesen (Habe ich von (0,2) auf (0,1) geändert, ging sonst nicht.

Form1->Edit1->Text=(i&0x20)? "PAPER-OUT high":"PAPER-OUT low";
// Bit 5 (0x20) ist PaberOut (Pin 12 bei beiden Steckern)
// Den nur auf Masse legen oder in der Luft hängen lassen, schon schaltet er um. =)


}





------------------------------------------------------------------

NOCHMALS DANKE AN ANTON!!!
[code]

18.03.2005, 12:12
Nur so ne Idee, warum ladet ihr nicht die Datei inpout32.dll von http://www.logix4u.cjb.net/ Die is eigentlich für VB (habe mit VB angefangen, tut mir ja auch leid), geht aber auch für CPP. bsp.:http://www.activevb.de/tutorials/tut_parallel/parallel.html