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??? Gruß Rainer
Quittiert der Mikro die empfangenen Bytes korrekt? Signalisiert er Bereitschaft? Sonst ist es klar, daß der PC stehenbleibt?
Bereitschaft heist doch, dass das Waitsignal vom Micro auf LOW ist, oder habe ich da was falsch verstanden, und wird auf High gesetzt, wenn das Byte übernommen wurde. Danach setzt der PC Strobe und Writesignal wieder auf HI und der Micro Wait wieder auf LO. Oder gibt es da noch ein anderes Signal, welches Bereitschaft signalisieren soll? In den Timings die ich gefunden habe, weist aber nichts daraufhin. Es gibt allerdings noch drei bits: PE, Select und nError, die aber als "User defined" beschrieben sind, die werden aber in keinem EPP Protokoll benutzt. Sollte Windows die doch auswerten?
Denk dran, daß einige Signale invertiert sind. Wenn du das Handshake im Controller anpasst sollte es gehen. Wenn du delphi kannst, dann schau dir mal bei Pollin bei den LCD um, wo es welche für den parport gibt. dort sind beispiele mit dabei ;)
Danke, hilft mir aber nicht wirklich. Delphi ist mir noch sehr Schemenhaft in Erinnerung, C/Cpp ist meine Sprache. Kann zwar ein Beispiel compilieren und Daten senden, aber es findet kein Handshake statt, die Daten werden auch ohne das der uC angeschlossen ist, gesendet. Die Schnittstelle scheint nicht im EPP Modus zu arbeiten. War kann ich noch versuchen?
Du könntest statt über die Funktionen CreateFile/WriteFile über die Low Level Port-Funktionen aus der inpout32.dll gehen. http://www.codeproject.com/KB/cs/csppleds.aspx und andere s. Links dort.
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
> Danke , nun findet der Linker meines Borland Cpp Builders die Funktion, Out32, nicht > __declspec( dllimport ) void Out32(int, unsigned char); [...] Um eine DLL unter C/C++ so zu benutzen muss noch mehr gemacht werden, d.h. aus der DLL muss eine Import Library generiert werden usw. usf. Es ist in deinem Fall einfacher die Funktion "von Hand" zu laden. Schau dir mal hier: http://www.hytherion.com/beattidp/comput/pport.htm "test2.c" an.
Du musst schon noch die zur DLL gehörende Importlibrary (*.lib) zu Deinem Projekt linken. Woher sollte der Compiler wissen, in welcher DLL die von Dir gewünschten Funktionen zu finden sind? Alternativ kannst Du die DLL zur Laufzeit selber laden. Dazu werden die Win32-API-Funktionen LoadLibrary und GetProcAddress benötigt. Näheres habe ich z.B. hier Beitrag "Re: Kann Dll nicht laden (MPUSBAPI.DLL)" beschrieben.
Deine Codezeile zeigt, dass du im Moment implizites Linken versuchst. Dazu bräuchtest du für den Linker eine IMPORT Library und eine EXPORTS Datei in der steht, welche Symbole in der DLL vorhanden sind. Ich weiss nicht, ob diese Dateien a/ bei der DLL dabei sind und b/ für die Bprland Toolchain taugen. Ohne die IMPORT Library und die EXPORTS Datei könntest du mit explizitem Linken arbeiten. D.h. mit LoadLibrary und GetProcAddress Mehr siehe: http://msdn2.microsoft.com/en-us/library/9yd93633.aspx
Danke, jetzt funktioniert es :-) Natürlich!, die lib dazulinken, lag der Fehler also zwischen den Kopfhörern. Klappte aber nicht Falscher OMF Record, mache es jetzt mit LoadLibrary(). Gleich die nächste Frage, den Handshake für den EPP Mode macht der Port doch selbst, oder? Wenn ja, wo werden die Register des Portes beschrieben, denke auch das ich Input und Outputrichtung einstellen muß. Gruß rainer
Moin, OK, komme jetzt zwar an die Parallelschnittstelle des PC's ran, kann auch Daten hin und her senden, aber viel zu langsam. Da ich einen Handshake brauche, diesen über die out32 inp32 steuere, schaffe ich nur 70KByte sek. Brauche aber min 200KByte am besten währe natürlich volle 2MByte sek im EPP Mode. Wie bekomme ich das in den Griff. Etwas ist noch völlig falsch, da ich keine Daten mit CreateFile, WriteFile und ReadFile senden, empfangen kann, die dann hoffentlich im EPP Mode arbeiten. Gruß Rainer
Hallo, ihr seit mir Spezis, zumindest konntet ihr mir bei der DLL helfen, ist ja schon mal was, danke. Wie komme ich nun an den Parallelport des PC ran, mit inpout32.dll und wie kann ich den EPP Mode nutzen. Nach stundenlangem wühlen im Müll des Internetes, habe ich die Perle gefunden. Der Port kann tatsächlich den Handshake für den EPP Mode selber machen, man muß nur in die Basisadresse + 3 für die Adressübertragung und Basisadresse + 4 für Datenübertragung reinschreiben/auslesen, der Rest läuft dann von alleine. Nun komme ich auch um einiges über die angestrebte Geschwindigkeit. Möglich ist, das da irgend wo noch ein Haken ist, das werde ich noch rausfinden. Gruß Rainer.
Ich denke du bist da auf dem anderen (nicht falschen!) Dampfer. inpout32.dll ist eine komplett andere Geschichte als CreateFile, WriteFile und ReadFile. Die haben beide nichts miteinander zu tun. inpout32.dll gibt dir einen Zugriff auf Port-I/O. Leider nur Häppchenweise und damit mit viel Overhead und u.U langsam. Ähnlich arbeiten auch Port-I/O Zugriffe unter giveio.sys, nur ist hier zusätzlich ein CreateFile nötig. http://www.ddj.com/architect/184409876 Beide Verfahren des Port-I/O sind ziemlich softwarelastig und es sind nur Transferraten zwischen 50 und 100 KB/s drin. So gesehen liegst du mit deinen 70 KB/s schon ziemlich gut. Wenn du zu blockweisem Transfer (WriteFile und ReadFile) wechseln willst oder die speziellen EPP Möglichkeiten nutzen willst, kann ich dir nicht weiterhelfen. Die Suche nach Softwaretools (Libraries, Driver), die IEEE 1284 EPP unterstützen, ist langwierig und bringt zunächst mal reichlich teure Toolkits aufs Parkett. Ob es da was erschwingliches bzw. Open Source gibt...
Hallo Leute, Für die ganze Port Problematik hat Js. Payne ein erstklassiges Aktive X geschrieben. ( www.jspayne.com ) das sollte alle Probleme beseitigen. Am schönsten ist das es gleich mit allen Windows Versionen funktioniert.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.