electron調用C#應用程序實現串口通訊

最近轉入零售行業開發了一系列產品,包含便利店收銀軟件會員系統供應鏈系統。爲了追趕潮流,收銀軟件使用了electron平臺開發,界面效果、開發效率確實不錯;可是涉及到串口通信時遇到了麻煩,electron不能直接使用node.js的串口模塊。網上有一些文章推薦編譯electron源碼來實現串口模塊的集成,向這條路走的過程當中發現困難重重,嘗試屢次都沒有成功,因而放棄。node

通過一系列的google並測試後,終於經過調用第三方應用程序的方式實現:electron啓動C#開發的程序、C#程序直接與串口通信並將串口接收的內容返回給electron。通過一段時間使用,程序表現穩定,終於了卻一樁心事。下面分享一下心得。c#

electron與串口的通訊原理比較簡單,分三步完成:微信

1. electron應用中啓動命令行程序(c#實現),並監聽命令行輸出;electron

2. 從electron中給命令行發送指令;測試

3. 命令行程序打開串口,並監聽串口返回與用戶輸入指令,實時將操做結果與串口輸出到命令行;ui

 

electron中程序段:google

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#命令行程序段:spa

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;線程

 

相關文章
相關標籤/搜索