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

How to detect if thermal printer has been disconnected from com port?

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

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

第一,opening/closing串口每次打印过程都是浪费时间,还是不做为好。

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

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

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

  • 无法进行如下打印时,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:错误状态