E
N'abend,
ich benutzte die inpout32.dll um den LPT-Port direkt ansprechen zu können (muss einen Wandlerchip ansteuern). Dieses hat eigentlich auch wunderbar geklappt, bis ich iwo an einer ganz anderen Stelle im Programm etwas geändert habe. Nun stürzt mein Programm beim Ansteuern des LPT-Ports in recht komischer Art und Weise ab.
Hier vll. erstmal die Klasse die dafür ich benutze:
class LPTPort
{
public:
LPTPort();
short Messen();
private:
typedef short _stdcall (*inpfuncPtr)(short portaddr);
typedef void _stdcall (*oupfuncPtr)(short portaddr, short datum);
HINSTANCE _hLib;
inpfuncPtr _In;
oupfuncPtr _Out;
short _AddrDR;
short _AddrSR;
short _Vcc;
short _Vcc_CS;
short _Vcc_Clk;
};
LPTPort::LPTPort()
{
//Libary entsprechend laden
_hLib = LoadLibrary("inpout32.dll");
if (_hLib == NULL) wxMessageBox("LoadLibrary Failed.");
_In = (inpfuncPtr) GetProcAddress(_hLib, "Inp32");
if (_In == NULL) wxMessageBox("GetProcAddress for Inp32 Failed.");
_Out = (oupfuncPtr) GetProcAddress(_hLib, "Out32");
if (_Out == NULL) wxMessageBox("GetProcAddress for Oup32 Failed.");
//Adressen
_AddrDR = 0x378; //Data Register
_AddrSR = 0x378 + 0x1; //Status Register -> Offset 1
//Verschiedene Werte zum Ansteuern
_Vcc = 152;
_Vcc_CS = 154
_Vcc_Clk = 153;
//Das erste mal Pins setzen (Wert 152 senden: Stromversorgung an)
(_Out)(_AddrDR,_Vcc);
};
short LPTPort::Messen()
{
short byte = 0;
//Befehl zur Wandlung
(_Out)(_AddrDR,_Vcc_CS);
(_Out)(_AddrDR,_Vcc);
//1.Schleife (einfaches switchen zwischen 2 Werten (hat keinen Sinn, aber lest weiter, dann wisst ihr warum ich's mache)
for(int k=0;k<10;k++)
{
(_Out)(_AddrDR,_Vcc_CS);
(_Out)(_AddrDR,_Vcc);
}
//2.Schleife
for( int i = 7 ; i >= 0 ; i-- )
{
//Signal vom Wandler einfangen
if( (_In)(_AddrSR)&16) byte |= 1<<i ;
//Signal für Wandler: nächster Takt
(_Out)(_AddrDR, _Vcc_Clk);
(_Out)(_AddrDR, _Vcc);
}
return byte;
};
Soo, die Funktion Messen() wird jetzt innerhalb des Programmes des öfteren ausgeführt und das hat bis vor kurzem auch wunderbar funktioniert. Jetzt allerdings stürzt mir das Programm in dieser Funktion einfach ab, undzwar laut DEV-Cpp mit einem Zugriffsfehler (Segmentation Fault).
Auffällig ist aber der Punkt an dem diese Segmentation Fault auftritt. Lasse ich die 1.Schleife mit k nur bis 1 laufen, so stürzt er mir bei dem Befehl "(_Out)(_AddrDR, _Vcc);" in der 2.(!)Schleife ab. Das meistens beim ersten Durchlauf, aber manchmal auch erst beim zweiten, wenn ich in der 1.Schleife etwas ändere ôO
Lasse ich k bis 10 Laufen, so erhalte ich schon bei "if( (_In)(_AddrSR)&16) byte |= 1<<i ;" einen Zugriffsfehler.
Sage ich jedoch k bis 100, so stürzt er bereits in der 1.Schleife ab.
Ich hatte es auch schon, dass die Variable i, die ja eindeutig bei 7 anfängt, direkt nach Schleifenanfang einen Wert von iwas mit 20Mio hatte. Also da muss insgesammt iwas schief laufen
Habt ihr da ieine Idee?? Also ich bin langsam ratlos, es hatte doch noch bis vor kurzem alles funktioniert. Liegt es an der inpout32.dll, ist die vll. unsauber programmiert, oder bin ich doch der Schuldige?
MfG