首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

雙熱敏打印機並行打印方案:串口/USB 雙通道 ESC/POS 指令發送

     編輯:程式設計綜合問答

硬件連接

  • 前台打印機 → COM3 (或 USB 虛擬串口 COM5)
  • 廚房打印機 → COM4 (或 USB 虛擬串口 COM6)
  • 驅動安裝後在「設備管理器 → 端口」確認端口號

軟件架構

public class DualPrinter {
    private SerialPort _frontPort, _kitchenPort;

    public void Init(string frontPortName, string kitchenPortName) {
        _frontPort = CreatePort(frontPortName);
        _kitchenPort = CreatePort(kitchenPortName);
    }

    private SerialPort CreatePort(string name) {
        var p = new SerialPort(name, 9600, Parity.None, 8, StopBits.One);
        p.Handshake = Handshake.RequestToSend; // 硬件流控
        p.Open();
        return p;
    }

    public void PrintBoth(byte[] frontCmd, byte[] kitchenCmd) {
        // 並行發送,互不阻塞
        Task.Run(() => _frontPort.Write(frontCmd, 0, frontCmd.Length));
        Task.Run(() => _kitchenPort.Write(kitchenCmd, 0, kitchenCmd.Length));
    }
}

ESC/POS 指令構建

// 前台小票
var front = new List();
front.AddRange(ESC_INIT);           // 初始化
front.AddRange(ESC_ALIGN_CENTER);
front.AddRange(Encoding.GetEncoding("GB18030").GetBytes("歡迎光臨\n"));
front.AddRange(ESC_ALIGN_LEFT);
front.AddRange(Encoding.GetEncoding("GB18030").GetBytes("商品A  10.00\n"));
front.AddRange(ESC_CUT_PAPER);      // 切紙

// 廚房單 (格式不同)
var kitchen = new List();
kitchen.AddRange(ESC_INIT);
kitchen.AddRange(Encoding.GetEncoding("GB18030").GetBytes("廚房單: 商品A x1\n"));
kitchen.AddRange(ESC_CUT_PAPER);

常見 ESC/POS 指令碼

功能指令 (十六進制)
初始化1B 40
置中1B 61 01
左對齊1B 61 00
切紙 (全切)1D 56 00
切紙 (半切)1D 56 01
開錢箱1B 70 00 19 FA

注意事項

  1. USB 打印機通常虛擬為串口,波特率 9600/115200 視具體型號
  2. 線長 > 5m 需用帶放大器的 USB 延長線或串口服務器
  3. 並發寫入時捕獲 IOException 重試/報警
  4. 定期發送 ESC @ 重置防止緩衝區卡死
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved