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();

三、关键功能说明

  1. 串口通信
    • 支持自定义波特率(默认9600bps)
    • 自动处理串口打开/关闭及异常重试
  2. 指令封装
    • 基于ESC/POS协议,兼容主流LED客显
    • 内置校验和计算,确保数据完整性
  3. 显示控制
    • 支持金额格式化(自动补零到两位小数)
    • 状态灯独立控制(需设备硬件支持)
  4. 扩展性
    • 可扩展支持更多指令(如滚动显示、背光调节)
    • 支持自定义数据校验算法(如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   # 指令集说明
posted @ 2025-09-04 11:52  我是一只小小鸟~  阅读(45)  评论(0)    收藏  举报