- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 7 von 7

Thema: LPT Schnittstelle via CreateFile und WriteFile

  1. #1

    LPT Schnittstelle via CreateFile und WriteFile

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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++):
    Code:
    #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.

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    07.07.2004
    Ort
    um Berlin
    Beiträge
    346
    Code:
    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.
    Code:
    char buffer = 0x02;
    schaltet nur D2 (ein).
    Der Rest des Programms sollte richtig sein.


    Blackbird

  3. #3
    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?

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    31.01.2004
    Ort
    36399
    Alter
    50
    Beiträge
    1.562
    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ß
    P: Meine Tochter (06.11.07) und https://www.carnine.de
    M: Träumen hat nix mit Dummheit zu tun es ist die Möglichkeit neues zu erdenken

  5. #5

    Danke für die Antwort

    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.

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    31.01.2004
    Ort
    36399
    Alter
    50
    Beiträge
    1.562
    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

    Code:
    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);
        }
    }
    P: Meine Tochter (06.11.07) und https://www.carnine.de
    M: Träumen hat nix mit Dummheit zu tun es ist die Möglichkeit neues zu erdenken

  7. #7

    inpout.dll

    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad