electron调用C#应用程序实现串口通信
2018-07-27 06:57:34来源:博客园 阅读 ()
最近转入零售行业开发了一系列产品,包含便利店收银软件、会员系统、供应链系统。为了追赶潮流,收银软件使用了electron平台开发,界面效果、开发效率确实不错;但是涉及到串口通讯时遇到了麻烦,electron不能直接使用node.js的串口模块。网上有一些文章推荐编译electron源码来实现串口模块的集成,向这条路走的过程中发现困难重重,尝试多次都没有成功,于是放弃。
经过一系列的google并测试后,终于通过调用第三方应用程序的方式实现:electron启动C#开发的程序、C#程序直接与串口通讯并将串口接收的内容返回给electron。经过一段时间使用,程序表现稳定,终于了却一桩心事。下面分享一下心得。
electron与串口的通信原理比较简单,分三步完成:
1. electron应用中启动命令行程序(c#实现),并监听命令行输出;
2. 从electron中给命令行发送指令;
3. 命令行程序打开串口,并监听串口返回与用户输入指令,实时将操作结果与串口输出到命令行;
electron中程序段:
const spawn = require('child_process').spawn, var childProcess = spawn('D:\\SerialPortDemo.exe', ['COM4',9600]); // 启动serialPortDemo.exe程序(C#开发),并传入两个参数:串口号与波特率; childProcess.stdout.on('data', (data) => { console.log(""+data); }); // 监听serialPortDemo.exe的输出,并将输出打印出来 // 让下方程序休眠一段时间后执行,可以看到C#的输出; setTimeout(function(){ childProcess.stdin.write('quit'); // 给C#程序输入'quit'命令 childProcess.stdin.end(); // 完成输入后必须调用end方法,否则C#程序无法监听到用户输入 }, 30000)
C#命令行程序段:
using System; using System.Collections.Generic; using System.IO.Ports; using System.Linq; using System.Text; using System.Threading; namespace SerialPortDemo { class Program { private static SerialPort _SerialPort = null; static void Main(string[] args) { _SerialPort = new SerialPort(args[0], int.Parse(args[1]), Parity.None, 8, StopBits.One); _SerialPort.DataReceived += _SerialPort_DataReceived; ThreadPool.QueueUserWorkItem(new WaitCallback(OpenPort), _SerialPort); // 新开线程打开串口,并监听接收数据 string command = string.Empty; while ((command = Console.ReadLine()) != string.Empty) // 主线程监听用户输入,根据输入内容判定下方流程 { Console.WriteLine(command); if (command == "close") { if (_SerialPort.IsOpen) { _SerialPort.Close(); } } else if (command == "quit") { if (_SerialPort.IsOpen) { _SerialPort.Close(); } return; } } } static void OpenPort(object paremeter) { if (!_SerialPort.IsOpen) { _SerialPort.Open(); } } private static void _SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { try { byte[] bytes = new byte[_SerialPort.BytesToRead]; _SerialPort.Read(bytes, 0, bytes.Length); string str = System.Text.Encoding.Default.GetString(bytes); Console.WriteLine(str); } catch (Exception ex) { Console.WriteLine(ex.Message); } } } }
注:C#程序中应当让串口的操作在子线程中进行,串口接收事件阻塞子线程;接收输入命令的操作在主线程中进行,并阻塞主线程;
下方是在收银软件中做的测试截图,从Console中可以看出能够实时显示从COM3串口来的数据。顺便打个广告:收银软件、会员系统、供应链系统均提供OEM,有兴趣的同学可以加微信联系: 18189279823;
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:Vue 常用指令
下一篇:一个小白的四次前端面试经历
- 根据分辨率调用css文件的方法 2020-03-19
- js调用刷新界面的几种方式 2020-03-05
- JavaScript 异步调用 2020-02-07
- 脚本调用样式的方法 2019-10-25
- 用 JSON 处理缓存 2019-09-30
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash