ESC/POS Printer (z.B. Epson)

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • ESC/POS Printer (z.B. Epson)

    Hi,

    ich habe da vielleicht einen spezial Fall und hoffe das hier wieder ein paar schlaue Köpfe sind die mehr davon verstehen als ich derzeit.
    Ich verwende für eine App diesen "Treiber" github.com/KevinGong2013/Printer für einen Epson ESC/POS Drucker. Dieser macht nichts anderes als einen Bestell Bon auszudrucken. Der Drucker ist per LAN angeschlossen und der Druck kommt von einem iPad über WLAN.
    (Wenn man keinen ECS/POS Drucker hat, kann man das hiermit testen: github.com/dacduong/escpos-printer-simulator)

    Ich habe es mir nun soweit zurecht gefummelt das es zu 99,9% korrekt läuft aber ich habe noch 2 Probleme:

    1. Manchmal kommt ein Bon doppelt heraus, obwohl ich immer nur einmal einen Druck los sende.
      Das ist meine Funktion die aufgerufen wird sobald ich den die Daten für den Bon zusammen habe

    Quellcode

    1. func sendPrint(bon:Receipt, casenumber:Int64) {
    2. let printerIP = UserDefaults.standard.string(forKey: "printeripadress_preference") ?? ""
    3. let printerPort = UserDefaults.standard.string(forKey: "printerport_preference") ?? ""
    4. let host:NWEndpoint.Host = .init(printerIP)
    5. let port:NWEndpoint.Port = .init(integerLiteral: UInt16(printerPort) ?? 9100)
    6. let tcp = NWProtocolTCP.Options.init()
    7. tcp.noDelay = true
    8. let params = NWParameters.init(tls: nil, tcp: tcp)
    9. let connection = NWConnection(to: NWEndpoint.hostPort(host: host, port: port), using: params)
    10. connection.stateUpdateHandler = { newState in
    11. switch newState {
    12. case .ready:
    13. print("[MyDebug] Socket State: Ready")
    14. print("[MyDebug] send data")
    15. let content: Data = Data(bon.data)
    16. connection.send(content: content, contentContext: .defaultMessage, completion: NWConnection.SendCompletion.contentProcessed(({ NWError in
    17. if (NWError == nil) {
    18. print("[MyDebug] Data was sent to TCP destination ")
    19. connection.cancel()
    20. } else {
    21. print("[MyDebug] ERROR! Error when data (Type: Data) sending. NWError: \n \(NWError!)")
    22. }
    23. })))
    24. case .failed(let error):
    25. print("[MyDebug] Fatal connection error", error.localizedDescription)
    26. default:
    27. break
    28. }
    29. }
    30. connection.start(queue: DispatchQueue.main)
    31. markCheckInAsPrinted(casenumber: casenumber)
    32. }
    Alles anzeigen
    Ich vermute, da es sich hier um einen asynchronen Aufruf handelt (stimmt das?), das manchmal die Laufzeit zu lange ist und evtl. der Netzwerkstack den Druck noch mal los sendet (kann das sein??)

    2. Ich würde gerne den Bon mehrzeilig dynamisch zusammen bauen, je nach dem ob jemand 1 oder 2 oder 15 Essen bestellt hat. Derzeit ist es so, das ich dem Bon 15 Zeilen hinzufügen müsste und die mit keinem Text füllen müsste um dies hinzubekommen, da ich nicht weiß wie ich bei der Erstellung des Bon eine Schleife eingebaut bekomme
    Derzeit sieht meine Funktion dazu so aus:

    Quellcode

    1. let bon = Receipt(.init(maxWidthDensity: 500, fontDensity: 12, encoding: .windowsCP1252))
    2. bon <<~ .style(.clear)
    3. <<~ .style(.initialize)
    4. <<~ .style(.selectPrintMode(.doubleHeight))
    5. <<~ .style(.selectsCharacterFont(.a))
    6. <<~ .layout(.justification(.center))
    7. <<~ .page(.printAndFeed(lines: 5))
    8. <<< Dividing.default()
    9. <<~ .page(.printAndFeed(lines: 1))
    10. <<< "\(date)"
    11. <<~ .page(.printAndFeed(lines: 1))
    12. <<< Dividing.default()
    13. <<~ .page(.printAndFeed(lines: 1))
    14. <<~ .style(.emphasis(enable: true))
    15. <<< umlautConverter(text: specialDiet)
    16. <<< umlautConverter(text: note[i])
    17. <<~ .style(.emphasis(enable: false))
    18. <<~ .page(.printAndFeed(lines: 2))
    19. <<~ .style(.underlineMode(.enable2dot))
    20. <<< KVItem("Menue", "Dessert")
    21. <<~ .style(.clear)
    22. <<~ .style(.selectPrintMode(.doubleHeight))
    23. <<~ .style(.selectsCharacterFont(.a))
    24. <<~ .layout(.justification(.center))
    25. <<< KVItem("\(menuDecoder(from: menu[i]))", boolEncoder(value: dessert[i]))
    26. <<~ .page(.printAndFeed(lines: 1))
    27. <<< Dividing.default()
    28. <<~ .page(.printAndFeed(lines: 1))
    29. <<~ .style(.emphasis(enable: true))
    30. <<< umlautConverter(text: name)
    31. <<~ .style(.emphasis(enable: false))
    32. <<~ .page(.printAndFeed(lines: 10))
    33. <<~ .style(.clear)
    34. <<~ .page(.partialCut)
    35. sendPrint(bon: bon, casenumber: casenumber)
    Alles anzeigen

    Sobald ich hier eine Schleife einbaue gibts eine Fehlermeldung. Ich verstehe auch nicht was dieses "<<~" und "<<-" und "<<<" machen. Nach ersten Recherchen geht es hier um irgenwelche Bits die hin und hergeschoben werden. Das ist mir aber ehrlich gesagt zu hoch.

    Ich hoffe sehr, das das jemand mehr versteht als ich und mir einen guten Rat geben kann.

    Grüße

    Dirk
  • Neu

    Qvex23 schrieb:

    Ich verstehe auch nicht was dieses "<<~" und "<<-" und "<<<" machen. Nach ersten Recherchen geht es hier um irgenwelche Bits die hin und hergeschoben werden. Das ist mir aber ehrlich gesagt zu hoch.
    Kann es sein, dass Du dich da etwas vertan hast? - Die Operation <<< usw. gehören zur Klasse Receipt. Guck mal in den Source Code: Receipt.swift. - Das nichts mit Bitmanipulation zu tun.