opencv入門教程:c#串口通信

串口進行操作的類,其中包括寫和讀操作,類可設置串口參數、設置接收函數、打開串口資源、關閉串口資源,操作完成後,一定要關閉串口、接收串口數據事件、接收數據出錯事件、獲取當前全部串口、把字節型轉換成十六進制字符串等功能。這個串口類已經過了調試,可以使用:

C#串口操作類,包括串口讀寫操作

using System;

using System.Collections.Generic;

using System.Text;

using System.IO.Ports;

using System.Globalization;

namespace SerialClass

{

public class SerialClass

{

SerialPort _serialPort = null;

//定義委託

public delegate void SerialPortDataReceiveEventArgs(object sender, SerialDataReceivedEventArgs e, byte[] bits);

//定義接收數據事件

public event SerialPortDataReceiveEventArgs DataReceived;

//定義接收錯誤事件

//public event SerialErrorReceivedEventHandler Error;

//接收事件是否有效 false表示有效

public bool ReceiveEventFlag = false;

#region 獲取串口名

private string protName;

public string PortName

{

get { return _serialPort.PortName; }

set

{

_serialPort.PortName = value;

protName = value;

}

}

#endregion

#region 獲取比特率

private int baudRate;

public int BaudRate

{

get { return _serialPort.BaudRate; }

set

{

_serialPort.BaudRate = value;

baudRate = value;

}

}

#endregion

#region 默認構造函數

/// <summary>

/// 默認構造函數,操作COM1,速度為9600,沒有奇偶校驗,8位字節,停止位為1 “COM1”, 9600, Parity.None, 8, StopBits.One

/// </summary>

public SerialClass()

{

_serialPort = new SerialPort();

}

#endregion

#region 構造函數

/// <summary>

/// 構造函數,

/// </summary>

/// <param name=”comPortName”></param>

public SerialClass(string comPortName)

{

_serialPort = new SerialPort(comPortName);

_serialPort.BaudRate = 9600;

_serialPort.Parity = Parity.Even;

_serialPort.DataBits = 8;

_serialPort.StopBits = StopBits.One;

_serialPort.Handshake = Handshake.None;

_serialPort.RtsEnable = true;

_serialPort.ReadTimeout = 2000;

setSerialPort();

}

#endregion

#region 構造函數,可以自定義串口的初始化參數

/// <summary>

/// 構造函數,可以自定義串口的初始化參數

/// </summary>

/// <param name=”comPortName”>需要操作的COM口名稱</param>

/// <param name=”baudRate”>COM的速度</param>

/// <param name=”parity”>奇偶校驗位</param>

/// <param name=”dataBits”>數據長度</param>

/// <param name=”stopBits”>停止位</param>

public SerialClass(string comPortName, int baudRate, Parity parity, int dataBits, StopBits stopBits)

{

_serialPort = new SerialPort(comPortName, baudRate, parity, dataBits, stopBits);

_serialPort.RtsEnable = true; //自動請求

_serialPort.ReadTimeout = 3000;//超時

setSerialPort();

}

#endregion

#region 析構函數

/// <summary>

/// 析構函數,關閉串口

/// </summary>

~SerialClass()

{

if (_serialPort.IsOpen)

_serialPort.Close();

}

#endregion

#region 設置串口參數

/// <summary>

/// 設置串口參數

/// </summary>

/// <param name=”comPortName”>需要操作的COM口名稱</param>

/// <param name=”baudRate”>COM的速度</param>

/// <param name=”dataBits”>數據長度</param>

/// <param name=”stopBits”>停止位</param>

public void setSerialPort(string comPortName, int baudRate, int dataBits, int stopBits )

{

if (_serialPort.IsOpen)

_serialPort.Close();

_serialPort.PortName = comPortName;

_serialPort.BaudRate = baudRate;

_serialPort.Parity = Parity.None;

_serialPort.DataBits = dataBits;

_serialPort.StopBits = (StopBits)stopBits;

_serialPort.Handshake = Handshake.None;

_serialPort.RtsEnable = false;

_serialPort.ReadTimeout = 3000;

_serialPort.NewLine = “/r/n”;

setSerialPort();

}

#endregion

#region 設置接收函數

/// <summary>

/// 設置串口資源,還需重載多個設置串口的函數

/// </summary>

void setSerialPort()

{

if (_serialPort != null)

{

//設置觸發DataReceived事件的字節數為1

_serialPort.ReceivedBytesThreshold = 1;

//接收到一個字節時,也會觸發DataReceived事件

_serialPort.DataReceived += new SerialDataReceivedEventHandler(_serialPort_DataReceived);

//接收數據出錯,觸發事件

_serialPort.ErrorReceived += new SerialErrorReceivedEventHandler(_serialPort_ErrorReceived);

//打開串口

//openPort();

}

}

#endregion

#region 打開串口資源

/// <summary>

/// 打開串口資源

/// <returns>返回bool類型</returns>

/// </summary>

public bool openPort()

{

bool ok = false;

//如果串口是打開的,先關閉

if (_serialPort.IsOpen)

_serialPort.Close();

try

{

//打開串口

_serialPort.Open();

ok = true;

}

catch (Exception Ex)

{

throw Ex;

}

return ok;

}

#endregion

#region 關閉串口

/// <summary>

/// 關閉串口資源,操作完成後,一定要關閉串口

/// </summary>

public void closePort()

{

//如果串口處於打開狀態,則關閉

if (_serialPort.IsOpen)

_serialPort.Close();

}

#endregion

#region 接收串口數據事件

/// <summary>

/// 接收串口數據事件

/// </summary>

/// <param name=”sender”></param>

/// <param name=”e”></param>

void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)

{

//禁止接收事件時直接退出

if (ReceiveEventFlag)

{

return;

}

try

{

System.Threading.Thread.Sleep(20);

byte[] _data = new byte[_serialPort.BytesToRead];

_serialPort.Read(_data, 0, _data.Length);

if (_data.Length == 0) { return; }

if (DataReceived != null)

{

DataReceived(sender, e, _data);

}

//_serialPort.DiscardInBuffer(); //清空接收緩衝區

}

catch (Exception ex)

{

throw ex;

}

}

#endregion

#region 接收數據出錯事件

/// <summary>

/// 接收數據出錯事件

/// </summary>

/// <param name=”sender”></param>

/// <param name=”e”></param>

void _serialPort_ErrorReceived(object sender, SerialErrorReceivedEventArgs e)

{

}

#endregion

#region 發送數據string類型

public void SendData(string data)

{

//發送數據

//禁止接收事件時直接退出

if (ReceiveEventFlag)

{

return;

}

if (_serialPort.IsOpen)

{

_serialPort.Write(data);

}

}

#endregion

#region 發送數據byte類型

/// <summary>

/// 數據發送

/// </summary>

/// <param name=”data”>要發送的數據字節</param>

public void SendData(byte[] data, int offset, int count)

{

//禁止接收事件時直接退出

if (ReceiveEventFlag)

{

return;

}

try

{

if (_serialPort.IsOpen)

{

//_serialPort.DiscardInBuffer();//清空接收緩衝區

_serialPort.Write(data, offset, count);

}

}

catch (Exception ex)

{

throw ex;

}

}

#endregion

#region 發送命令

/// <summary>

/// 發送命令

/// </summary>

/// <param name=”SendData”>發送數據</param>

/// <param name=”ReceiveData”>接收數據</param>

/// <param name=”Overtime”>超時時間</param>

/// <returns></returns>

public int SendCommand(byte[] SendData, ref byte[] ReceiveData, int Overtime)

{

if (_serialPort.IsOpen)

{

try

{

ReceiveEventFlag = true; //關閉接收事件

_serialPort.DiscardInBuffer(); //清空接收緩衝區

_serialPort.Write(SendData, 0, SendData.Length);

int num = 0, ret = 0;

System.Threading.Thread.Sleep(10);

ReceiveEventFlag = false; //打開事件

while (num++ < Overtime)

{

if (_serialPort.BytesToRead >= ReceiveData.Length)

break;

System.Threading.Thread.Sleep(10);

}

if (_serialPort.BytesToRead >= ReceiveData.Length)

{

ret = _serialPort.Read(ReceiveData, 0, ReceiveData.Length);

}

else

{

ret = _serialPort.Read(ReceiveData, 0, _serialPort.BytesToRead);

}

ReceiveEventFlag = false; //打開事件

return ret;

}

catch (Exception ex)

{

ReceiveEventFlag = false;

throw ex;

}

}

return -1;

}

#endregion

#region 獲取串口

/// <summary>

/// 獲取所有已連接短信貓設備的串口

/// </summary>

/// <returns></returns>

public string[] serialsIsConnected()

{

List<string> lists = new List<string>();

string[] seriallist = getSerials();

foreach (string s in seriallist)

{

}

return lists.ToArray();

}

#endregion

#region 獲取當前全部串口資源

/// <summary>

/// 獲得當前電腦上的所有串口資源

/// </summary>

/// <returns></returns>

public string[] getSerials()

{

return SerialPort.GetPortNames();

}

#endregion

#region 字節型轉換16

/// <summary>

/// 把字節型轉換成十六進制字符串

/// </summary>

/// <param name=”InBytes”></param>

/// <returns></returns>

public static string ByteToString(byte[] InBytes)

{

string StringOut = “”;

foreach (byte InByte in InBytes)

{

StringOut = StringOut + String.Format(“{0:X2} “, InByte);

}

return StringOut;

}

#endregion

#region 十六進制字符串轉字節型

/// <summary>

/// 把十六進制字符串轉換成字節型(方法1)

/// </summary>

/// <param name=”InString”></param>

/// <returns></returns>

public static byte[] StringToByte(string InString)

{

string[] ByteStrings;

ByteStrings = InString.Split(” “.ToCharArray());

byte[] ByteOut;

ByteOut = new byte[ByteStrings.Length];

for (int i = 0; i <= ByteStrings.Length-1 ; i++)

{

//ByteOut[i] = System.Text.Encoding.ASCII.GetBytes(ByteStrings[i]);

ByteOut[i] = Byte.Parse(ByteStrings[i], System.Globalization.NumberStyles.HexNumber);

//ByteOut[i] =Convert.ToByte(“0x” + ByteStrings[i]);

}

return ByteOut;

}

#endregion

#region 十六進制字符串轉字節型

/// <summary>

/// 字符串轉16進制字節數組(方法2)

/// </summary>

/// <param name=”hexString”></param>

/// <returns></returns>

public static byte[] strToToHexByte(string hexString)

{

hexString = hexString.Replace(” “, “”);

if ((hexString.Length % 2) != 0)

hexString += ” “;

byte[] returnBytes = new byte[hexString.Length / 2];

for (int i = 0; i < returnBytes.Length; i++)

returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);

return returnBytes;

}

#endregion

#region 字節型轉十六進制字符串

/// <summary>

/// 字節數組轉16進制字符串

/// </summary>

/// <param name=”bytes”></param>

/// <returns></returns>

public static string byteToHexStr(byte[] bytes)

{

string returnStr = “”;

if (bytes != null)

{

for (int i = 0; i < bytes.Length; i++)

{

returnStr += bytes[i].ToString(“X2”);

}

}

return returnStr;

}

#endregion

}

}

======================================================================================

調用方法:

static SerialClass sc = new SerialClass();

static void Main(string[] Args)

{

sc.DataReceived += new SerialClass.SerialPortDataReceiveEventArgs(sc_DataReceived);

sc.writeData(“at”);

Console.ReadLine();

sc.closePort();

}

static void sc_DataReceived(object sender, SerialDataReceivedEventArgs e, byte[] bits)

{

Console.WriteLine(Encoding.Default.GetString(bits));

}

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/226775.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-09 14:52
下一篇 2024-12-09 14:52

相關推薦

發表回復

登錄後才能評論