C# SerialPort实现串口通讯的代码详解

 更新时间:2024年06月24日 10:27:01   作者:码农浩克  
在.NET平台下创建C#串口通信程序,.NET 2.0提供了串口通信的功能,其命名空间是System.IO.Ports,这个新的框架不但可以访问计算机上的串口,还可以和串口设备进行通信,本文给大家介绍了C# SerialPort实现串口通讯,需要的朋友可以参考下

串口通信

在.NET平台下创建C#串口通信程序,.NET 2.0提供了串口通信的功能,其命名空间是System.IO.Ports。这个新的框架不但可以访问计算机上的串口,还可以和串口设备进行通信。

创建C#串口通信程序之命名空间 System.IO.Ports命名空间中最重用的是SerialPort 类。 创建C#串口通信程序之创建SerialPort 对象 通过创建SerialPort 对象,我们可以在程序中控制串口通信的全过程。

正文

属性

BaseStream获取 Stream 对象的基础 SerialPort 对象。
BaudRate获取或设置串行波特率。
BreakState获取或设置中断信号状态。
BytesToRead获取接收缓冲区中数据的字节数。
BytesToWrite获取发送缓冲区中数据的字节数。
CDHolding获取端口的载波检测行的状态。
CtsHolding获取“可以发送”行的状态。
DataBits获取或设置每个字节的标准数据位长度。
DiscardNull获取或设置一个值,该值指示 null 字节在端口和接收缓冲区之间传输时是否被忽略。
DsrHolding获取数据设置就绪 (DSR) 信号的状态。
DtrEnable获取或设置一个值,该值在串行通信过程中启用数据终端就绪 (DTR) 信号。
Encoding获取或设置传输前后文本转换的字节编码。
Handshake使用 Handshake 中的值获取或设置串行端口数据传输的握手协议。
IsOpen获取一个值,该值指示 SerialPort 对象的打开或关闭状态。
NewLine获取或设置用于解释 ReadLine() 和 WriteLine(String) 方法调用结束的值。
Parity获取或设置奇偶校验检查协议。
ParityReplace获取或设置一个字节,该字节在发生奇偶校验错误时替换数据流中的无效字节。
PortName获取或设置通信端口,包括但不限于所有可用的 COM 端口。
ReadBufferSize获取或设置 SerialPort 输入缓冲区的大小。
ReadTimeout获取或设置读取操作未完成时发生超时之前的毫秒数。
ReceivedBytesThreshold获取或设置 DataReceived 事件发生前内部输入缓冲区中的字节数。
RtsEnable获取或设置一个值,该值指示在串行通信中是否启用请求发送 (RTS) 信号。
StopBits获取或设置每个字节的标准停止位数。
WriteBufferSize获取或设置串行端口输出缓冲区的大小。
WriteTimeout获取或设置写入操作未完成时发生超时之前的毫秒数。

方法

Close()关闭端口连接,将 IsOpen 属性设置为 false,并释放内部 Stream 对象。
DiscardInBuffer()丢弃来自串行驱动程序的接收缓冲区的数据。
DiscardOutBuffer()丢弃来自串行驱动程序的传输缓冲区的数据。
GetPortNames()获取当前计算机的串行端口名的数组。
Open()打开一个新的串行端口连接。
Read(Byte[], Int32, Int32)从 SerialPort 输入缓冲区读取一些字节并将那些字节写入字节数组中指定的偏移量处。
Read(Char[], Int32, Int32)从 SerialPort 输入缓冲区中读取一些字符,然后将这些字符写入字符数组中指定的偏移量处。
ReadByte()从 SerialPort 输入缓冲区中同步读取一个字节。
ReadChar()从 SerialPort 输入缓冲区中同步读取一个字符。
ReadExisting()在编码的基础上,读取 SerialPort 对象的流和输入缓冲区中所有立即可用的字节。
ReadLine()一直读取到输入缓冲区中的 NewLine 值。
ReadTo(String)一直读取到输入缓冲区中的指定 value 的字符串。
Write(Byte[], Int32, Int32)使用缓冲区中的数据将指定数量的字节写入串行端口。
Write(Char[], Int32, Int32)使用缓冲区中的数据将指定数量的字符写入串行端口。
Write(String)将指定的字符串写入串行端口。
WriteLine(String)将指定的字符串和 NewLine 值写入输出缓冲区。

Nuget 安装System.IO.Ports

图片

串口写

private void btnWrite_Click(object sender, EventArgs e)
{
    SerialPort serialPort = new SerialPort();
    serialPort.PortName = "COM1";//串口名称
    serialPort.BaudRate = 9600; //获取或设置波特率
    serialPort.Parity = Parity.Even;//获取或设置校验位
    serialPort.DataBits = 8;//获取或设置数据位默认值8
    serialPort.StopBits = StopBits.One;// 停止位
    serialPort.Open();
    serialPort.Write("A");
    serialPort.Close();
}

串口读

SerialPort serialPort = new SerialPort();
private void btnRead_Click(object sender, EventArgs e)
{


    byte[] a = System.Text.Encoding.ASCII.GetBytes(" ");
    serialPort.PortName = "COM1";//串口名称
    serialPort.BaudRate = 9600; //获取或设置波特率
    serialPort.Parity = Parity.None;//获取或设置校验位
    serialPort.DataBits = 8;//获取或设置数据位默认值8
    serialPort.StopBits = StopBits.One;// 停止位
    serialPort.DataReceived += SerialPort_DataReceived;
    serialPort.Open();
}


private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    byte[] b = new byte[8];
    int A = serialPort.Read(b, 0, 8);
    this.Invoke(() =>
    {
        string s = ByteToHex(b);
        txtValue.Text += s+System.Environment.NewLine;
    });
}


public string ByteToHex(byte[] Bytes)
{
    string str = string.Empty;
    foreach (byte Byte in Bytes)
    {
        str += String.Format("{0:X2}", Byte) + " ";
    }
    return str.Trim();
}

图片

一个完整例子

图片

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实现串口通讯的代码详解的详细内容,更多关于C# SerialPort串口通讯的资料请关注脚本之家其它相关文章!

相关文章

  • 积累Visual Studio 常用快捷键的动画演示

    积累Visual Studio 常用快捷键的动画演示

    在代码开发过程中,频繁的使用键盘、鼠标操作非常麻烦,影响程序的开发效率。如何操作能用键盘来操作,那就节省时间了。下面小编把我平时积累的有关visul studio 常用快捷键的动画演示分享给大家,仅供大家参考
    2015-10-10
  • C#加密算法汇总(推荐)

    C#加密算法汇总(推荐)

    以下是对C#中的加密算法进行了汇总介绍,需要的朋友可以过来参考下
    2013-09-09
  • C# FileStream文件读写详解

    C# FileStream文件读写详解

    本文主要介绍C#使用 FileStream 读取数据,写入数据等操作,希望能帮到大家。
    2016-04-04
  • C#常用正则大全分享

    C#常用正则大全分享

    C#常用正则大全分享,最基本也是最常用的一些表达式,需要的朋友可以参考一下
    2013-03-03
  • C#使用GZipStream实现文件的压缩与解压

    C#使用GZipStream实现文件的压缩与解压

    这篇文章主要为大家详细介绍了C#使用GZipStream实现文件的压缩与解压,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • Unity实现简单虚拟摇杆

    Unity实现简单虚拟摇杆

    这篇文章主要为大家详细介绍了Unity实现简单虚拟摇杆,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • Unity3d实现跑马灯广播效果

    Unity3d实现跑马灯广播效果

    这篇文章主要为大家详细介绍了Unity3d实现跑马灯广播效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • C#设计模式之建造者模式生成器模式示例详解

    C#设计模式之建造者模式生成器模式示例详解

    这篇文章主要为大家介绍了C#设计模式之建造者模式生成器模式示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • C#中多维数组[,]和交错数组[][]的区别

    C#中多维数组[,]和交错数组[][]的区别

    这篇文章介绍了C#中多维数组[,]和交错数组[][]的区别,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01
  • C#子线程执行完后通知主线程的方法

    C#子线程执行完后通知主线程的方法

    下面小编就为大家带来一篇C#子线程执行完后通知主线程的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12

最新评论