【问题标题】:How to detect if thermal printer has been disconnected from com port?如何检测热敏打印机是否已与 COM 端口断开连接?
【发布时间】:2019-06-12 04:16:13
【问题描述】:

我正在尝试使用使用 com 端口的热敏打印机进行打印。我想检测打印机是否连接。

我假设如果我尝试在不连接打印机的情况下运行尝试打印的代码,我会遇到某种错误。所以我使用了 try-catch 块。以下是我到目前为止所尝试的。

using System.IO.Ports;

private readonly SerialPort _printer = new SerialPort(Port, BaudRate, Parity, DataBits, Stopbits);

private void Print(string text)
        {            
            try
            {
                if (!_printer.IsOpen)
                    _printer.Open();               

                _printer.WriteLine(text);

                _printer.Close();
            }
            catch (Exception ex)
            {
                Logging.Log("PRINT ERROR: " + ex.Message);
            }            
        }

在大多数情况下,如果您在打印机断开连接的情况下尝试以编程方式打印,尝试打印的代码块将抛出错误。

但在这种情况下,代码的执行就像打印机已连接并且没有引发错误一样。

我也尝试过SerialPort.ErrorReceived 事件,但也没有用。

所以,我想知道是否有办法检测打印机的状态(无论是连接还是断开连接)。感谢您的帮助。

【问题讨论】:

  • Com 端口是一项古老的技术,它支持它所支持的东西,更可能你永远不会知道。
  • 嗯,在 PIN 5 (25-Pin) 或 Pin 8 (9-Pin) RS232 上有 CTS (Clear to Send) 信号。 但是硬件和驱动需要支持。那是“串行仿真”(即USB伪装成RS232)吗?在后一种情况下,可能根本不使用“PIN”。那你就不走运了。
  • 您可以使用轮询:定期发送命令(例如请求状态或其他内容)。如果 3 次重试后没有得到答案 - 它离线。 “代码块” - 另一个问题,你没有在某处设置超时。

标签: c# winforms printing serial-port escpos


【解决方案1】:

首先,每次打印过程打开/关闭串口都是浪费时间,最好不要这样做。

最好在启动应用程序时打开(POS?)并在退出时关闭。

硬件流控的设置使连接到串口的ESC/POS打印机能够区分在线/离线。
但是,这取决于您的打印机的规格,因此请检查详细信息。

  • 在正常情况下,CTS 和 DSR 信号都为 ON。

  • 当无法执行如下打印时,CTS & DSR 信号关闭。

    • 打印机未连接。
    • 纸张未放置。
    • 打印机盖打开。
    • 接收缓冲区已满。
    • 由于某些错误无法打印。

SerialPort.CtsHolding Property/SerialPort.DsrHolding Property

执行此操作的简单方法是在打印前检查上述信号。

更详细的,如果想知道CTS&DSR信号是否为OFF、未连接或因错误无法打印等,发送以下命令并查看响应即可.

如果没有响应,则可以确定没有连接。

对应页面为日文。
DLE EOT

DLE EOT n(n=2 或 3)
0x10 0x04 0x02 或 0x03

0x10 0x04 0x02 : 离线状态
0x10 0x04 0x03 : 错误状态

【讨论】:

  • 你好库尼夫。首先,感谢您的回答。我对串行通信和 COM 端口很陌生。我试图像你说的那样发送命令。但是打印机没有响应。我这样做是这样的:string DLE = "\u0010"; string EOT = "\u0004"; string num = "\u0002"; _printer.WriteLine(DLE + EOT + num); string rename = _printer.ReadLine(); Logging.Log("RESULT : " + rename); 但我没有得到打印机的任何响应。我是不是做错了什么?
  • 将命令定义为一个 3 字节的字节数组,并使用 Write 方法而不是 WriteLine 发送它。并且请不要通过 ReadLine 而是通过 1-byte Read 方法接收。
  • 谢谢库尼夫。有用!!我使用了SerialPort.DataReceived 事件并且能够从打印机获得响应。由此,我现在可以确定打印机是否已连接。非常感谢您的回答,库尼夫。你刚刚把我从几天的工作中解救了出来。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-04
  • 2016-12-01
  • 1970-01-01
  • 2018-11-18
相关资源
最近更新 更多