2017-02-10 28 views
9

'u kullanarak bir kez yazdırıyor Epson TM-T20 üzerinde Epson ePOS SDK for iOSSDK kullanarak bir şey yazdırmak için aşağıdaki kodu kullanıyorum. Sorun, uygulamanın sadece bir kez basmasıdır. Yeniden basabilmek için uygulamanın yeniden başlatılması gerekiyor. Kodun nesi var? printer?.disconnect() kullanarak belgelerinde kullanılan rağmeniOS yalnızca bir kez Epos2Printer

printer = Epos2Printer(printerSeries: 2, lang: 1) 
    printer?.setReceiveEventDelegate(self) 
    printer?.addText("text") 

    printer!.connect("TCP:192.168.1.185", timeout:Int(EPOS2_PARAM_DEFAULT)) 
    printer!.beginTransaction() 

    printer?.sendData(Int(EPOS2_PARAM_DEFAULT)) 
    printer?.endTransaction() 
    // printer?.disconnect() 
    printer?.clearCommandBuffer() 
    printer?.setReceiveEventDelegate(nil) 

, uygulama donma yapar, bu yüzden dışarı yorum gerekiyordu.

API belgelerine göz atmak isterseniz, the SDK's download'un içinde bir PDF bulunmaktadır.

Güncelleme: Yanıta göre güncellenmiş kodu (app hala donar): SDK iOS demo göre

func printReceipt() { 
    var printer: Epos2Printer? 
    printer = Epos2Printer(printerSeries: 2, lang: 1) 
    if printer == nil { 
     print(“Printer not found!! 11") 
    } 
    printer?.setReceiveEventDelegate(self) 

    printer?.addTextFont(2) 
    printer?.addTextSize(1, height: 1) 
    printer?.addText(“My Text") 
    printer?.addFeedUnit(10) 
    printer?.addCut(0) 

    var result: Int = Int(EPOS2_SUCCESS.rawValue) 

    result = Int(printer!.connect("TCP:192.168.1.185", timeout:Int(EPOS2_PARAM_DEFAULT))); 
    result = Int(printer!.beginTransaction()) 

    printer?.sendData(Int(EPOS2_PARAM_DEFAULT)) 

    DispatchQueue.global(qos: DispatchQoS.QoSClass.default).async { 
     printer?.clearCommandBuffer() 
     printer?.setReceiveEventDelegate(nil) 
     printer?.endTransaction() 
     printer?.disconnect() 
     printer = nil; 
    } 
    } 
+0

olursa olsun), her zaman uygulamayı donar. Kullanmazsam, yazıcı uygulama tarafından işgal edilmiş gibi görünüyor, böylece kimse benden sonra birkaç dakika basamaz. – Linus

cevap

1

Yun Chen ve rjcruz tarafından sağlanan benzer bir kodu kullanıyorum. Yazıcım da bir Epson TM-T20. Bulunduğum yer, disconnect() işlevinin kendi içinde nerede yerleştirilirse bulunsun uygulamanızı donduruyor.Tek çalışan çözüm, bağlantıyı kesmekten() tamamen kaçınmak olmuştur. Yani donma önlemek için, sadece disconnect() işlevi kaldırıldı rjcruz tarafından sağlanan kodu deneyebilirsiniz. Umarım bu yardımcı olur!

örnek kod: Ben kesme (call

func print() { 
     printer = Epos2Printer(printerSeries: 2, lang: 1) 
     printer?.setReceiveEventDelegate(self) 
      printer?.addTextSize(2, height: 2) 
      printer?.addText("My text")    
      printer?.addFeedUnit(10) 
      printer?.addCut(0) 
     printer!.connect("TCP:192.168.1.185", timeout:Int(EPOS2_PARAM_DEFAULT)) 
     printer!.beginTransaction() 
     printer?.sendData(Int(EPOS2_PARAM_DEFAULT)) 
} 

public func onPtrReceive(_ printerObj: Epos2Printer!, code: Int32, status: Epos2PrinterStatusInfo!, printJobId: String!) { 
      printer?.clearCommandBuffer() 
      printer?.setReceiveEventDelegate(nil) 
      printer?.endTransaction() 
} 
+0

Bu tam olarak ihtiyacım olan çözüm. – Linus

2

, bağlantı kesme eylemi ardından, bir alt iplik olmalıdır uygulamanın dondurulmasını engelleyebilirsiniz. Kesinti() işlevinin başarıyla çağrılmasından sonra bir kereden fazla yazdırılabileceğini tahmin ediyorum.

deneyin (swift3):

DispatchQueue.global(qos: DispatchQoS.QoSClass.default).async { 
    printer?.endTransaction() 
    printer?.disconnect() 

    DispatchQueue.main.async { 
     //Do UI updating work in Main thread, like enable Print button again. 
    } 
} 
+0

Cevabınız için teşekkürler, ancak uygulama hala bu şekilde donuyor. – Linus

+0

Lütfen güncel kodunuzu gösterin. –

+0

Sorunuzu güncellenmiş kodla güncelledim. – Linus

2

Sana Epos2PtrReceiveDelegate uygulamak zorunda, aynı sorunu vardı ve onPtrReceive kullanarak protokole uyan ve bu temsilci içine yazıcının çikmasini içerir . İşte

bir kod örneği:

public func onPtrReceive(_ printerObj: Epos2Printer!, code: Int32, status: Epos2PrinterStatusInfo!, printJobId: String!) { 
 
     
 
    printerObj.endTransaction() 
 
    printerObj.disconnect() 
 
    printerObj.clearCommandBuffer() 
 
    printerObj.setReceiveEventDelegate(nil) 
 
}

4

Ben aynı sorunu var, Epos2PtrReceiveDelegate uygulamak zorunda ve onPtrReceive ve şunları içerir kullanarak protokole uyan Yazıcının o delege içindeki bağlantısı kesiliyor.

o size yardımcı olacaktır Umut:

İşte örnek vardır!

public func onPtrReceive(_ printerObj: Epos2Printer!, code: Int32, status: Epos2PrinterStatusInfo!, printJobId: String!) { 

     printerObj.endTransaction() 
     printerObj.disconnect() 
     printerObj.clearCommandBuffer() 
     printerObj.setReceiveEventDelegate(nil) 

    } 

Cheers!

+0

Cevabınız için teşekkür ederiz. Yani sadece delege yönteminin içindeki bağlantıyı kesmek mümkün mü? Ve o zaman uyumsuz olarak kullanmak için bir sorun değil mi? – Linus

+0

Evet kardeşim, eşzamansız yönteme ihtiyacınız yoktur, çünkü temsilci uygun şekilde uygulandıktan sonra sendData bittiğinde her zaman çağrılır. Bu nedenle, bu temsilci içinde mevcut yazıcı nesnesinin bağlantısını kesebilirsiniz, böylece bir dahaki sefere tekrar yazıcıyı aradığınızda yeni bir yazıcı nesnesi üretecektir. – rjcruz

+0

Bu çok aydınlatıcı, açıklama için çok teşekkürler! En kısa zamanda deneyeceğim. – Linus

3

Gelecekte başvurmak için.

örnek kod bakın:

class ReportsViewController: UIViewController, Epos2PtrReceiveDelegate { 

    func printReport() { 

     let header = printer_model.getReportHeader() 
     let content = printer_model.getReportContent() 

     printer = Epos2Printer(printerSeries: EPOS2_TM_T88.rawValue, lang: EPOS2_MODEL_ANK.rawValue) 

     printer!.setReceiveEventDelegate(self) 

     printer!.addFeedLine(1) 

     printer!.addTextFont(1) 
     printer!.addTextAlign(1) 

     let logoData = UIImage(named: "logo.png") 

     printer!.add(logoData!, x: 0, y:0, 
        width:Int(logoData!.size.width), 
        height:Int(logoData!.size.height), 
        color:EPOS2_COLOR_1.rawValue, 
        mode:EPOS2_MODE_MONO.rawValue, 
        halftone:EPOS2_HALFTONE_DITHER.rawValue, 
        brightness:Double(EPOS2_PARAM_DEFAULT), 
        compress:EPOS2_COMPRESS_AUTO.rawValue) 

     printer!.addText("\n") 
     printer!.addText(header) 
     printer!.addText(content) 
     printer!.addText(constants.PRINTER_LINE) 

     printer!.addFeedLine(1) 

     printer!.addCut(EPOS2_CUT_FEED.rawValue) 

     let status = printer!.connect("TCP:\(PRINTER_IP_ADDRESS)", timeout: PRINTER_TIMEOUT) 

     if status != 0 { 

      // error 
      // handle your logic here if you cannot connect to the printer 

      self.printerErrorPrompt() 

     } else { 

      // send your data to the printer 

      printer!.beginTransaction() 
      printer!.sendData(Int(EPOS2_PARAM_DEFAULT)) 

     } 
    } 

} 

burada uygulamak temsilci yöntemi

public func onPtrReceive(_ printerObj: Epos2Printer!, code: Int32, status: Epos2PrinterStatusInfo!, printJobId: String!) { 
     DispatchQueue.global(qos: DispatchQoS.QoSClass.default).async(execute: { 
      printerObj.endTransaction() 
      printerObj.disconnect() 
      printerObj.clearCommandBuffer() 
      printerObj.setReceiveEventDelegate(nil) 
     }) 


} 

Şerefe!

+0

YazıcımObj'ı, PrnReceive üzerindeki delege iletisinde mesajlaştığınızı görüyorum. Epson SDK belgelerinin açık bir şekilde şu anda ileti göndermediğini bildirdiğine dikkat edin. Daha sonra yürütmek için bir blok gönderirim. –

+0

Benim durumumda, sağ taraftaki makbuzun tamamını basmama sorunuyla karşılaşıyorum. kağıdın içindeki ufak tefek ve hala kağıdın her iki yanından boşluk var. makbuz aldım kağıt merkezidir. lütfen bana yardım edin @DavidH –

İlgili konular