ich bin neu hier und muss gleich mal eine sehr Software-lastige Frage stellen: Kennt sich jemand mit der Programmierung der bidirektionalen Kommunikation von EPSON-Druckern aus?
Es geht darum, dass ich in einem eigenen Programm all die Statusinformationen eines EPSON Stylus Pro 4800 anzeigen möchte, die auch der Statusmonitor anzeigt. Das ist z.B. die verbleibende Tintenmenge pro Patrone oder der Füllstand des Wartungstanks. Ich weiss, dass ich die Statusinformationen per Escape-Kommandos abfragen kann, genau so wie ich z.B. den Düsentest (nozzle check) ausführen kann.
Soweit, sogut. Ich kann zwar Kommandos an den Drucker senden, die er auch ausführt (Düsentest), bekomme aber keinerlei Antworten zurück (Füllstand der Tinten), stattdessen bekomme ich nur eine Fehlermeldung.
Hier meine Vorgehensweise mit Quellcode (C/C++):
char printer_cmd[1025];
int bufpos = 0;
//exit packet mode
char hdr[] = "\000\000\000\033\001@EJL 1284.4\n@EJL\n\033@";
memcpy(printer_cmd + bufpos, hdr, sizeof(hdr) - 1);
bufpos += sizeof(hdr) - 1;
//Druckeranschluss als Steam öffnen
fd = _open("\\\\rechner\\drucker", O_RDWR, 0666);
//remote mode aktivieren
char remote_hdr[] = "\033@\033(R\010\000\000REMOTE1";
memcpy(printer_cmd+bufpos, remote_hdr, sizeof(remote_hdr)-1);
bufpos += sizeof(remote_hdr) - 1;
//tintenstandabfrage zusammenstellen
char ink_cmd[] = "IQ\001\000\001";
memcpy(printer_cmd+bufpos, ink_cmd, sizeof(ink_cmd)-1);
bufpos += sizeof(ink_cmd) - 1;
//remote-mode abschließen
char remote_end[] = "\033\000\000\000";
memcpy(printer_cmd+bufpos, remote_end, sizeof(remote_end)-1);
bufpos += sizeof(remote_end) - 1;
//anfrage an drucker senden
write(fd, printer_cmd, bufpos);
//buffer leeren da jetzt hier die empfangsdaten rein sollen
memset(buf, 0, bufsize);
//antwort lesen
int status = _read(fd, buf, bufsize - 1);
...
Mein genaues Problem besteht jetzt darin, dass die letzte Zeile (int status = _read(fd, buf, bufsize - 1);) immer einen Lesefehler bringt. status ist immer -1 und die erweiterte Fehlerinformation sagt, das ich ein falsches Argument angegeben habe (EINVAL).
Kann es sein, dass ich von der USB-Schnittstelle unter WindowsXP nicht lesen kann oder woher kommt die Fehlermeldung?
Danke
René