2017-02-10 74 views
9

我正在使用以下代碼在Epson TM-T20上使用Epson ePOS SDK for iOSSDK打印某些內容。問題是該應用程序只打印一次。應用程序必須重新啓動才能重新打印。代碼有什麼問題?iOS僅使用Epos2打印機打印一次

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) 

儘管在文檔中使用,使用printer?.disconnect()使得應用程序凍結,所以我不得不把它註釋掉。

如果您想查看API文檔,請在the SDK's download內部查看PDF。

更新基於答案更新的代碼(應用程序仍然凍結):

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

無論我叫斷開(),它總是凍結的應用程序。如果我不使用它,打印機似乎被應用程序佔用,以致在我之後沒有其他人可以打印幾分鐘。 – Linus

回答

1

我使用了Yun Chen和rjcruz提供的類似代碼。我的打印機也是Epson TM-T20。我發現,disconnect()函數本身會讓我的應用程序凍結,無論它放在哪裏。唯一的工作解決方案是避免斷開連接()。所以爲了避免凍結,你可以嘗試rjcruz提供的代碼,只要去掉disconnect()函數。 希望這有助於!

示例代碼:

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

這正是我需要的解決方案。 – Linus

2

根據SDK iOS的演示,斷開動作應該是在一個子線程,然後你可以避免應用程序被凍結。我猜想在disconnect()函數被成功調用後,它將能夠打印多次。

嘗試(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

感謝您的回答,但應用程序仍然以這種方式凍結。 – Linus

+0

請顯示您的更新代碼。 –

+0

我用更新後的代碼更新了我的問題。 – Linus

2

我有同樣的問題,你必須實現Epos2PtrReceiveDelegate和使用onPtrReceive符合它的協議,包括打印機該委託內部斷路。

下面是一個代碼示例:

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

4

我有同樣的問題,你必須實現Epos2PtrReceiveDelegate,並符合使用onPtrReceive,幷包括其協議斷開該代表內部的打印機。

以下是樣本:

希望它能幫助你!

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

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

    } 

乾杯!

+0

感謝您的回答。那麼是否只能在委託方法內部使用斷開連接?如果不是異步使用它不是一個問題嗎? – Linus

+0

是的兄弟,你不需要異步方法,因爲在你正確實現委託之後,它總是在sendData完成時被調用。因此,在該代表中,您可以斷開當前的打印機對象,以便下一次再次調用打印機時它將生成一個新的打印機對象。 – rjcruz

+0

這非常有啓發性,非常感謝解釋!我會盡快嘗試。 – Linus

3

供將來參考。

請參閱示例代碼:

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)) 

     } 
    } 

} 

這裏實現委託方法

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) 
     }) 


} 

乾杯!

+0

我注意到你在委託消息onPtrReceive中發送消息printerObj。請注意,Epson SDK文檔明確表示此時不會發送消息。我派出一個塊供以後執行。 –

+0

在我的情況下,我面臨的一個問題是,從右側收到的不是打印整個問題。它的一點點修剪在紙和仍然紙從兩邊有空間。我的收據是紙面的中心。所以請幫助我@DavidH –