自主研发串口转键盘输入程序源代码:支持串口设备数据转键盘输出、工厂自动化场景,封装Serial...

张开发
2026/4/5 10:47:46 15 分钟阅读

分享文章

自主研发串口转键盘输入程序源代码:支持串口设备数据转键盘输出、工厂自动化场景,封装Serial...
串口转键盘输入程序源代码全新自主研发可以实现串口设备接收的数据像键盘一样输出到其他应用上非常适合工厂自动化生产代码有备注封装了serialport类和配置文件类有技术指导程序可以设置数据输出时增加前缀后缀回车键换行可以输出16进制强制大写强制小写可以实现扫码计数并把计数作为前缀或者后缀可以实时测试串口设备接受到的数据 您需要掌握基本的C#代码了解winform设计架构有vs2019开发环境和有可以设置的串口扫码枪非常适合上位机项目帮楼下电子代工厂贴完第三板LED驱动理物料时真的被他们扫码枪的“半自动化录入”整emo了——扫一个SN码得敲三次机台号前缀空格加Tab然后回车换行再等ERP刷新下一行半小时扫三箱手都抖。回来抽了个周末灌了三罐橘子味快乐水搓了个全新的C# Winform串口转键盘小程序核心逻辑全自己敲的注释也标得细现在已经是他们ERP旁边的“救星工具盒”了。先给你们看最爽的实时测试面板和最常用的功能设置界面哦对直接上核心的封装类片段吧——别慌都是基本的C#先从SerialPort封装开始说省得你们每次打开工程都复制粘贴那串老掉牙的DataReceivedInvoke这个封装连异常挂掉重启的钩子都留了。//封装好的MySerialPort省得以后抄重复代码抄出bug public class MySerialPort : IDisposable { private SerialPort _port; //异常事件给主界面弹提示用的 public event Actionstring OnError; //数据接收事件直接给处理好的字符串或者byte[]数组 public event Actionstring OnStringReceived; public event Actionbyte[] OnBytesReceived; //构造函数直接传配置就行不用每次手动开属性框改波特率 public MySerialPort(SerialConfig config) { _port new SerialPort { PortName config.PortName, BaudRate config.BaudRate, DataBits config.DataBits, StopBits config.StopBits, Parity config.Parity, ReadTimeout 500, WriteTimeout 500 }; //DataReceived是跨线程的这个封装里直接帮你们用SendKeys.Send前的主线程处理 _port.DataReceived Port_DataReceived; _port.ErrorReceived Port_ErrorReceived; } //打开串口加了try-catch直接弹事件到主界面主界面只需要写个MessageBox.Show就行 public bool OpenPort() { try { if (!_port.IsOpen) _port.Open(); return true; } catch (Exception ex) { OnError?.Invoke($打开串口失败{ex.Message}); return false; } } //这里是小代工厂的朋友后来提的需求扫码枪突然被拔了工具盒要自动弹提示等插回去点一下“重试串口” //钩子很简单ErrorReceived里加个判断ErrorCode是PortDisconnected private void Port_ErrorReceived(object sender, SerialErrorReceivedEventArgs e) { if (e.EventType SerialError.PortDisconnected) { OnError?.Invoke(扫码枪/串口设备被拔出请检查连接); //自动关一下避免下次打开报错 ClosePort(); } else OnError?.Invoke($串口发生错误{e.EventType}); } private void Port_DataReceived(object sender, SerialDataReceivedEventArgs e) { try { //延迟一点点有些扫码枪可能扫出来分两次发加个10ms没问题 Thread.Sleep(10); byte[] buffer new byte[_port.BytesToRead]; _port.Read(buffer, 0, buffer.Length); //触发原始byte[]事件 OnBytesReceived?.Invoke(buffer); //转成默认UTF-8字符串后续可以在主界面加编码选择对吧小工具盒暂时先留个注释 string data Encoding.UTF8.GetString(buffer); //这里的TrimEnd是去掉扫码枪默认可能带的不可见字符具体看你们的枪不用的话可以删掉 data data.TrimEnd(\r, \n); OnStringReceived?.Invoke(data); } catch (Exception ex) { OnError?.Invoke($接收数据失败{ex.Message}); } } //剩下的关闭、释放资源这些自己补全就行都是常规操作 //... }代码没什么太玄乎的封装的意义就是下次你再写什么串口上位机转LED屏、转打印机或者只是存数据直接new个MySerialPort传配置就行不用管线程安全、不用管异常重开的小提示。然后配置文件类也别写老掉牙的app.config手动改XML了小工具盒用的是Newtonsoft.Json对就是宇宙第一Json库谁用谁香主界面里的机台号前缀、回车换行、16进制这些设置保存之后直接生成个SerialToolConfig.json在exe目录下下次双击打开自动加载不用让代工厂的小姑娘每次手动敲一遍机台号。配置类的代码更简单public class SerialToolConfig { //串口配置直接嵌套就行 public SerialConfig PortConfig { get; set; } new SerialConfig(); //机台号前缀默认是A01楼下小代工厂有12台机 public string Prefix { get; set; } A01; //后缀默认是回车楼下ERP要再加个换行没关系加个复选框组合 public bool AddEnter { get; set; } true; public bool AddNewLine { get; set; } false; //强制16、强制大小三个复选框互斥或者可选楼下要强制SN码全大写我选了三个可选有时候调试需要转小写 public bool ForceHex { get; set; } false; public bool ForceUpper { get; set; } true; public bool ForceLower { get; set; } false; //扫码计数这个是代工厂经理追加的需求每天统计每台机扫了多少个SN不用每天下班查Excel了 public int ScanCount { get; set; } 0; //计数放前缀还是后缀 public bool CountIsPrefix { get; set; } false; } //嵌套的串口基本配置波特率默认9600大部分扫码枪都是这个 public class SerialConfig { public string PortName { get; set; } COM3; public int BaudRate { get; set; } 9600; public int DataBits { get; set; } 8; public StopBits StopBits { get; set; } StopBits.One; public Parity Parity { get; set; } Parity.None; }接下来就是主界面的核心逻辑了——接收到MySerialPort传来的字符串之后怎么处理成想要的样子然后用SendKeys.SendWait发给当前激活的窗口ERP、记事本、Excel都可以双击扫枪的瞬间记得鼠标点一下录入框哦这个暂时没法自动激活窗口除非是工厂专属的上位机软件那就简单了直接用Windows API FindWindowSetForegroundWindow。串口转键盘输入程序源代码全新自主研发可以实现串口设备接收的数据像键盘一样输出到其他应用上非常适合工厂自动化生产代码有备注封装了serialport类和配置文件类有技术指导程序可以设置数据输出时增加前缀后缀回车键换行可以输出16进制强制大写强制小写可以实现扫码计数并把计数作为前缀或者后缀可以实时测试串口设备接受到的数据 您需要掌握基本的C#代码了解winform设计架构有vs2019开发环境和有可以设置的串口扫码枪非常适合上位机项目实时测试面板就是个多行TextBox每次接收到数据直接AppendText就行颜色可以区分原始数据是黑色处理后的是绿色异常提示是红色看着舒服。哦对了强制16进制的处理也提一下如果勾选了ForceHex就把刚才封装里OnBytesReceived传来的原始byte[]数组转成十六进制字符串中间要不要加空格楼下不要那就ToString(X2)拼起来就行。扫码计数的逻辑更简单每次接收到非空的数据因为TrimEnd过了排除不小心碰了串口线传过来的空字符串ScanCount然后保存到Json文件里下次打开自动续上。现在这个小程序已经在楼下代工厂用了两周了扫码效率提升了大概3倍小姑娘不用再敲到手抖经理不用再每天查SN码的数量皆大欢喜。对了最后提醒一下开发环境用VS2019及以上就行Newtonsoft.Json直接在NuGet里搜一下安装扫码枪最好能自己设置波特率、数据位这些如果不行就默认9600 8N1就行大部分枪的默认配置都是这个。

更多文章