Ansteuern eines USB-Geräts



  • Hi!

    Ich habe bisher einen Thermodrucker über eine serielle Schnittstelle angesteuert, d.h. ich weiß genau, welche Bytefolgen ich ihm schicken muss, damit er das tut, was ich möchte.

    Da nun die serielle Schnittstelle so langsam am Aussterben ist und die Thermodrucker vermehrt auch USB anbieten, möchte ich auf USB umsteigen.

    Jetzt ist die Frage, wie programmiert man sowas.

    Ich habe schon den Winapi-FAQ-Beitrag gelesen. Dort wird das Gerät über "\\\.\\usbuart_0" angesprochen. Woher weiß ich denn diesen Namen? Kann ich den irgendwie rausbekommen?

    Gibt es vielleicht Winapi-Funktionen, die mir weiterhelfen? Für SetupDiEnumDeviceInterfaces() brauche ich erstens eine GUID, die ich nicht weiß, und zweitens ist der Drucker kein HID-Gerät, sodass diese Funktionen ja eigentlich gar nicht dafür funktionieren, oder?



  • warp schrieb:

    Dort wird das Gerät über "\\\.\\usbuart_0" angesprochen. Woher weiß ich denn diesen Namen? Kann ich den irgendwie rausbekommen?

    Das ist der Name eines vom Treiber angelegten Links. Diese Namen ersiehst Du aus der Dokumentation des zugehörigen Treibers. Eben so, wie Du den Namen des Links zur seriellen Schnittstelle ("\\\.\\COMx") oder auch des USB Host Controllers ("\\\.\\HCDx") aus der Dokumentation des Tribers erlesen kannst.

    Allerdings ist mir der Sinn des Unterfangens nicht ganz einsichtig. Warum willst Du unbedingt mit dem Gerät selbst sprechen? Warum behandelst Du den Drucker nicht als Drucker und bedienst ihn auf dem herkömmlichen Wege?

    warp schrieb:

    Für SetupDiEnumDeviceInterfaces() brauche ich erstens eine GUID, die ich nicht weiß, und zweitens ist der Drucker kein HID-Gerät, sodass diese Funktionen ja eigentlich gar nicht dafür funktionieren, oder?

    SetupDiEnumDeviceInterfaces beschränkt sich natürlich nicht auf HIDs. Aber solange Du nichtmal weisst, mit welcher Schnittstelle du arbeiten möchtest, nützt Dir die Funktion tatsächlich nichts.

    Irgendwie habe ich das Gefühl, daß Du USB-Geräte mit einem seriellen Gerät vergleichst. Das geht so nicht. Ein einfaches Umhersenden von Bytes, wie Du es von der seriellen Schnittstelle kennst, ist per USB nicht möglich.



  • Danke für deine Antwort.

    Sinn der Sache:
    Ich möchte den Drucker aus Performancegründen direkt ansprechen. Der Hersteller liefert natürlich einen echten Windows-Druckertreiber, über den man ganz normal auf ihm drucken könnte. Leider baut der Windows-Druckertreiber das Druckbild im Speicher auf und überträgt es als Bild zum Drucker.
    Diese Drucker sind aber wesentlich intelligenter: Es gibt Befehle mit denen man dem Drucker sagen kann, er soll an Position (x/y) den Text "blahblah" mit der Schriftgröße n drucken. Ähnlich gehts mit Barcodes, Linien, usw. Dadurch muss man nur ganz wenige Bytes zum Drucker übertragen.
    Drucklayouts können auch im Drucker abgespeichert werden, so dass für einen Druck bloß die Texte übertragen werden müssen, die sich ändern.

    Irgendwie habe ich das Gefühl, daß Du USB-Geräte mit einem seriellen Gerät vergleichst. Das geht so nicht. Ein einfaches Umhersenden von Bytes, wie Du es von der seriellen Schnittstelle kennst, ist per USB nicht möglich.

    Du liegst schon nicht falsch mit deiner Einschätzung. Da ich leider noch ein paar grundlegende Fragen zur Herangehensweise habe, habe ich diesen Thread auch im "Rund um die Programmierung"-Bereich gepostet. 😉
    Es ist ganz einfach so, dass diese Drucker sowohl serielle als auch USB-Anschlüsse haben. Und deshalb gehe ich einfach davon aus, dass ich es ähnlich machen kann.
    Natürlich weiß ich, dass an einem USB-Anschluss mehrere Geräte hängen können und ich deshalb irgendwie meinen Drucker adressieren muss. Aber wie gesagt: Da mir das alles noch nicht so richtig klar ist, frage ich ja auch.
    Vielleicht könnte mich mal jemand in die richtige Richtung weisen. Aber bitte kleine allgemeinen Links wie usb.org oder lvr.com.



  • warp schrieb:

    Sinn der Sache:

    Aha. Und Du gewinnst tatsächlich soviel Performance, daß sich das lohnt? Beim nächstbesten Druckerwechsel machst Du eine lange Nase, so wie jetzt gerade. Mir persönlich ist es immer lieber, wenn ich mich nicht direkt an irgendwelche Hardware binde. Aber gut, meine Meinung wird Dich in diesem Fall nicht sonderlich interessieren. 😉

    warp schrieb:

    Natürlich weiß ich, dass an einem USB-Anschluss mehrere Geräte hängen können und ich deshalb irgendwie meinen Drucker adressieren muss. Aber wie gesagt: Da mir das alles noch nicht so richtig klar ist, frage ich ja auch.
    Vielleicht könnte mich mal jemand in die richtige Richtung weisen. Aber bitte kleine allgemeinen Links wie usb.org oder lvr.com.

    Du mußt Dir so oder so erstmal über USB im Klaren sein. Ein wirklich klasse Buch zum Thema gibt es von Jan Axelson, das Handbuch für Entwickler. Wenn Du keine Lust zu lesen hast, kannst Du Dir auch das Werk "Universal Serial Bus System Architecture" besorgen. Auf der beigelegten CD hast Du noch 1.5h Video, indem der Autor über den Bus erzählt.

    Dann kannst Du Dich mit dem DDK auseinandersetzen und Dir einen Treiber für den Drucker basteln. Als Start kann das Sample bulkusb herhalten. Und dann kannst Du nur hoffen, daß Dich der Hersteller des Druckers auch mit den nötigen Informationen versorgt ...



  • Ja, Performance ist extrem wichtig. Das sind Drucker für Label/Etiketten ca. der Größe 10cm x 20cm, die auf Pakete geklebt werden. Bei den schnellen Druckern komme ich mit der seriellen Ansteuerung (COMx) auf fast 3 Label pro Sekunde. Wenn ich nur eine 1/10 Sekunde pro Label langsamer werde, bekomme ich von meinem Chef vorgerechnet, wieviel Label weniger pro Stunde verarbeitet werden können 😉
    Ja, ich muss für jeden Druckerhersteller eine andere Ansteuerung programmieren, aber so viele Hersteller gibt es nicht.

    Ich habe mir jetzt mal das "Handbuch für Entwickler" bestellt und werde erstmal lesen.

    Danke King!



  • Da fallen mir gerade die Funktionen OpenPrinter, WritePrinter und ClosePrinter auf. Wenn ich das richtig verstehe, kannst Du damit Daten direkt an den Drucker senden. Vielleicht ist das was. Selber probiert habe ich das allerdings noch nicht.

    Das Buch lohnt sich aber trotzdem. 😉


Anmelden zum Antworten