<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文範例為大家分享了C#串列埠通訊工具類的封裝程式碼,供大家參考,具體內容如下
1、SerialPortHelper串列埠工具類封裝
using System; using System.Collections.Generic; using System.IO.Ports; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Timers; namespace public.Util { /// <summary> /// 串列埠操作助手類 /// </summary> class SerialPortHelper { /// <summary> /// 串列埠是否已開啟 /// </summary> public bool IsOpen { get; set; } /// <summary> /// 初始化 串列埠資源 /// </summary> private SerialPort mySerialPort = new SerialPort(); /// <summary> /// 串列埠接收資料 位置 /// </summary> private static int pSerialPortRecv = 0; /// <summary> /// 快取區大小的長度 /// 緩衝區可調大 /// (接收資料處理定時器 內接收資料量 小於下面設定的值即可) /// </summary> private static int byteLength = 40960; /// <summary> /// 串列埠接收位元組 快取區大小 /// </summary> private byte[] byteSerialPortRecv = new byte[byteLength]; /// <summary> /// 串列埠 接收資料處理定時器 /// </summary> private Timer SerialPortRecvTimer; /// <summary> /// 廣播 收到的資料 事件 /// </summary> public event EventHandler<SerialPortRecvEventArgs> ReceivedDataEvent; /// <summary> /// 廣播 收到的資料 /// </summary> public class SerialPortRecvEventArgs : EventArgs { /// <summary> /// 廣播 收到的串列埠資料 /// </summary> public readonly byte[] RecvData = new byte[byteLength]; /// <summary> /// 收到資料 的 長度 /// </summary> public readonly int RecvDataLength; /// <summary> /// 將 收到的資料 轉化成 待廣播的資料 /// </summary> public SerialPortRecvEventArgs(byte[] recvData, int recvDataLength) { recvData.CopyTo(RecvData, 0); RecvDataLength = recvDataLength; } } /// <summary> /// 初始化 /// </summary> public SerialPortHelper() { IsOpen = false; } /// <summary> /// 設定 串列埠設定 /// </summary> /// <param name="portName">串列埠號</param> /// <param name="baudRate">波特率</param> /// <param name="parity">校驗位</param> /// <param name="dataBits">資料位</param> /// <param name="stopBits">停止位</param> private void SetSerialPortConfig(string portName, int baudRate, int parity, int dataBits, int stopBits) { // 串列埠 引數設定 mySerialPort.PortName = portName; mySerialPort.BaudRate = baudRate; switch (parity) { case 0: default: mySerialPort.Parity = Parity.None; break; case 1: mySerialPort.Parity = Parity.Odd; break; case 2: mySerialPort.Parity = Parity.Even; break; case 3: mySerialPort.Parity = Parity.Mark; break; case 4: mySerialPort.Parity = Parity.Space; break; } mySerialPort.DataBits = ((4 < dataBits) && (dataBits < 9)) ? dataBits : 8; switch (stopBits) { case 0: mySerialPort.StopBits = StopBits.None; break; case 1: default: mySerialPort.StopBits = StopBits.One; break; case 2: mySerialPort.StopBits = StopBits.OnePointFive; break; case 3: mySerialPort.StopBits = StopBits.Two; break; } mySerialPort.ReadTimeout = -1; mySerialPort.RtsEnable = true; mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceived); // 串列埠 接收資料處理定時器 引數設定 SerialPortRecvTimer = new System.Timers.Timer(); SerialPortRecvTimer.Interval = 100; SerialPortRecvTimer.AutoReset = false; SerialPortRecvTimer.Elapsed += new ElapsedEventHandler(SPRecvTimer_Tick); } /// <summary> /// 開啟串列埠 /// </summary> /// <param name="portName">串列埠號</param> /// <param name="baudRate">波特率</param> /// <param name="parity">校驗位</param> /// <param name="dataBits">資料位</param> /// <param name="stopBits">停止位</param> public void OpenSerialPort(string portName, int baudRate, int parity, int dataBits, int stopBits) { try { SetSerialPortConfig(portName, baudRate, parity, dataBits, stopBits); mySerialPort.Open(); IsOpen = true; } catch (System.Exception) { IsOpen = false; throw; } } /// <summary> /// 關閉串列埠 /// </summary> public void CloseSerialPort() { try { mySerialPort.Close(); IsOpen = false; } catch (System.Exception) { IsOpen = false; throw; } } /// <summary> /// 串列埠資料傳送 /// </summary> /// <param name="content">byte型別資料</param> public void SendData(byte[] content) { try { mySerialPort.Write(content, 0, content.Length); } catch (System.Exception) { throw; } } /// <summary> /// 串列埠資料傳送 /// </summary> /// <param name="strContent">字串資料</param> /// <param name="encoding">編碼規則</param> public void SendData(string strContent, Encoding encoding) { try { byte[] content = encoding.GetBytes(strContent); mySerialPort.Write(content, 0, content.Length); } catch (System.Exception) { throw; } } /// <summary> /// 資料處理定時器 /// 定時檢查緩衝區是否有資料,如果有資料則將資料處理並廣播。 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void SPRecvTimer_Tick(object sender, EventArgs e) { byte[] TemporaryData = new byte[byteLength]; int TemporaryDataLength = 0; if (ReceivedDataEvent != null) { byteSerialPortRecv.CopyTo(TemporaryData, 0); TemporaryDataLength = pSerialPortRecv; ReceivedDataEvent.Invoke(this, new SerialPortRecvEventArgs(TemporaryData, TemporaryDataLength)); // 資料處理完後,將指標指向資料頭,等待接收新的資料 pSerialPortRecv = 0; } } /// <summary> /// 資料接收事件 /// 串列埠收到資料後,關閉定時器,將收到的資料填入緩衝區,資料填入完畢後,開啟定時器,等待下一次資料接收 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void DataReceived(object sender, SerialDataReceivedEventArgs e) { try { SerialPortRecvTimer.Stop(); byte[] ReadBuf = new byte[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> public static List<SerialPortParam<string>> GetPortList() { try { List<SerialPortParam<string>> lst_sParameterClass = new List<SerialPortParam<string>>(); foreach (string data in SerialPort.GetPortNames()) { SerialPortParam<string> i_sParameterClass = new SerialPortParam<string>(); i_sParameterClass.Name = data; i_sParameterClass.Value = data; lst_sParameterClass.Add(i_sParameterClass); } return lst_sParameterClass; } catch (Exception) { throw; } } /// <summary> /// 設定波特率 /// </summary> /// <returns></returns> public static List<SerialPortParam<int>> SetBaudRateValues() { try { List<SerialPortParam<int>> lst_sParameterClass = new List<SerialPortParam<int>>(); foreach (SerialPortBaudRates rate in Enum.GetValues(typeof(SerialPortBaudRates))) { SerialPortParam<int> i_sParameterClass = new SerialPortParam<int>(); i_sParameterClass.Name = ((int)rate).ToString(); i_sParameterClass.Value = (int)rate; lst_sParameterClass.Add(i_sParameterClass); } return lst_sParameterClass; } catch (Exception) { throw; } } } /// <summary> /// 設定串列埠助手引數類,如:波特率 /// </summary> public class SerialPortParam<T> { /// <summary> /// 顯示值 /// </summary> string name; /// <summary> /// 顯示值 /// </summary> public string Name { get { return name; } set { name = value; } } /// <summary> /// 值 /// </summary> T value; /// <summary> /// 值 /// </summary> public T Value { get { return this.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> public enum SerialPortBaudRates { 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、串工工具類的使用方法:
//模擬一個點選事件 SerialPortHelper serialPortHelper = new SerialPortHelper(); private void button1_Click(object sender, EventArgs e) { serialPortHelper.OpenSerialPort("COM2"/*串列埠號*/, 115200/*波特率*/, 0/*校驗位*/, 8/*資料位*/, 1/*停止位*/); // 訂閱事件 可以放在 Form_Load 中 或者其他函數中,但必須執行 serialPortHelper.ReceivedDataEvent += new EventHandler<SerialPortHelper.SerialPortRecvEventArgs>(serialPortHelper_ReceivedDataEvent); serialPortHelper.SendData(new byte[] { 0x0D });//send serialPortHelper.CloseSerialPort();//close } /// <summary> /// 接收串列埠資料 /// </summary> /// <param name="sender"></param> /// <param name="args"></param> private void serialPortHelper_ReceivedDataEvent(object sender, SerialPortHelper.SerialPortRecvEventArgs args) { // 資料內容 Console.Write(args.RecvData); // 資料長度 Console.Write(args.RecvDataLength); }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45