硬件連接
- 前台打印機 → 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 |
注意事項
- USB 打印機通常虛擬為串口,波特率 9600/115200 視具體型號
- 線長 > 5m 需用帶放大器的 USB 延長線或串口服務器
- 並發寫入時捕獲
IOException 重試/報警
- 定期發送
ESC @ 重置防止緩衝區卡死