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
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.