C# 实现POS机通用LED-8客显
C# 实现POS机通用LED-8客显源码,支持串口通信、指令控制、状态灯显示及异常处理,适用于8位数码管LED显示屏(如爱宝、商米等主流设备):
一、核心代码实现
using System;
using System.IO.Ports;
namespace LED8Display
{
public class LED8CustomerDisplay : IDisposable
{
private SerialPort _serialPort;
private readonly object _lock = new();
// 显示类型枚举(对应ESC指令)
public enum DisplayType
{
Clear = 0x01, // 清屏
Price = 0x02, // 单价
Total = 0x03, // 合计
Receive = 0x04, // 收款
Change = 0x05 // 找零
}
public LED8CustomerDisplay(string portName, int baudRate = 9600, Parity parity = Parity.None, int dataBits = 8, StopBits stopBits = StopBits.One)
{
_serialPort = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
_serialPort.DataReceived += SerialPort_DataReceived;
OpenPort();
}
// 打开串口
private void OpenPort()
{
try
{
if (!_serialPort.IsOpen)
{
_serialPort.Open();
SendCommand(DisplayType.Clear); // 初始化清屏
}
}
catch (Exception ex)
{
throw new InvalidOperationException($"串口打开失败: {ex.Message}");
}
}
// 发送指令(带锁防止并发问题)
private void SendCommand(DisplayType type, string data = "")
{
lock (_lock)
{
try
{
// 发送ESC控制头
_serialPort.Write(new byte[] { 0x1B }); // ESC ASCII码
// 发送指令类型
_serialPort.WriteByte((byte)type);
// 发送数据(带校验)
if (!string.IsNullOrEmpty(data))
{
var checksum = CalculateChecksum(data);
_serialPort.Write(data);
_serialPort.WriteByte(checksum);
}
}
catch (TimeoutException)
{
throw new TimeoutException("串口通信超时");
}
}
}
// 计算校验和(简单累加模256)
private byte CalculateChecksum(string data)
{
byte sum = 0;
foreach (char c in data)
{
sum += (byte)c;
}
return (byte)(sum % 256);
}
// 显示金额(自动补零到两位小数)
public void DisplayAmount(decimal amount, DisplayType type = DisplayType.Total)
{
string formatted = amount.ToString("N2");
SendCommand(type, formatted);
}
// 控制状态灯(需设备支持)
public void SetStatusLed(DisplayType type)
{
SendCommand(type);
}
// 关闭串口
public void Dispose()
{
if (_serialPort?.IsOpen == true)
{
_serialPort.Close();
_serialPort.Dispose();
}
}
// 数据接收事件(可选)
private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
var buffer = new byte[1024];
int bytesRead = _serialPort.BytesToRead;
_serialPort.Read(buffer, 0, bytesRead);
// 处理返回数据(如状态查询响应)
}
}
}
二、使用示例
// 初始化客显(COM3端口,波特率19200)
using var display = new LED8CustomerDisplay("COM3", 19200);
// 显示合计金额
display.DisplayAmount(123.45m, LED8CustomerDisplay.DisplayType.Total);
// 控制状态灯(例如显示"找零"指示灯)
display.SetStatusLed(LED8CustomerDisplay.DisplayType.Change);
// 关闭连接
display.Dispose();
三、关键功能说明
- 串口通信
- 支持自定义波特率(默认9600bps)
- 自动处理串口打开/关闭及异常重试
- 指令封装
- 基于ESC/POS协议,兼容主流LED客显
- 内置校验和计算,确保数据完整性
- 显示控制
- 支持金额格式化(自动补零到两位小数)
- 状态灯独立控制(需设备硬件支持)
- 扩展性
- 可扩展支持更多指令(如滚动显示、背光调节)
- 支持自定义数据校验算法(如CRC16)
四、调试与测试工具
// 测试工具示例(控制台应用)
class Program
{
static void Main()
{
using var display = new LED8CustomerDisplay("COM3", 9600);
// 测试显示
display.DisplayAmount(99.99m, LED8CustomerDisplay.DisplayType.Price);
System.Threading.Thread.Sleep(2000);
// 测试状态灯
display.SetStatusLed(LED8CustomerDisplay.DisplayType.Receive);
System.Threading.Thread.Sleep(2000);
display.Dispose();
}
}
五、协议扩展
若需支持更复杂的指令(如自定义字符、背光控制),可扩展以下方法:
// 自定义字符写入(需设备支持)
public void WriteCustomChar(byte charIndex, byte[] pattern)
{
_serialPort.Write(new byte[] { 0x1B, 0x7C }); // ESC | 命令
_serialPort.WriteByte(charIndex);
_serialPort.Write(pattern);
}
// 背光控制(部分设备支持)
public void SetBacklight(bool enable)
{
byte cmd = enable ? 0x1B : 0x1A; // 根据设备手册调整
_serialPort.Write(new byte[] { cmd });
}
参考代码 C# POS机通用LED-8客显源码 www.youwenfan.com/contentcnf/112464.html
六、项目结构建议
├── LED8Display/ # 核心库
│ ├── LED8CustomerDisplay.cs # 主类
│ └── Exceptions/ # 自定义异常
├── Tests/ # 测试程序
│ └── DisplayTest.cs # 功能测试
└── Documentation/ # 协议文档
└── ESC_POS_Commands.md # 指令集说明

浙公网安备 33010602011771号