G
N
I
D
A
O
L

C# SerialPort 串口通讯

学习备忘-源自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#开发者提供了一个强大而灵活的工具,用于实现高效可靠的串口通讯。

posted @ 2024-12-06 23:10  firespeed  阅读(33)  评论(0编辑  收藏  举报