C#版及nodejs版的com端口监听程序

感受:

写监听程序的感受:原来有些事情并不是想象的那么难,难和简单就只在一个点上,一个点突破了,后面就豁然开朗了。所以有些问题,不能死闷,要先思考,然后查资料,然后问有经验的人。

最近写一个com端口监听程序,去读卡id,然后做相应的动作,写了两个版本的,一个是nodejs版本的,一个是C#版本的,两种语言都没有用过,通过一个上午的现学现卖,写出了一个初稿。程序写好了,发现只能读取部分卡的数据,并且读取的数据不是自己想要的,后来找了厂商的人,原来他们的波特率和我设置的不同,导致数据读取不同。这种问题果然要提前要一下各种硬件厂商的说明书,了解了他们的通信协议才能方便编程。

下面给出nodejs版和c#版的com端口监听程序。

node版:

var SerialPort = require("serialport").SerialPort;  //引入模块
var SlowBuffer = require('buffer').SlowBuffer;
var portName = 'COM3'; //定义串口名
var serialPort = new SerialPort(
 "COM3", {
   baudRate: 115200,  //波特率
   dataBits: 8,    //数据位
   parity: 'none',   //奇偶校验
   stopBits: 1,   //停止位
   flowControl: false 
}, false); 
serialPort.open(function(error){ 
   if(error){ 
     console.log("打开端口"+portName+"错误:"+error);
   }else{  
   	console.log("打开端口成功,正在监听数据中");
     serialPort.on('data',function(data){
		console.log(data);
		console.log(data.length);
		console.log(data[0]);
		console.log(Buffer.isBuffer(data));
     });
	 serialPort.write("ls\n",function(err,results){
		console.log('err:'+err);
		console.log('results:'+results);
	 });
   }
});

C#版

using System; //using 关键字的作用是导入命名空间
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.Ports;

namespace MyFirstApp  // namespace 命名空间
{
    public class SerialTest
    {
        //串口对象
        private SerialPort _Comm = null;

        //串口控件初始化
        public void Init()
        {
            _Comm = new SerialPort("COM3");
            //串口参数设定
            _Comm.BaudRate = 115200;
            _Comm.Parity = Parity.None; //Parity为C#预定义枚举型变量
            _Comm.DataBits = 8;
            _Comm.StopBits = StopBits.One; //StopBits为C#预定义的枚举量
            _Comm.Handshake = Handshake.None;
            _Comm.RtsEnable = true;
            _Comm.ReadBufferSize = 1024;
            _Comm.WriteBufferSize = 512;
            _Comm.DtrEnable = true;

            //为控件添加事件处理函数 
            _Comm.DataReceived +=
              new SerialDataReceivedEventHandler(CommDataReceived);
            _Comm.ReceivedBytesThreshold = 1;
            _Comm.Open();
            Console.WriteLine("Press any key to continue...");
            Console.WriteLine();
            Console.ReadKey();
        }

        //串口数据处理函数
        public void CommDataReceived
        (Object sender, SerialDataReceivedEventArgs e)
        {
          //Comm.BytesToRead中为要读入的字节长度
          int len = _Comm.BytesToRead;
          Console.WriteLine("len:"+len);
          Byte[] readBuffer = new Byte[len];
          _Comm.Read(readBuffer, 0, len); //将数据读入缓存
          //处理readBuffer中的数据
          foreach (Byte b in readBuffer)
          {
              Console.WriteLine("读到数据:"+b);
          }
          
        }
        public void Stop()
        {
            _Comm.Close();
        }
        static void Main(string[] args) // Main方法,程序入口  
        {
            SerialTest test = new SerialTest();
            test.Init();
            
        }  
    }

    
    
}

注意,一定注意参数的设置,有时候读取不到数据,很可能是参数设置的问题,比如BaudRate(波特率)最开始我设置为9600,死活读不到数据。后来联系厂商,那边通信是115200波特率,这才解决。

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页