从屏幕到纸带:收银系统的硬件集成实战

从屏幕到纸带:收银系统的硬件集成实战

老张的收银台上有四样东西:电脑、打印机、副屏、扫码枪。
以前,这四样东西各管各的。现在?收银员点一下"确认支付",四样东西同时响应。

01 小票:3秒自动出

支付成功后小票自动打印,支持58mm/80mm热敏打印机。ESC/POS指令直接发送,绕过Windows打印驱动。GBK编码兼容中文热敏打印机。

小票模板可在Web后台自定义(头部/底部/菜品样式/支付样式),实时预览。

跨平台打印策略

  • Windows:Win32 Spooler API(P/Invoke OpenPrinterWritePrinter
  • Linux/macOS:CUPS lp 命令

02 副屏:顾客看得清清楚楚

副屏状态机:Idle → Ordering → Paying → Paid → 自动5秒后回到Idle

状态 显示内容
待机 店铺名称 + “欢迎您” + 日期时间
点单中 实时菜品列表 + 合计金额
支付中 应付金额(大字体)
支付成功 “付款成功 ¥XX 元”,3秒后恢复待机

双模式:normal(文字信息)和 led(Canvas绘制7段数码管模拟LED)。

03 LED客显:8位数码管

通过SerialPort(COM1, 2400波特率, 8N1)控制物理LED客显。EPSON客显指令集兼容。

指令集:清屏、显示金额(8位右对齐)、亮度控制(4级)、硬件复位、隐藏/显示。

04 语音播报

平台 命令 语音
macOS say -v Tingting {text} 中文女声
Windows PowerShell SAPI.SpVoice.Speak() 系统默认中文语音

播报场景:收款成功、混合收款成功、收款失败、核销成功。异步执行,不阻塞UI。

05 技术实现:并行联动

var tasks = new List<Task>
{
    _printerService.PrintReceiptAsync(orderId),
    _secondaryScreenService.ShowPaidAsync(amount),
    _ledDisplayService?.DisplayAmountAsync(amount),
    _voiceService.SpeakPaymentSuccess(channel, amount),
};
await Task.WhenAll(tasks);

Task.WhenAll 并行触发所有硬件响应,任何一项失败不影响其他项。

06 总结

收银系统的硬件集成,不是"能不能做"的问题,而是"能不能同时做"的问题。小票、副屏、LED、语音——四个硬件,一个触发点,同时响应。

收银员做最少的操作,系统做最多的响应。


下期预告:《单机也安全:7个中间件守护的收银系统》