electron调用C#应用程序实现串口通信

时间:2022-10-10 08:25:41

最近转入零售行业开发了一系列产品,包含便利店收银软件会员系统供应链系统。为了追赶潮流,收银软件使用了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[], int.Parse(args[]), Parity.None, , 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, , 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;

electron调用C#应用程序实现串口通信

 

electron调用C#应用程序实现串口通信的更多相关文章

  1. C#中缓存的使用 ajax请求基于restFul的WebApi(post、get、delete、put) 让 .NET 更方便的导入导出 Excel .net core api +swagger(一个简单的入门demo 使用codefirst+mysql) C# 位运算详解 c# 交错数组 c# 数组协变 C# 添加Excel表单控件(Form Controls) C#串口通信程序

    C#中缓存的使用   缓存的概念及优缺点在这里就不多做介绍,主要介绍一下使用的方法. 1.在ASP.NET中页面缓存的使用方法简单,只需要在aspx页的顶部加上一句声明即可:  <%@ Outp ...

  2. C&num;串口通信程序实现无感知签到与答题

    最近公司项目上线,之前利用串口通讯实现校牌的无感知签到程序, 项目上线以后刚刚好有时间把之前的出现的问题做下记录,废话不多,直接到主题 串口介绍: 串行接口简称串口,也称串行通信接口或串行通讯接口(通 ...

  3. 记一次串口通信调试,慎用SerialPort&period;Close

    做项目是遇到了串口通信,真是遇到了一个大坑,不知道是微软的坑还是我的坑. 让我慢慢道来完整的经历. 项目中以前是vb 写的,是vb与vb 之间进行串口通信,现在改成C#和之前的vb程序进行串口通信. ...

  4. mfc 调用Windows的API函数实现同步异步串口通信(源码)

    在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信.串口通信方便易行,应用广泛. 一般情况下,工控机和各智能仪表通过RS485总线进行通信.RS485的通信方式是半 ...

  5. Qt编写串口通信程序全程图文解说

    (说明:我们的编程环境是windows xp下,在Qt Creator中进行,假设在Linux下或直接用源代码编写,程序稍有不同,请自己修改.) 在Qt中并没有特定的串口控制类,如今大部分人使用的是第 ...

  6. 转:Qt编写串口通信程序全程图文讲解

    转载:http://blog.csdn.net/yafeilinux/article/details/4717706  作者:yafeilinux (说明:我们的编程环境是windows xp下,在Q ...

  7. C&num;&lowbar;串口通信&lowbar;SerialPort&lowbar;一个最基础的串口程序

    一个最最基础的 串口通信 程序!!! 最近正在学c#_还不是很熟悉_只是有点java的基础 SerialPort类 的介绍 http://msdn.microsoft.com/zh-cn/librar ...

  8. Qt编写串口通信程序全程图文讲解 &period;

    在Qt中并没有特定的串口控制类,现在大部分人使用的是第三方写的qextserialport类,我们这里也是使用的该类.我们可以去 http://sourceforge.net/projects/qex ...

  9. 【转】Qt编写串口通信程序全程图文讲解

    本文章原创于www.yafeilinux.com 转载请注明出处. (说明:我们的编程环境是windows xp下,在Qt Creator中进行,如果在Linux下或直接用源码编写,程序稍有不同,请自 ...

随机推荐

  1. Amoeba for MySQL读写分离配置

    一.      安装和运行Amoeba 1. Amoeba for MySQL 架构: 2. 验证Java的安装Amoeba框架是基于Java SE1.5开发的,建议使用Java SE1.5以上的版本 ...

  2. Unity3D热更新全书-脚本&lpar;二&rpar; 两级分化

    上篇明确了我们探讨的脚本是什么:是写在文本文件里面的代码,可以作为资源加载,取得字符串再执行. 可是为什么世界上会有那么多的脚本?而其使用方法完全看起来不一样呢?这是因为每种脚本都有自己的定位,在不同 ...

  3. iOS之08-核心语法

    1.点语法 点语法( . )的本质还是方法调用, java中的点是访问成员变量, 在OC中直接访问成员变量的方式只有 -> p.age = ; // [p setAge:10] int a = ...

  4. django - get&lowbar;or&lowbar;create&lpar;&rpar; 使用提醒

    [omron - debug] user_id建表的时候,不能使用unique,因为一个用户,可能有多个product_id,相对应的是,get_or_create()中的查询参数,如果在建表中有un ...

  5. Mybatis源码之Statement处理器SimpleStatementHandler(四)

    SimpleStatementHandler就是使用基本的Statement来执行query.batch.update等操作,其实现还是比较简单的,当然在执行过程中会涉及keyGenerator和Re ...

  6. C语言复习---找出一个二维数组的鞍点

    前提: 求任意的一个m×n矩阵的鞍点——鞍点是指该位置上的元素在该行上为最大.在该列上为最小, 矩阵中可能没有鞍点,但最多只有一个鞍点. m.n(<=m<=.<=n<=)及矩阵 ...

  7. Android事件分发流程总结

    Action_Down 当按下一个控件,调用流程是Activity.dispatchTouchEvent -> ViewGroup.dispatchTouchEvent , 1.ViewGrou ...

  8. &period;NET开发人员遇到Maven

    由.NET转向Java开发,总是会带着.NET平台的一些概念和工具想着在对应的Java平台是否也有着相同的解决方案.第一次用Maven随手打开pom.xml,看着里面许多属性描述我的感觉就是这是一个M ...

  9. Qt&plus;QGIS二次开发:自定义类实现查询矢量数据的属性字段值&lpar;图查属性&rpar;

    在GIS领域,有两种重要的查询操作,图查属性和属性查图. 本文主要介绍如何在QGIS中通过从QgsMapToolIdentify中派生自定义类实现查询矢量数据的属性字段值(图查属性). 重点参考资料: ...

  10. python - selenium 2 升级到最新版本

    python - selenium 2 升级到最新版本 之前一直用的是selenium 2.48 .firefox36 而实际用户的浏览器可能都有自动更新功能,所以版本基本上是最新的.所以这次专门做了 ...