感受:
写监听程序的感受:原来有些事情并不是想象的那么难,难和简单就只在一个点上,一个点突破了,后面就豁然开朗了。所以有些问题,不能死闷,要先思考,然后查资料,然后问有经验的人。
最近写一个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波特率,这才解决。