由于工作需要,第一次接觸串口編程.所以不得不在網上查閱各種編程實例.最后結合自己的理解與實踐,最終有了如下代碼.
本代碼只經過了簡單的軟件測試,與簡單的硬件測試.
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Runtime.InteropServices;using System.Threading;using System.IO.Ports;namespace PacketsTest{ class ComSR { private SerialPort serialPort; private bool status = false;//接受結束狀態,true為成功接收到數據. private byte[] reciveData = null;//接受到的數據存儲到這里. public bool Status { set { status = value; } get { return status; } } public byte[] RecivedData { get { return reciveData; } } public SerialPort _SerialPort { get { return serialPort; } } public ComSR(string portName,int baudRate,int dataBits,Parity parity,StopBits stopbits) { serialPort = new SerialPort(); serialPort.PortName = portName;//設置端口 serialPort.BaudRate = baudRate;//設置波特率 serialPort.DataBits = dataBits;//設置數據長度 serialPort.Parity = parity;//設置奇偶校驗協議 serialPort.StopBits = stopbits;//停止位 serialPort.ReceivedBytesThreshold = 1;//這里是讀事件觸發條件,1代表一個字節 serialPort.DtrEnable = true;//啟用數據終端就緒信號 serialPort.RtsEnable = true;//請求發送就緒信號 serialPort.DataReceived += new SerialDataReceivedEventHandler(Data_Recive);//綁定處理讀事件的函數. } public void SendBuff(byte[] data) { try { serialPort.Write(data, 0, data.Length);//這里是寫 } catch (Exception e) { if (serialPort != null && serialPort.IsOpen) { status = false; //這個status是我在上層類中判斷端口讀寫狀態的屬性,可以去掉 serialPort.Close(); } } } void Data_Recive(object o, EventArgs e)//這個是讀端口,事件處理函數 { try { Thread.Sleep(3); int length = serialPort.BytesToRead; reciveData = new byte[length]; serialPort.Read(reciveData, 0, length); while (serialPort.BytesToRead != 0)//由于數據長度讀寫不一,而且時間很難確定,所以在這里做了這樣的處理 { Thread.Sleep(1); } if (serialPort.IsOpen) { status = true; //serialPort.Close();//這里不應該關閉,應當在更高層次的程序上關閉端口. } } catch (Exception ex) { if (serialPort != null && serialPort.IsOpen) { status = false; serialPort.Close(); } } } public void PortOpen() { if (!serialPort.IsOpen) { serialPort.Open(); } else { serialPort.Close(); serialPort.Open(); } } /// <summary> /// 關閉端口 /// </summary> public void PortClose() { if (serialPort != null && serialPort.IsOpen) { serialPort.Close(); } } }}
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。
新聞熱點
疑難解答