using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; namespace PTMedicalInsurance.Business.MetalKeyboard.JustTideEPP { /// /// JustTide 金属密码键盘驱动接口封装类 /// public class JustTideEPPDrv { // 指定 DLL 名称(确保 DLL 在程序运行目录或系统路径中) private const string DllName = "JustTideEPPDrv.dll"; // =================================================================== // 5.1.1 OpenCom - 打开串口 // =================================================================== /// /// 打开通讯端口,使键盘可以进行通讯。 /// /// 串口号:1=COM1, 2=COM2, ..., 9=COM9 /// 波特率:4800, 9600, 19200, 57600, 115200 /// 成功返回 0,否则返回 -2 [DllImport(DllName, CallingConvention = CallingConvention.StdCall)] public static extern short OpenCom(short iPort, int lBaud); // long 在 C# 中对应 int (32位) // =================================================================== // 5.1.2 CloseCom - 关闭串口 // =================================================================== /// /// 关闭通讯端口,停止对键盘的通讯。 /// /// 成功返回 0,否则返回错误码 [DllImport(DllName, CallingConvention = CallingConvention.StdCall)] public static extern short CloseCom(); // =================================================================== // 5.1.3 PinInitialization - 密码键盘初始化 // =================================================================== /// /// 初始化密码键盘。 /// /// /// 初始化模式: /// 0: 初始化键盘,不清除密钥 /// 1: 初始化键盘,清除所有密钥,恢复出厂设置 /// /// 成功返回 0,否则返回错误码 [DllImport(DllName, CallingConvention = CallingConvention.StdCall)] public static extern short PinInitialization(short iInitMode); // =================================================================== // 5.1.4 PinReadVersion - 读取版本信息 // =================================================================== /// /// 读取密码键盘的版本信息、序列号和描述代码。 /// /// 输出:版本信息 (16 字节 ASCII) /// 输出:生产序列号 (8 字节 BCD + 4 字节填充或芯片编号) /// 输出:描述代码 (2 字节,如充电时间) /// 成功返回 0,否则返回错误码 [DllImport(DllName, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)] public static extern short PinReadVersion( [Out] StringBuilder cpVersion, [Out] StringBuilder cpSN, [Out] StringBuilder cpRechang); // =================================================================== // 可选:定义返回值常量(根据文档补充) // =================================================================== public const short SUCCESS = 0; public const short ERROR_OPEN_COM = -2; // 注意:实际错误码需参考“函数返回表”(文档中未提供完整表) /// /// 发送多功能控制命令(开关键盘、声音、设置模式等) /// /// 控制命令值(详见文档 CTL 表) /// 成功返回 0,否则返回错误码 [DllImport(DllName, CallingConvention = CallingConvention.StdCall)] public static extern short OpenKeyVoic(short iValue); // =================================================================== // 便捷方法 // =================================================================== /// /// 开启键盘(带声音) /// public static short EnableKeyboard() => OpenKeyVoic((short)KeyControlCommand.TurnOnKeyboardAndSound); /// /// 关闭键盘(静音) /// public static short DisableKeyboard() => OpenKeyVoic((short)KeyControlCommand.TurnOffKeyboardAndSound); /// /// 打开夜视灯(如支持) /// public static short TurnOnNightLight() => OpenKeyVoic((short)KeyControlCommand.TurnOnNightVisionLight); /// /// 关闭夜视灯(如支持) /// public static short TurnOffNightLight() => OpenKeyVoic((short)KeyControlCommand.TurnOffNightVisionLight); /// /// 设置通信编码模式:0-9加30H, A-F加37H /// public static short SetHexEncoding() => OpenKeyVoic((short)KeyControlCommand.CommEncodingHex37H); /// /// 从密码键盘接收一个按键字符(阻塞式,带超时) /// /// 输出:接收到的字符(ASCII) /// 超时时间(毫秒) /// 成功返回 0;超时或错误返回非 0 值 [DllImport(DllName, CallingConvention = CallingConvention.StdCall)] public static extern short PinReportPressed(ref char cpKey, short iTimeOut); } // =================================================================== // 枚举:常用控制命令(便于使用) // =================================================================== public enum KeyControlCommand : short { /// /// 关闭键盘 + 关闭蜂鸣声(非固化) /// TurnOffKeyboardAndSound = 0x00, /// /// 打开键盘 + 关闭蜂鸣声(非固化) /// TurnOnKeyboardMuteSound = 0x01, /// /// 关闭键盘 + 打开蜂鸣声(非固化) /// TurnOffKeyboardOnlySound = 0x02, /// /// 打开键盘 + 打开蜂鸣声(非固化,正常模式) /// TurnOnKeyboardAndSound = 0x03, /// /// IC卡使用 02 头命令(固化,默认) /// ICCardUse02Header = 0x04, /// /// IC卡使用 ESC(1B) 头命令(固化) /// ICCardUseEscHeader = 0x05, /// /// 打开夜视灯(非固化,需硬件支持) /// TurnOnNightVisionLight = 0x06, /// /// 关闭夜视灯(非固化,需硬件支持) /// TurnOffNightVisionLight = 0x07, /// /// 命令尾不加 03h(固化) /// CommandTailNo03 = 0x08, /// /// 命令尾加 03h(固化) /// CommandTailWith03 = 0x09, /// /// 更正键:删除所有已输入字符(固化,默认) /// CorrectKeyDeleteAll = 0x14, // 20 /// /// 更正键:删除一个字符(固化) /// CorrectKeyDeleteOne = 0x15, // 21 /// /// 通信:拆分后全加 30H(固化) /// CommEncodingAdd30H = 0x1E, // 30 /// /// 通信:0-9加30H, A-F加37H(固化) /// CommEncodingHex37H = 0x25, // 37 // 波特率设置(0x41 ~ 0x48) SetBaudRate1200 = 0x41, SetBaudRate2400 = 0x42, SetBaudRate4800 = 0x43, SetBaudRate9600 = 0x44, SetBaudRate19200 = 0x45, SetBaudRate38400 = 0x46, SetBaudRate57600 = 0x47, SetBaudRate115200 = 0x48, } }