最近转入零售行业开发了一系列产品,包含便利店收银软件会员系统供应链系统。为了追赶潮流,收银软件使用了electron平台开发,界面效果、开发效率确实不错;但是涉及到串口通讯时遇到了麻烦,electron不能直接使用node.js的串口模块。网上有一些文章推荐编译electron源码来实现串口模块的集成,向这条路走的过程中发现困难重重,尝试多次都没有成功,于是放弃。

经过一系列的google并测试后,终于通过调用第三方应用程序的方式实现:electron启动C#开发的程序、C#程序直接与串口通讯并将串口接收的内容返回给electron。经过一段时间使用,程序表现稳定,终于了却一桩心事。下面分享一下心得。

electron与串口的通信原理比较简单,分三步完成:

1. electron应用中启动命令行程序(c#实现),并监听命令行输出;

2. 从electron中给命令行发送指令;

3. 命令行程序打开串口,并监听串口返回与用户输入指令,实时将操作结果与串口输出到命令行;

electron中程序段:

  1. const spawn = require('child_process').spawn,
  2. var childProcess = spawn('D:\\SerialPortDemo.exe', ['COM4',9600]); // 启动serialPortDemo.exe程序(C#开发),并传入两个参数:串口号与波特率;
  3. childProcess.stdout.on('data', (data) => { console.log(""+data); }); // 监听serialPortDemo.exe的输出,并将输出打印出来
  4.  
  5. // 让下方程序休眠一段时间后执行,可以看到C#的输出;
  6. setTimeout(function(){
  7. childProcess.stdin.write('quit'); // 给C#程序输入'quit'命令
  8. childProcess.stdin.end(); // 完成输入后必须调用end方法,否则C#程序无法监听到用户输入
  9. }, 30000)

C#命令行程序段:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO.Ports;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading;
  7.  
  8. namespace SerialPortDemo
  9. {
  10. class Program
  11. {
  12. private static SerialPort _SerialPort = null;
  13. static void Main(string[] args)
  14. {
  15. _SerialPort = new SerialPort(args[], int.Parse(args[]), Parity.None, , StopBits.One);
  16. _SerialPort.DataReceived += _SerialPort_DataReceived;
  17.  
  18. ThreadPool.QueueUserWorkItem(new WaitCallback(OpenPort), _SerialPort); // 新开线程打开串口,并监听接收数据
  19.  
  20. string command = string.Empty;
  21. while ((command = Console.ReadLine()) != string.Empty) // 主线程监听用户输入,根据输入内容判定下方流程
  22. {
  23. Console.WriteLine(command);
  24. if (command == "close")
  25. {
  26. if (_SerialPort.IsOpen)
  27. {
  28. _SerialPort.Close();
  29. }
  30. }
  31. else if (command == "quit")
  32. {
  33. if (_SerialPort.IsOpen)
  34. {
  35. _SerialPort.Close();
  36. }
  37.  
  38. return;
  39. }
  40. }
  41.  
  42. }
  43.  
  44. static void OpenPort(object paremeter)
  45. {
  46. if (!_SerialPort.IsOpen)
  47. {
  48. _SerialPort.Open();
  49. }
  50. }
  51.  
  52. private static void _SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
  53. {
  54. try
  55. {
  56. byte[] bytes = new byte[_SerialPort.BytesToRead];
  57. _SerialPort.Read(bytes, , bytes.Length);
  58. string str = System.Text.Encoding.Default.GetString(bytes);
  59. Console.WriteLine(str);
  60. }
  61. catch (Exception ex)
  62. {
  63. Console.WriteLine(ex.Message);
  64. }
  65. }
  66. }
  67. }

注:C#程序中应当让串口的操作在子线程中进行,串口接收事件阻塞子线程;接收输入命令的操作在主线程中进行,并阻塞主线程;

下方是在收银软件中做的测试截图,从Console中可以看出能够实时显示从COM3串口来的数据。顺便打个广告:收银软件、会员系统、供应链系统均提供OEM,有兴趣的同学可以加微信联系: 18189279823;

 

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#串口通信程序实现无感知签到与答题

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

  3. 记一次串口通信调试,慎用SerialPort.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#_串口通信_SerialPort_一个最基础的串口程序

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

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

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

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

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

随机推荐

  1. Codeforces Round #403 (Div. 2, based on Technocup 2017 Finals)A模拟 B三分 C dfs D map

    A. Andryusha and Socks time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  2. STL中的map和unordered_map

    STL中的map和unordered_map map 头文件:#include 原理:std::map的内部实现了一颗红黑树,有对其键值进行排序的功能,所以map是一个有序的容器,map中的每一个元素 ...

  3. 元类编程-- 实现orm,以django Model为例

    # 需求 import numbers class Field: pass class IntField(Field): # 数据描述符 def __init__(self, db_column, m ...

  4. ZOJ3229 Shoot the Bullet [未AC]

    Time Limit: 2 Seconds      Memory Limit: 32768 KB      Special Judge Gensokyo is a world which exist ...

  5. poj 2104 可持久化线段树

    我们先离散化,然后根据权值建立线段树,假设我们现在有一颗权值线段树,表示在区间1-n中每个数出现了几次,那么我们可以二分的求出来这个区间的k大值,类似sbt的select操作,那么因为点的权值插入是无 ...

  6. js_判断当前页面是否有网络和网络连接超时

    2018-04-12 方法一:通过navigator.onLine属性判断,返回true为有联网状态,false为断网状态. //方法一 if(navigator.onLine) { console. ...

  7. 某labs上传writeup-上传漏洞总结

    github:https://github.com/d0ef/upload-labs 第一题:通过JS判断的直接抓包改了就ok. 第二题:只要Content-Type信息为图片的就可以 第三题:通过上 ...

  8. deepin 快捷键

    从此脱离鼠标

  9. 关于解决coursera视频缓冲问题

    关于解决coursera视频缓冲问题 之前使用coursera,不FQ的话,视频根本加载不出来,于是每次都FQ过去看的视频.后来发现可以直接修改hosts就可以了. 以下方法来源知乎的回答(侵删). ...

  10. Laravel 5.2 三、中间件、视图与 Blade 模板引擎

    一.中间件 Laravel 的 HTTP 中间件提供了对路由的一层过滤和保护.下面模拟一下用中间件验证后台登录. 1. 创建中间件 cmd 窗口进入项目目录,使用 artisan 命令创建 php a ...