Forum: PC-Programmierung Text an Parallelport senden


von Stefan E. (essig)


Lesenswert?

Hallo,
Ich bin ein ziemlicher Anfänger was Programmieren angeht, in der Schule 
haben wir zwar schonmal ein paar kleine Sachen in C++ programmiert (mit 
Borland) aber das war nichts wirklich schwieriges (Nur Programme wo mit 
werten aus einem Textfeld etwas gerechnet wird)

Jetzt möchte ich mir ein Programm schreiben mit dem ich den Parallelport 
ansteuern kann.
Dazu habe ich schon gesucht aber die meisten Leute versuchen immer nur 
einen Pin beim Parallelport zu steuern. Bei mir ist das anders, denn 
eigentlich weiss ich garnicht was ich genau am Parallelport steuern will 
:)
Ich habe einen Plotter und dem kann ich bis jetzt per eingabe in die 
console HPGL daten schicken die z.b. in einem Textdokument gespeichert 
sind.
Das ganze sieht dann so aus: "copy print.txt LPT1:"
Nun würde ich gern wissen wie ich dem Plotter beibringe per Druck auf 
eine Schaltfläche eine bestimmte Aktion auszuführen.
Wenn ich bisher den Stift 10 Schritte nach oben führen wollte habe ich 
in die datei Print.txt "PR 0,10;" geschrieben - sonst nichts - und diese 
mit dem obrigen Kommando an den Parallelport geschickt
Zugegebenermaßen habe ich das natürlich nicht oft (nur testweise) 
gemacht aber so funtkioniert es jedenfalls.
Es soll also der Textstring "PR 0,10;" an den Parallelport geschickt 
werden...


Hat da jemand z.b. einen schön erklärten Codeschnipsel?


Mein Problem ist dass ich eigentlich nicht weiss nach was ich da 
eigentlich suchen soll, wenn ich nach "parallelport ansteuern" suche 
kommen immer nur Ergebnisse die sich mit dem steuern einzelner Pins 
beschäftigen...
Wie gesagt ich hab von der Materie im Prinzip keine Ahnung, also wenn 
jemand was weiterführendes hat das mir hilft mein Problem zu verstehen 
dann immer her damit.

Bin eigentlich für jede Art von Hilfe dankbar


Grüßle vom Essig

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Du scheinst Windows einzusetzen, da kannst Du die Win32-API-Funktion 
CreateFile verwenden, um ein Handle auf den Druckerport zu erhalten. 
Folgende Aufrufe von WriteFile senden Daten an einen angeschlossenen 
Drucker oder --in Deinem Falle-- Plotter.

Nach Gebrauch die Schnittstelle wieder mit CloseHandle schließen, 
fertig.

In der Dokumentation zu CreateFile wird auch die Druckerschnittstelle 
als "Communication Resource" bezeichnet.


http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx

http://msdn.microsoft.com/en-us/library/aa363196(VS.85).aspx

von Stefan E. (essig)


Lesenswert?

Danke für die ultraschnelle Hilfe! Leider werde ich als Anfänger nicht 
so ganz schlau daraus.

Ich nehme mal an dass CreateFile nur einmal aufgerufen werden muss, also 
bei Programmstart
1
HANDLE WINAPI CreateFile(LPT1,GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)

Wie sieht es mit der Syntax aus? Hab ich das bis jetzt so verstanden? 
Also ist alles richtig? :)


Wenn ich es halbwegs verstanden habe dann muss CreateFile 1x beim 
Programmstart ausgeführt werden. Danach kann man mit WriteFile Text an 
den Parallelport senden.
Das senden von Text erschliesst sich mir noch nicht so ganz...

Auf der seite wird die Syntax von WriteFile so beschrieben
1
BOOL WINAPI WriteFile(
2
  __in         HANDLE hFile,
3
  __in         LPCVOID lpBuffer,
4
  __in         DWORD nNumberOfBytesToWrite,
5
  __out_opt    LPDWORD lpNumberOfBytesWritten,
6
  __inout_opt  LPOVERLAPPED lpOverlapped
7
);

Warum BOOL, ich will doch Text senden?

"hFile" ist mir klar denke ich, hier muss in meinem Fall LPT1 hin.

"lpBuffer" wird beschrieben mit: A pointer to the buffer containing the 
data to be written to the file or device.
Welcher Buffer? Ich möchte nur einen string weitergeben, das bringt mich 
ziemlich durcheinander

"nNumberOfBytesToWrite" muss ich da jedes mal Angeben wieviel Bytes mein 
Text lang ist? wäre ja umständlich...

von Thomas L. (tom)


Lesenswert?

hFile: Das was du von CreateFile bekommst
lpBuffer: ein Pointer auf den Buffer. Buffer bezeichnet deinen String, 
bzw. der Pointer zeigt auf das erste Zeichen im String
nNumberOfBytes..: Die Anzahl an Buchstaben (ich nehme mal ASCII 
Kodierung an).

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> Ich nehme mal an dass CreateFile nur einmal aufgerufen werden muss, also
> bei Programmstart

>
1
HANDLE WINAPI  CreateFile(LPT1,GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)
>
> Wie sieht es mit der Syntax aus?

Schlecht.
1
HANDLE hFile;
2
3
hFile = CreateFile("\\\\.\\LPT1",GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
4
5
if (hFile == INVALID_HANDLE_VALUE)
6
{
7
  // Fehlerbehandlung!
8
}

> Warum BOOL, ich will doch Text senden?

Hast Du überhaupt schon mal in C programmiert? Das ist der Typ des 
Rückgabewertes der Funktion.

> "hFile" ist mir klar denke ich, hier muss in meinem Fall LPT1 hin.

Nein. Sondern das Handle, das Du mit CreateFile erzeugt hast.
In obigem Beispiel also hFile.

> "lpBuffer" (...)
> Welcher Buffer? Ich möchte nur einen string weitergeben,
> das bringt mich ziemlich durcheinander

Das ist Dein String.

> "nNumberOfBytesToWrite" muss ich da jedes mal Angeben
> wieviel Bytes mein Text lang ist? wäre ja umständlich...

Ja, das musst Du. Schließlich kann WriteFile auch binäre Daten 
verarbeiten, und wie sollte es da die Länge bestimmen?
1
char* pText = "Ich bin Text und will ausgegeben werden";
2
DWORD dwWritten;
3
4
if (!WriteFile(hFile, pText, strlen (pText), &dwWritten, NULL))
5
{
6
  // Fehlerbehandlung
7
}

von Stefan E. (essig)


Lesenswert?

Danke für die Codeschnipsel, das mit den Rückgabewerten der Funktionen 
hab ich verrafft, sind wohl doch bissl eingerostet meine 
"Programmierkünste"

Wie gesagt war bei uns eher rechnen als programmieren...

Bisher hab ich soweit denke ich alles verstanden, ich meld mich wenns 
wiedermal irgendwo hakt (kommt sicher vor :D )


Danke an alle

Grüßle vom Essig

von Stefan E. (essig)


Lesenswert?

Also wie schon gesagt bin ich ziemlich doof was das programmieren angeht 
:)

Ich hab mir jetzt mal visual studio C++ 2008 express edition 
runtergeladen.
In der Schule hab ich mit Borland Builder gearbeitet und mir hat das 
Konzept dass die grafische Oberfläche des Programms gestalten konnte und 
seinen eigenen Quellcode einem Button zugeordnet hat ziemlich gut 
gefallen.

Um aber eine Benutzeroberfläche zu bekommen bei dem man sich alles so 
einfach zusammenklicken kann muss ich eine CLR "Windows-Forms-Anwendung" 
erstellen.
CLR hat soweit ich das mitbekommen habe das .Net Framework als 
Arbeitsumgebung (is vllt bissl doof formuliert...)

Funktioniert CreateFile beim erstellen einer CLR Anwendung auch noch?
http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx hier ist es 
ja dem Win32 Development untergeordnet.

Welche Headerdateien muss ich verwenden um die Funktion zum laufen zu 
bekommen?

von Thomas L. (tom)


Lesenswert?

Wenn du .NET verwendest, verwende die Klasse "SerialPort" aus dem .NET 
Framework. Die ist wirklich sehr einfach :)

von Stefan E. (essig)


Lesenswert?

Ich verwende einen Parallelport, kann ich "SerialPort" trotzdem
verwenden? Ich glaubs nicht, daher frag ich :)


Hab irgendwie was hinbekommen :D
1
#include <windows.h>
2
#include <tchar.h>
3
#include <stdio.h>
4
5
HANDLE hFile;
6
  
7
  TCHAR *pcParallelPort = TEXT("\\\\.\\LPT1");
8
9
  hFile = CreateFile(pcParallelPort,GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
10
11
  if (hFile == INVALID_HANDLE_VALUE)
12
  {
13
  // Fehlerbehandlung!
14
  }

Als ich statt
1
TCHAR *pcParallelPort = TEXT("\\\\.\\LPT1");
2
3
  hFile = CreateFile(pcParallelPort,GENERI......
das hier
1
hFile = CreateFile("\\\\.\\LPT1",GENERI......
verwendet hab gabs nen fehler beim compilieren: error C2664: 
'CreateFileW': Konvertierung des Parameters 1 von 'const char [7]' in 
'LPCWSTR' nicht möglich

von Daniel F. (df311)


Lesenswert?

Thomas Linder wrote:
> Wenn du .NET verwendest, verwende die Klasse "SerialPort" aus dem .NET
> Framework. Die ist wirklich sehr einfach :)

wenn das element doch nur mit dem parallelport funktionieren würde...

von Thomas L. (tom)


Lesenswert?

Sorry, hatte irgendwie die serielle im Kopf .. wer verwendet denn heute 
noch sowas paralleles ;)

von Christian R. (supachris)


Lesenswert?

Oh nein, bitte nicht C++ mit .NET verwenden. Das ist schlimmste 
Selbst-Vergewaltigung. Entweder C++ oder .NET, auf keinen Fall dieses 
MS-Mischmasch, wo nix gescheit geht. Du kannst auch für die grafische 
Oberfläche freie Bibliotheken nehmen XWidgets beispielsweise, die 
arbeiten meines Wissens mit Visual Studio zusammen.

von Stefan E. (essig)


Lesenswert?

Hmm, das eigentlich traurige an der Sache ist dass ich was mach was ich 
im endeffekt irgendwie nich versteh :(

Ich glaub ich muss mir da mal nen gutes Buch kaufen...

von Stefan E. (essig)


Lesenswert?

Ich hab jetzt mal nen leeres Projekt gemacht, also nur Kommandozeile und 
irgendwie geht der code von oben nicht, CreateFile verursacht nen 
Fehler, GetLastError() gibt mir "2" zurück. ich hab jetzt halt keine 
ahnung was das zu bedeuten hat und hab auch irgendwie auf der MS seite 
nix gefunden...

Kompiliert wird alles ohne probleme... Hat jemand ne ahnung?

Grüßle vom Essig

von Tobi H. (tobi-) Benutzerseite


Lesenswert?

http://msdn.microsoft.com/en-us/default.aspx <- Da findet man alle 
Windows-bezogenen Funktionen mit ausführlicher Beschreibung

von adam (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

im normalen C kannst Du einfach auf den File "prn" schreiben.

FILE *fp;

fp = fopen("prn","w");

fprintf(fp,"%s","Hallo");

-----------------------------
Oder in LabVIEW

siehe Bild im Anhang (Schreibt man COM1 statt LPT1, gehts auf die RS232)

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
Noch kein Account? Hier anmelden.