學習備忘-源自https://mp.weixin.qq.com/s/xO7yCpNj3zG8lfqyz4ARVw
前言
串列埠通訊在.NET平臺下建立C#串列埠通訊程式,.NET 2.0提供了串列埠通訊的功能,其名稱空間是System.IO.Ports。
這個新的框架不但可以訪問計算機上的串列埠,還可以和串列埠裝置進行通訊。
建立C#串列埠通訊程式之名稱空間 System.IO.Ports名稱空間中最重用的是SerialPort 類。
建立C#串列埠通訊程式之建立SerialPort 物件 透過建立SerialPort 物件,我們可以在程式中控制串列埠通訊的全過程。
正文
屬性
方法
Nuget 安裝System.IO.Ports
串列埠寫
串列埠讀
一個完整例子
using System.IO.Ports;
namespace SCOM
{
public partial class FrmMain : Form
{
SerialPort serialPort;
public FrmMain()
{
InitializeComponent();
Init();
}
private void LoadPorts()
{
cboPort.Items.Clear();
string[] port = System.IO.Ports.SerialPort.GetPortNames();
foreach (var item in port)
{
cboPort.Items.Add(item);
}
cboPort.SelectedIndex = 0;
}
private void Init()
{
LoadPorts();
object[] baudRate = { 4800, 9600, 19200, 38400, 57600, 115200, 230400 };
cboBaudRate.Items.AddRange(baudRate);
cboBaudRate.SelectedIndex = 1;
cboDataBits.Items.Add(7);
cboDataBits.Items.Add(8);
cboDataBits.SelectedIndex = 1;
cboStopBits.Items.Add("One");
cboStopBits.Items.Add("OnePointFive");
cboStopBits.Items.Add("Two");
cboStopBits.SelectedIndex = 0;
//Parity
cboParity.Items.Add("None");
cboParity.Items.Add("Even");
cboParity.Items.Add("Mark");
cboParity.Items.Add("Odd");
cboParity.Items.Add("Space");
cboParity.SelectedIndex = 0;
cboHandshaking.Items.Add("None");
cboHandshaking.Items.Add("XOnXOff");
cboHandshaking.Items.Add("RequestToSend");
cboHandshaking.Items.Add("RequestToSendXOnXOff");
cboHandshaking.SelectedIndex = 0;
btnClosePort.Enabled = false;
}
private void btnRefresh_Click(object sender, EventArgs e)
{
LoadPorts();
}
private void btnOpenPort_Click(object sender, EventArgs e)
{
if (serialPort == null)
{
serialPort = new SerialPort();
}
serialPort.PortName = cboPort.Text;
//串列埠名稱
serialPort.BaudRate = int.Parse(cboBaudRate.Text);
//獲取或設定波特率
serialPort.Parity = (Parity)Enum.Parse(typeof(Parity), cboParity.Text);
//獲取或設定校驗位
serialPort.DataBits = int.Parse(cboDataBits.Text);
//獲取或設定資料位預設值8
serialPort.StopBits = (StopBits)Enum.Parse(typeof(StopBits), cboStopBits.Text);
// 停止位
serialPort.Handshake = (Handshake)Enum.Parse(typeof(Handshake), cboHandshaking.Text);
// 握手協議
serialPort.DataReceived += SerialPort_DataReceived;
serialPort.Open();
stsMain_lblStatus.Text = "埠已開啟";
btnOpenPort.Enabled = false;
btnClosePort.Enabled = true;
}
private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
this.Invoke(new Action(() =>
{
byte[] b = new byte[8];
int A = serialPort.Read(b, 0, 8);
string s = "";
if (rdoHex.Checked)
{
s = ByteToHex(b);
}
else
{
s = System.Text.Encoding.Default.GetString(b);
}
txtReceive.AppendText(System.Environment.NewLine+ s);
}));
}
private void btnClosePort_Click(object sender, EventArgs e)
{
if (serialPort != null && serialPort.IsOpen)
{
serialPort.DataReceived -= SerialPort_DataReceived;
serialPort.Close();
stsMain_lblStatus.Text = "埠已關閉";
btnOpenPort.Enabled = true;
btnClosePort.Enabled = false;
}
}
private void btnSend_Click(object sender, EventArgs e)
{
if (serialPort == null || !serialPort.IsOpen)
{
return;
}
serialPort.Write(txtSend.Text);
}
private string ByteToHex(byte[] Bytes)
{
string str = string.Empty;
foreach (byte Byte in Bytes)
{
str += String.Format("{0:X2}", Byte) + " ";
}
return str.Trim();
}
}
}
總結
本文詳細介紹瞭如何在C#中使用SerialPort類進行串列埠通訊,涵蓋了從基本概念到實際應用的全過程。
SerialPort類的主要屬性和方法,包括配置串列埠引數、開啟和關閉串列埠、讀寫資料等核心操作。
透過具體的程式碼示例,我們展示瞭如何初始化SerialPort物件,並設定波特率、資料位、停止位和校驗位等關鍵引數。
總之 SerialPort類為C#開發者提供了一個強大而靈活的工具,用於實現高效可靠的串列埠通訊。