Datentransfer PC -> Microcontroller



  • --------------------------------------------------------------------------------
    Hallo,

    ich möchte einen Datentransfer zwischen einem PC (Windows XP) und einem
    Microcontroller über den Parallelport des PC durchführen, bidirektional
    8Bit.
    Serielle Schnittstelle ist zu langsam.
    Dachte mir das es mit der Windows API funktionieren könnte

    Handle= CreateFile("LPT1", GENERIC_WRITE , 0, NULL, OPEN_EXISTING, 0,
    NULL);
    WriteFile(Handle, Data, byteszuschreiben, &bytesgeschrieben, NULL);

    oder mit ReadFile um Daten zu lesen.

    Wenn nun WriteFile durchgeführt wird , bleibt der PC in der Funktion
    hängen und auf dem Parallelport tut sich überhaupt nichts, kein
    Datenstrobe oder Writesignal wird gesetzt.

    Wenn ich das Gleiche mit einem Drucker versuche, funktioniert es.
    Im Rechnersetup ist EPP Modus eingestellt. Für den EPP Modus werden auch
    nur, laut Beschreibungen, die Signale Datastrobe, Write vom PC und Wait
    vom Microcontroller benötigt.

    Ich mache also etwas falsch aber was??? Oder brauche ich noch besondere Treiber?

    Gruß Rainer



  • Eine direkte Datenausgabe über den LPT-Port läßt WinXP nicht zu (das funktionierte nur bei den DOS-gestützten Windows-Versionen, also bis WinME). Dazu brauchst Du einen Kernel-Mode-Treiber. Ich empfehle inpout32.dll.





  • Danke 🙂 ,
    nun findet der Linker meines Borland Cpp Builders die Funktion, Out32, nicht

    mit

    __declspec( dllimport ) void Out32(int, unsigned char);

    habe ich dem Compiler gesagt, das die in einer DLL steht, was habe ich noch vergessen? Die Dll steht im Debugverzeichnis, Sourceverzeichnis, Binverzeichnis des Compilers oder wo muss sie stehen, zum Linken.

    Gruß Rainer



  • Die DLL wird erst zur Laufzeit benötigt.
    Zur Linkzeit wird die LIB benötigt.
    Und das Header- File wird zur Kompilierzeit benötigt.

    http://logix4u.net/Legacy_Ports/Parallel_Port/Inpout32.dll_for_Windows_98/2000/NT/XP.html
    Edit: (Hier kann der Source der DLL herruntergeladen werden.)

    Oder aber Du lädtst die DLL zur Laufzeit (LoadLibrary) und bindest die Funktionen dynamisch (GetProcAddress). Hier wird nur die DLL und das Header File benötigt.



  • Danke, jetzt hat der Port aufgegeben, er liegt jetzt in seinen Einzelteilen vor mir 😃 .
    Mit der Lib klappte es nicht, der OMF Record passte dem Linker nicht. Aber mit Load Library funktioniert es. Da ich ja jetzt den Quellcode vom Treiber habe, kann ich den vielleicht später an Borland anpassen.

    Gruß und nochmal Danke Rainer



  • Hallo,

    Hmm, wie gesagt der Port hat zwar aufgegeben, er tut jetzt das was ich will, nur ist er im Bummelstreik.

    Mit anderen Worten, es funktioniert, aber sehr langsam. Brauche eine Übertragungrate von min 200000 Bytes pro Sekunde und schaffe nur eine Rate von 70000 Bytes sek, der PC soll nicht nur Daten schaufeln, sondern auch noch etwas anders tun und das auch noch fix. Wo sind die 2MByte sek, die angeblich möglich sind.

    Wie kann ich nun schneller werden?

    Gruß Rainer



  • Zeige Code...



  • Hallo

    das ist nur die Funktion mit der ich es teste. Die ist eingebettet in ein Borland Windows Programm.

    void Test(void)
    {
    
    //übernommen aus den Beispielen von logix
    
    typedef short _stdcall (*inpfuncPtr)(short portaddr);
    typedef void _stdcall (*oupfuncPtr)(short portaddr, short datum);
    HINSTANCE hLib;
    inpfuncPtr inp32;
    oupfuncPtr oup32;  
    
            hLib = LoadLibrary("inpout32.dll");
    
    	 if (hLib == NULL)
    	 {
    		  printf("LoadLibrary Failed.\n");
    	 }
    
    	 /* get the address of the function */
    
    	 inp32 = (inpfuncPtr) GetProcAddress(hLib, "Inp32");
    
    	 if (inp32 == NULL)
    	 {
    		  printf("GetProcAddress for Inp32 Failed.\n");
    	 }
    
    	 oup32 = (oupfuncPtr) GetProcAddress(hLib, "Out32");
    
    	 if (oup32 == NULL)
    	 {
    		  printf("GetProcAddress for Oup32 Failed.\n");
    	 }
    
    //soll nur Daten übertragen mittels eines Handshakes
    // Ohne Handshake zu Fuß, nur datenbytes schreiben, komm ich auf ca. 
    //400000 Bytes
    // brauche aber den Handshake. Kann der Port das vielleicht auch von allein?
    
    	for(;;)
    	{
    	 (oup32)(0x37a,0x00);
    	 while( (inp32)(0x379) & 0x80); // warte auf waitsignal = 1
    	 (oup32)(0x378,0xaa);
    	 (oup32)(0x37a,0x03);//Strobe und Writesignal
    	 while( !((inp32)(0x379) & 0x80));
    	}
    
    }
    


  • Moin,

    werden noch mehr Angaben gebraucht, oder kennt sich hier keiner mit der Parallelschnittstelle des PC's aus.
    Ich will doch nur einen schnellen Datentransfer zwischen PC und einem Microcontroller/später FPGA, beide Richtungen, erreichen. Brauchen nicht die in den Specs stehenden 2MByte sek sein, mit 500000 Bytes sek, bin ich schon zufrieden.

    Gruß Rainer


Anmelden zum Antworten