PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LPT Schnittstelle via CreateFile und WriteFile



clone
08.03.2005, 18:50
Hallo, ich möchte auf den Datenbus (D0-D7) der parallelen Schnittstelle unter Win2k oder XP zugreifen, um ein RC-Auto fahren zu lassen. Ich wollte dies eigentlich mit CreateFile() & WriteFile() machen.
Hier ist mein Quellcode (C/C++):


#include<iostream>
#include<windows.h>
#include<conio.h>
using namespace std;

int main(void)
{
HANDLE hLPT;
char buffer = '2'; //Für D1
DWORD written;
hLPT = CreateFile
("LPT1",GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
WriteFile(hLPT,&buffer,1,&written,NULL);
getch();
CloseHandle(hLPT);
return 0;
}

Da passiert aber gar nichts und ich weiß nicht an was das liegen könnte.
Benutzte Visual Studio 7, wäre net wenn ihr mir helfen könntet.
Schon mal Danke im vorraus.

Blackbird
11.03.2005, 08:47
char buffer = '2';
schaltet bit 1, 4 und 5 (mit 0 beginnend zu zählen). Weil der Hex-Code von '2' gleich 0x32 = 00110010 ist.

char buffer = 0x02;
schaltet nur D2 (ein).
Der Rest des Programms sollte richtig sein.


Blackbird

clone
11.03.2005, 16:13
Hi, erst mal Danke für die Antwort,
ich hab den Inhalt von [highlight=red:3499839663]char buffer[/highlight:3499839663] so wie oben gezeigt geändert,
leider funktioniert es immer noch nicht. Könnte es nicht noch an was anderem liegen? :-k

NumberFive
12.03.2005, 09:04
wenn du die CreateFile metode benutzt reagiert der lpt port wie ein drucker. das heist die daten liegen nur kruz an gund gehen wieder weg
wenn das zeichen gesendet wurde. oder es wird überhaupt nicht gesendet da der port denkt hängt ist ja kein drucker dran.

da du die Pins einzel stuer willst mußt du direckt auf die Hardware entweder mit einer fertigen libary oder mit einem eingen Treiber.

Die treiber metode habe ich schon ma probiert ist nicht ganz einfach aber es tut. Die libarys gibt es im netz zum downloaden.

aber immer dran denken ab win2000 geht es immer nur mit treibern.
da dir sonst Hal auf die finger haut. bei dos oder so drafs du alles.

Gruß

clone
14.03.2005, 17:05
Hi, vielen Dank für deine Antwort,
hast du eventuell deinen Treiber Quellcode
noch den du hier posten könntest?
[-o< Wär echt net.

NumberFive
14.03.2005, 19:42
der source ist aus dem Platform DDK von MS.

der source würde dir nicht viel nutzen da dir die ganzen header fehlen.


so spricht man ihn dann an



void CReadWritePort::WriteByte(BYTE PortNumber,BYTE Data)
{
GENPORT_WRITE_INPUT InputBuffer;

hndFile = CreateFile(
"\\\\.\\GpdDev", // Open the Device "file"
GENERIC_WRITE,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
0,
NULL
);
if (hndFile == INVALID_HANDLE_VALUE) // Was the device opened?
{
MessageBox(NULL,"Unable to open the device.","PortIO",MB_OK);
return;
}

IoctlCode = IOCTL_GPD_WRITE_PORT_UCHAR;
InputBuffer.CharData = Data;
DataLength = offsetof(GENPORT_WRITE_INPUT, CharData) +
sizeof(InputBuffer.CharData);

//sscanf("200", "%x", &PortNumber);
//PortNumber = 0x3BC;
InputBuffer.PortNumber = PortNumber;

IoctlResult = DeviceIoControl(
hndFile, // Handle to device
IoctlCode, // IO Control code for Write
&InputBuffer, // Buffer to driver. Holds port & data.
DataLength, // Length of buffer in bytes.
NULL, // Buffer from driver. Not used.
0, // Length of buffer in bytes.
&ReturnedLength, // Bytes placed in outbuf. Should be 0.
NULL // NULL means wait till I/O completes.
);

if (IoctlResult) // Did the IOCTL succeed?
{
ATLTRACE("Wrote data %x to port %x\n", InputBuffer.CharData,InputBuffer.PortNumber);
CString Dummy;
Dummy.Format("%x",InputBuffer.CharData);
if(PortNumber == 0)
{
SetDlgItemText(m_hMainDlg,IDC_DATEN_EDIT,Dummy);
}
if(PortNumber == 2)
{
SetDlgItemText(m_hMainDlg,IDC_STEUEROUT_EDIT,Dummy );
}

}
else
{
ATLTRACE("Ioctl failed with code %ld\n", GetLastError() );
CString csMsg;
csMsg.Format("Ioctl failed with code %ld",GetLastError());
MessageBox(NULL,csMsg,"PortIO",MB_OK);
}


if (!CloseHandle(hndFile)) // Close the Device "file".
{
ATLTRACE("Failed to close device.\n");
MessageBox(NULL,"Failed to close device","PortIO",MB_OK);
}
}

clone
31.03.2005, 10:56
Also erst mal danke für die Antwort,
das mit dem Treiber schreiben ist mir zu viel arbeit und auch zu kompliziert,
ich mach des jetzt mit der inpout.dll O:)