串口转键盘输入程序源代码,全新自主研发,可以实现串口设备接收的数据像键盘一样输出到其他应用上
串口转键盘输入程序源代码,全新自主研发,可以实现串口设备接收的数据像键盘一样输出到其他应用上,非常适合工厂自动化生产代码有备注,封装了serialport类和配置文件类,有技术指导程序可以设置数据输出时增加前缀,后缀,回车键,换行,可以输出16进制,强制大写,强制小写,可以实现扫码计数,并把计数作为前缀或者后缀,可以实时测试串口设备接受到的数据。实时测试面板就是个多行TextBox,每次接收到数据
串口转键盘输入程序源代码,全新自主研发,可以实现串口设备接收的数据像键盘一样输出到其他应用上,非常适合工厂自动化生产代码有备注,封装了serialport类和配置文件类,有技术指导程序可以设置数据输出时增加前缀,后缀,回车键,换行,可以输出16进制,强制大写,强制小写,可以实现扫码计数,并把计数作为前缀或者后缀,可以实时测试串口设备接受到的数据 您需要掌握基本的C#代码,了解winform设计架构,有vs2019开发环境和有可以设置的串口扫码枪非常适合上位机项目
帮楼下电子代工厂贴完第三板LED驱动理物料时,真的被他们扫码枪的“半自动化录入”整emo了——扫一个SN码,得敲三次机台号前缀空格加Tab然后回车换行再等ERP刷新下一行,半小时扫三箱手都抖。回来抽了个周末灌了三罐橘子味快乐水,搓了个全新的C# Winform串口转键盘小程序,核心逻辑全自己敲的注释也标得细,现在已经是他们ERP旁边的“救星工具盒”了。

先给你们看最爽的实时测试面板和最常用的功能设置界面?哦对,直接上核心的封装类片段吧——别慌,都是基本的C#,先从SerialPort封装开始说,省得你们每次打开工程都复制粘贴那串老掉牙的DataReceived+Invoke,这个封装连异常挂掉重启的钩子都留了。
//封装好的MySerialPort,省得以后抄重复代码抄出bug
public class MySerialPort : IDisposable
{
private SerialPort _port;
//异常事件,给主界面弹提示用的
public event Action<string> OnError;
//数据接收事件,直接给处理好的字符串或者byte[]数组
public event Action<string> OnStringReceived;
public event Action<byte[]> 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 FindWindow+SetForegroundWindow)。
串口转键盘输入程序源代码,全新自主研发,可以实现串口设备接收的数据像键盘一样输出到其他应用上,非常适合工厂自动化生产代码有备注,封装了serialport类和配置文件类,有技术指导程序可以设置数据输出时增加前缀,后缀,回车键,换行,可以输出16进制,强制大写,强制小写,可以实现扫码计数,并把计数作为前缀或者后缀,可以实时测试串口设备接受到的数据 您需要掌握基本的C#代码,了解winform设计架构,有vs2019开发环境和有可以设置的串口扫码枪非常适合上位机项目

实时测试面板就是个多行TextBox,每次接收到数据直接AppendText就行,颜色可以区分:原始数据是黑色,处理后的是绿色,异常提示是红色,看着舒服。
哦对了,强制16进制的处理也提一下:如果勾选了ForceHex,就把刚才封装里OnBytesReceived传来的原始byte[]数组转成十六进制字符串,中间要不要加空格?楼下不要,那就ToString("X2")拼起来就行。

扫码计数的逻辑更简单:每次接收到非空的数据(因为TrimEnd过了,排除不小心碰了串口线传过来的空字符串),ScanCount++,然后保存到Json文件里,下次打开自动续上。
现在这个小程序已经在楼下代工厂用了两周了,扫码效率提升了大概3倍?小姑娘不用再敲到手抖,经理不用再每天查SN码的数量,皆大欢喜。

对了,最后提醒一下:开发环境用VS2019及以上就行,Newtonsoft.Json直接在NuGet里搜一下安装,扫码枪最好能自己设置波特率、数据位这些,如果不行就默认9600 8N1就行,大部分枪的默认配置都是这个。
更多推荐



所有评论(0)