如何检测热敏打印机是否已从COM端口断开连接?

时间:2019-06-12 04:16:13

标签: c# winforms printing serial-port escpos

我正在尝试使用使用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事件,但也没有起作用。

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

1 个答案:

答案 0 :(得分:1)

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

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

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

  • 在正常情况下,CTS和DSR信号都打开。

  • 当无法进行如下打印时,CTS&DSR信号为OFF。

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

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:错误状态