本篇内容介绍了“C#串口通信工具类的封装方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

1、SerialPortHelper串口工具类封装

usingSystem;usingSystem.Collections.Generic;usingSystem.IO.Ports;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Timers;namespacepublic.Util{///<summary>///串口操作助手类///</summary>classSerialPortHelper{///<summary>///串口是否已打开///</summary>publicboolIsOpen{get;set;}///<summary>///初始化串行端口资源///</summary>privateSerialPortmySerialPort=newSerialPort();///<summary>///串口接收数据位置///</summary>privatestaticintpSerialPortRecv=0;///<summary>///缓存区大小的长度///缓冲区可调大///(接收数据处理定时器内接收数据量小于下面设置的值即可)///</summary>privatestaticintbyteLength=40960;///<summary>///串口接收字节缓存区大小///</summary>privatebyte[]byteSerialPortRecv=newbyte[byteLength];///<summary>///串口接收数据处理定时器///</summary>privateTimerSerialPortRecvTimer;///<summary>///广播收到的数据事件///</summary>publiceventEventHandler<SerialPortRecvEventArgs>ReceivedDataEvent;///<summary>///广播收到的数据///</summary>publicclassSerialPortRecvEventArgs:EventArgs{///<summary>///广播收到的串口数据///</summary>publicreadonlybyte[]RecvData=newbyte[byteLength];///<summary>///收到数据的长度///</summary>publicreadonlyintRecvDataLength;///<summary>///将收到的数据转化成待广播的数据///</summary>publicSerialPortRecvEventArgs(byte[]recvData,intrecvDataLength){recvData.CopyTo(RecvData,0);RecvDataLength=recvDataLength;}}///<summary>///初始化///</summary>publicSerialPortHelper(){IsOpen=false;}///<summary>///设置串口配置///</summary>///<paramname="portName">串口号</param>///<paramname="baudRate">波特率</param>///<paramname="parity">校验位</param>///<paramname="dataBits">数据位</param>///<paramname="stopBits">停止位</param>privatevoidSetSerialPortConfig(stringportName,intbaudRate,intparity,intdataBits,intstopBits){//串口参数设置mySerialPort.PortName=portName;mySerialPort.BaudRate=baudRate;switch(parity){case0:default:mySerialPort.Parity=Parity.None;break;case1:mySerialPort.Parity=Parity.Odd;break;case2:mySerialPort.Parity=Parity.Even;break;case3:mySerialPort.Parity=Parity.Mark;break;case4:mySerialPort.Parity=Parity.Space;break;}mySerialPort.DataBits=((4<dataBits)&&(dataBits<9))?dataBits:8;switch(stopBits){case0:mySerialPort.StopBits=StopBits.None;break;case1:default:mySerialPort.StopBits=StopBits.One;break;case2:mySerialPort.StopBits=StopBits.OnePointFive;break;case3:mySerialPort.StopBits=StopBits.Two;break;}mySerialPort.ReadTimeout=-1;mySerialPort.RtsEnable=true;mySerialPort.DataReceived+=newSerialDataReceivedEventHandler(DataReceived);//串口接收数据处理定时器参数设置SerialPortRecvTimer=newSystem.Timers.Timer();SerialPortRecvTimer.Interval=100;SerialPortRecvTimer.AutoReset=false;SerialPortRecvTimer.Elapsed+=newElapsedEventHandler(SPRecvTimer_Tick);}///<summary>///打开串口///</summary>///<paramname="portName">串口号</param>///<paramname="baudRate">波特率</param>///<paramname="parity">校验位</param>///<paramname="dataBits">数据位</param>///<paramname="stopBits">停止位</param>publicvoidOpenSerialPort(stringportName,intbaudRate,intparity,intdataBits,intstopBits){try{SetSerialPortConfig(portName,baudRate,parity,dataBits,stopBits);mySerialPort.Open();IsOpen=true;}catch(System.Exception){IsOpen=false;throw;}}///<summary>///关闭串口///</summary>publicvoidCloseSerialPort(){try{mySerialPort.Close();IsOpen=false;}catch(System.Exception){IsOpen=false;throw;}}///<summary>///串口数据发送///</summary>///<paramname="content">byte类型数据</param>publicvoidSendData(byte[]content){try{mySerialPort.Write(content,0,content.Length);}catch(System.Exception){throw;}}///<summary>///串口数据发送///</summary>///<paramname="strContent">字符串数据</param>///<paramname="encoding">编码规则</param>publicvoidSendData(stringstrContent,Encodingencoding){try{byte[]content=encoding.GetBytes(strContent);mySerialPort.Write(content,0,content.Length);}catch(System.Exception){throw;}}///<summary>///数据处理定时器///定时检查缓冲区是否有数据,如果有数据则将数据处理并广播。///</summary>///<paramname="sender"></param>///<paramname="e"></param>privatevoidSPRecvTimer_Tick(objectsender,EventArgse){byte[]TemporaryData=newbyte[byteLength];intTemporaryDataLength=0;if(ReceivedDataEvent!=null){byteSerialPortRecv.CopyTo(TemporaryData,0);TemporaryDataLength=pSerialPortRecv;ReceivedDataEvent.Invoke(this,newSerialPortRecvEventArgs(TemporaryData,TemporaryDataLength));//数据处理完后,将指针指向数据头,等待接收新的数据pSerialPortRecv=0;}}///<summary>///数据接收事件///串口收到数据后,关闭定时器,将收到的数据填入缓冲区,数据填入完毕后,开启定时器,等待下一次数据接收///</summary>///<paramname="sender"></param>///<paramname="e"></param>privatevoidDataReceived(objectsender,SerialDataReceivedEventArgse){try{SerialPortRecvTimer.Stop();byte[]ReadBuf=newbyte[mySerialPort.BytesToRead];mySerialPort.Read(ReadBuf,0,ReadBuf.Length);ReadBuf.CopyTo(byteSerialPortRecv,pSerialPortRecv);pSerialPortRecv+=ReadBuf.Length;SerialPortRecvTimer.Start();}catch(System.Exception){throw;}}///<summary>///获取当前可用PortName///</summary>///<returns></returns>publicstaticList<SerialPortParam<string>>GetPortList(){try{List<SerialPortParam<string>>lst_sParameterClass=newList<SerialPortParam<string>>();foreach(stringdatainSerialPort.GetPortNames()){SerialPortParam<string>i_sParameterClass=newSerialPortParam<string>();i_sParameterClass.Name=data;i_sParameterClass.Value=data;lst_sParameterClass.Add(i_sParameterClass);}returnlst_sParameterClass;}catch(Exception){throw;}}///<summary>///设置波特率///</summary>///<returns></returns>publicstaticList<SerialPortParam<int>>SetBaudRateValues(){try{List<SerialPortParam<int>>lst_sParameterClass=newList<SerialPortParam<int>>();foreach(SerialPortBaudRatesrateinEnum.GetValues(typeof(SerialPortBaudRates))){SerialPortParam<int>i_sParameterClass=newSerialPortParam<int>();i_sParameterClass.Name=((int)rate).ToString();i_sParameterClass.Value=(int)rate;lst_sParameterClass.Add(i_sParameterClass);}returnlst_sParameterClass;}catch(Exception){throw;}}}///<summary>///设置串口助手参数类,如:波特率///</summary>publicclassSerialPortParam<T>{///<summary>///显示值///</summary>stringname;///<summary>///显示值///</summary>publicstringName{get{returnname;}set{name=value;}}///<summary>///值///</summary>Tvalue;///<summary>///值///</summary>publicTValue{get{returnthis.value;}set{this.value=value;}}}///<summary>///串口波特率列表。///75,110,150,300,600,1200,2400,4800,9600,14400,19200,28800,38400,56000,57600,///115200,128000,230400,256000///</summary>publicenumSerialPortBaudRates{BaudRate_75=75,BaudRate_110=110,BaudRate_150=150,BaudRate_300=300,BaudRate_600=600,BaudRate_1200=1200,BaudRate_2400=2400,BaudRate_4800=4800,BaudRate_9600=9600,BaudRate_14400=14400,BaudRate_19200=19200,BaudRate_28800=28800,BaudRate_38400=38400,BaudRate_56000=56000,BaudRate_57600=57600,BaudRate_115200=115200,BaudRate_128000=128000,BaudRate_230400=230400,BaudRate_256000=256000}}

2、串工工具类的使用方法:

//模拟一个点击事件SerialPortHelperserialPortHelper=newSerialPortHelper();privatevoidbutton1_Click(objectsender,EventArgse){serialPortHelper.OpenSerialPort("COM2"/*串口号*/,115200/*波特率*/,0/*校验位*/,8/*数据位*/,1/*停止位*/);//订阅事件可以放在Form_Load中或者其他函数中,但必须执行serialPortHelper.ReceivedDataEvent+=newEventHandler<SerialPortHelper.SerialPortRecvEventArgs>(serialPortHelper_ReceivedDataEvent);serialPortHelper.SendData(newbyte[]{0x0D});//sendserialPortHelper.CloseSerialPort();//close}///<summary>///接收串口数据///</summary>///<paramname="sender"></param>///<paramname="args"></param>privatevoidserialPortHelper_ReceivedDataEvent(objectsender,SerialPortHelper.SerialPortRecvEventArgsargs){//数据内容Console.Write(args.RecvData);//数据长度Console.Write(args.RecvDataLength);}

“C#串口通信工具类的封装方法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!