Chipkarten programmierung?



  • ich würde eher mal google nach CT-API fragen 😉





  • Hi Leute erst mal danke für die Tipps

    @CMatt habe mal deine Anweisung ausprobiert:

    Läuft so:
    C/C++ Code:
    hCom = CreateFile( "LPT1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);

    WriteFile(hCom, lpByte, len, &dwBytesWritten, NULL);
    ReadFile(hCom, lpByte, len, &dwBytesRecive, NULL);

    Leider stürzten das bei W2k ab und zwar bei WriteFile.
    Habe auch in einem anderen Beitrag gelesen das ich nicht der einzige bin der da Probleme hat. Hat den einer noch einen anderen Tipp.

    Achja ich war sehr vorsichtig mit den Leuchtdioden habe 1K Wdst genommen. 🙂
    Aber sie brennen aähmm leuchten. 😉

    Gruß Soulfly



  • Deine LEDs leuchten, obwohl er bei WriteFile abstürztz 😕
    Wie sieht denn das abstürzen ganau aus? Speicher-Zugriffsverletzung? Läuft es unter anderen Betriebssystemen ohne Absturz?
    Verweist lpByte auch auf gültigen Speicher - sieht nämlich komisch aus 🙄 und hast du len richtig initialisiert?



  • Naja die LED´s leuchten immer - auch wenn ich den Computer neustarte - anders BSY habe ich jetzt leider im Moment nicht zum testen.
    Beim debuggen bleibt das Prog bei WriteFile stehen und verharrt dort.

    Hier mein Quellcode der beim Buttonclick ausgeführt wird:

    unsigned char lpByte = 0x4f;
    
    HANDLE hCom = CreateFile( "LPT1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL); 
    
    WriteFile(hCom, &lpByte, 1, NULL, NULL); 
    
    CloseHandle(hCom);
    

    Ich habe auch schon versucht als 4ten Parameter

    unsigned char Data = 0xff;
    WriteFile(hCom, &lpByte, 1, Data, NULL);
    

    will aber nicht - es entsteht der gleiche Fehler.

    Gruß Soulfly



  • Als 4. Parameter wird ein Zeiger auf ein DWORD erwartet, also versuch es mal so:

    unsigned char cData = 0x4f;
    DWORD dwNumberOfBytesWritten = 0;
    
    HANDLE hCom = CreateFile( "LPT1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL); 
    
    WriteFile(hCom, &cData, 1, &dwNumberOfBytesWritten, NULL);
    


  • Arrrgghh

    sch.... spiegelverkehrt beschriftung 😕 !!!
    habe mir mal so ein tool zum testen runtergeladen und ich hatte die testDioden(3 Stück, hatte nicht mehr low current dioden) an die falschen Pins gelötet.
    Jetzt gehts 😉
    Zumindest bei dem tool.
    Mit der Programmierung bin ich noch nicht weiter.

    Gruß Soulfly



  • Bekommst du mit meinem Code immer noch einen Speicherzugriffs-Verletzungs-Fehler?



  • Ne leider nicht 😞

    Habe aber ne Lösung mit einer Hilfe von inpout32.dll gefunden.
    Achja die Klasse an sich habe ich selber so geschrieben, sind noch nicht ganz fertig - mit dem abspeichern der letzten gesendeten/empfangen daten.
    aber sonst läufst supi.

    ich kann ja mal meine Lösung hier präsentieren.
    lpt_klassen_h

    #ifndef lpt_klassen_h
    #define lpt_klassen_h
    
    class lpt
    {
    private:
    	int		port;
    	short	last_rec;		// zuletzt empfangenen Daten
    	short	last_sen;		// zuletzt gesendete Daten
    public:
    
    	lpt();		        	//LPT1 wird gesetzt NICHT empfehlenswert
    	lpt(int pport);
    	void set(int pport){port=pport;} 	
    
    	bool send(short data); 
    	bool rec(short &data);
    
    };
    
    #endif
    

    lpt_klassen.c:

    // #include "stdafx.h"  // vorkompilierte Header
    # include "lpt_klassen.h"
    # include <conio.h>
    # include <windows.h>
    
    typedef VOID (CALLBACK* LPFNDLLFUNC1)(INT,INT); 
    typedef UINT (CALLBACK* LPFNDLLFUNC2)(INT); 
    
    LPFNDLLFUNC1 oup32; // Function pointer 
    LPFNDLLFUNC2 inp32; // Function pointer 
    
    lpt::lpt()		        	//LPT1 wird gesetzt NICHT empfehlenswert
    {
    	port=0x378;
    	last_rec=0;
    	last_sen=0;
    }
    
    lpt::lpt(int pport)
    {
    	port=pport;
        last_rec=0;
    	last_sen=0;
    }
    
    // ----------   Zum daten senden ----------------
    bool lpt::send(short data)
    {
    	HINSTANCE  hLib; 
    
        hLib = LoadLibrary("inpout32.dll"); 
    
           if (hLib == NULL)
    			return FALSE;
    
    	   oup32 = (LPFNDLLFUNC1) GetProcAddress(hLib, "Out32"); 
           if (oup32 == NULL) 
    			return FALSE;
    
        oup32(port,data); 
    
    	FreeLibrary(hLib); 
    	return TRUE;
    }
    
    // ----------   Zum daten empfangen ----------------
    bool lpt::rec(short &data)
    {
    	HINSTANCE  hLib; 
    
        hLib = LoadLibrary("inpout32.dll"); 
    
           if (hLib == NULL)
    			return FALSE;
    
           inp32 = (LPFNDLLFUNC2) GetProcAddress(hLib, "Inp32"); 
           if (inp32 == NULL)  
                return FALSE;
    
    	   data = (inp32)(port); 
    
    	   FreeLibrary(hLib); 
    	   return TRUE;
    }
    

    Läuft unter W2K und soll auch unter WXP laufen mit der .dll datei
    wenn einer das komplette Projekt von mir haben will muss er bescheid sagen.

    Gruß Soulfly



  • Soulfly_2111 schrieb:

    flenders schrieb:

    Bekommst du mit meinem Code immer noch einen Speicherzugriffs-Verletzungs-Fehler?

    Ne leider nicht 😞

    Wieso leider? Wenn es keinen Fehler mehr gibt ist doch alles ok 😕



  • *hust* warum wollen die leute immer alles noch mal machen was schon x leute vor ihnen gemacht haben!? *hust*
    Klick mich

    Für diese card-terminals gibts ne fertige api. So nen kartenleser bekommst bei conrad fast nachgeschmissen... so nen terminal selbst zu bauen und per LPT nen I²C-Bus zu simulieren wäre irgendwie überflüssig... aber wenn du es unbedingt selbst bauen willst, nimm die steuerleitungen der COM. Du brauchst ja nicht mehr als 2 Outputs und 1 input, reicht also völlig aus und die Ansteuerung ist über EscapeCommFunction und GetCommModemStatus sehr einfach..



  • @flenders:
    ne meinte leider funktioniert es nicht. 😮

    @CMatt:
    Danke für den Hinweis, habs mir auch mal angeschaut. Aber irgendwie will ich das selber bauen und programmiern
    weil, ich wollte schon immmer wissen wie ich lpt port ansteuere 🙂 !
    Mein Schlappi hat leider kein COM Port :(.

    Ich bastel mir jetzt nen I²C Kartenlesegerät mit 2 WDST nur über den LPT Port und dann kommen noch 2 LED (grün,rot) als Status anzeige - natürlich brauchen die auch nen R. Selbst die Einspeisung von Vcc geht über den LPT da die Teile unter 10mA und nur im Schreib/Lesezyklus brauchen. Habe mich da auch schon informiert 😉 . Ist nicht so schwierig - ich hoffe das klappt auch.
    Muss ich mir das I²C-Protokoll nur als Softwarelösung basteln - sollte aber auch gehen.

    Danke an alle für die Tips

    Gruß Soulfly


Anmelden zum Antworten