C# SerialPort配置和属性了解

1,748 阅读4分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金。

前言

SerilPort是串口进行数据通信的一个控件,今天博主教大家如何进行配置SerialPort对端进行通信。 虽然有点简单,大家有兴趣可以耐心看完,我会教大家用VS2019的快捷方法和使用代码的方法进行配置,大家不喜勿喷哈哈哈,创作不易。

每日一遍,防止早恋

202104151615410442.gif

1 使用Vs2019 快捷方法进行对SerialPort进行配置

1.1 新建窗体应用文件,创建Serialport控件

image.png

注意:如果你发现自己的工具箱里面没有Serialport这个控件,可能是你建错了窗体应用,这个窗体应用是(.NET framework)的文件,

image.png

1.2 认识需要配置的属性

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

根据你的需求进行配置 image.png

1.3 Serialport具体配置

1.3.1 找到到需要的端口号,博主的是COM3

image.png

1.3.2 配置波特率,数据位,端口号

image.png

1.3.3 做一个简单的打开,需要发送接收看博主下一篇文章。

image.png

2 使用代码进行对SerialPort进行配置

2.1 先写一个活动串口扫描,实现自动扫描端口号

2.1.1 拖一个这样的窗口

image.png

2.1.2 双击串口扫描,写一个函数。

image.png

private void SearchAndAddSerialToComboBox(object sender, EventArgs e)
        {
            string Buffer;
            comboBox1.Items.Clear();    //清初之前已经扫描的记录
            for (int i = 0; i < 20; i++)
            {
                try
                {
                    Buffer = "COM" + i.ToString(); //获得COM1-20
                    serialPort1.PortName = Buffer;     //获取COM信息
                    serialPort1.Open();                 //打开串口
                    comboBox1.Items.Add(Buffer);
                    comboBox1.Text = Buffer; //添加串口得到记录集
                    serialPort1.Close();                 //关闭串口
                }
                catch { }
            }
        }

串口自动扫描效果

image.png

2.1.3 对波特率,数据位,校验位,停止位配置,先在ComboBox 里面添加选项

image.png 其他和这个步骤一样,小编把小编的配置值给大家:

波特率:
110
300
600
1200
2400
4800
9600
14400
19200
38400
56000
57600
115200
数据位:
6
7
8
校验位:
None
奇校验
偶校验
Mark
空格校验
停止位:
1
1.5
2

2.1.4 双击“打开”按钮 在函数里写好对应的配置,进行配置。

image.png

2.1.5 代码如下

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Serilport
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
           
        }
        private void SearchAndAddSerialToComboBox(object sender, EventArgs e)
        {
            string Buffer;
            comboBox1.Items.Clear();    //清初之前已经扫描的记录
            for (int i = 0; i < 20; i++)
            {
                try
                {
                    Buffer = "COM" + i.ToString(); //获得COM1-20
                    serialPort1.PortName = Buffer;     //获取COM信息
                    serialPort1.Open();                 //打开串口
                    comboBox1.Items.Add(Buffer);
                    comboBox1.Text = Buffer; //添加串口得到记录集
                    serialPort1.Close();                 //关闭串口
                }
                catch { }
            }
        }

        private void button4_Click(object sender, EventArgs e)
        {
            try
            {
                serialPort1.PortName = comboBox1.Text;
                serialPort1.BaudRate = Convert.ToInt32(comboBox2.Text, 10);
                serialPort1.DataBits = Convert.ToInt32(comboBox3.Text, 10);
                if (comboBox4.Text == "None") { serialPort1.Parity = Parity.None; }
                else if (comboBox4.Text == "奇校验") { serialPort1.Parity = Parity.Odd; }
                else if (comboBox4.Text == "偶校验") { serialPort1.Parity = Parity.Even; }
                else if (comboBox4.Text == "Mark") { serialPort1.Parity = Parity.Mark; }
                else if (comboBox4.Text == "空格校验") { serialPort1.Parity = Parity.Space; }
                if (comboBox5.Text == "1")
                {
                    serialPort1.StopBits = StopBits.One;
                }
                else if (comboBox5.Text == "1.5")
                {
                    serialPort1.StopBits = StopBits.OnePointFive;
                }
                else if (comboBox5.Text == "1.5")
                {
                    serialPort1.StopBits = StopBits.Two;
                }
                //serialPort1.ReadTimeout(2000);
                serialPort1.Open();
                button2.Enabled = false;//打开串口按钮不可用
                //button3.Enabled = true;//关闭串口
            }
            catch
            {
                MessageBox.Show("端口错误,请检查串口", "错误");
            }
        }
    }
}

2.1.6 效果如下

image.png

总结

SerialPort是一个串口传输的一个非常方便的控件,对从事上位机测试的人是一个很好的控件,很多做嵌入式开发的人,他们的大部分界面都是用C#写的,难免会用到这个控件,如果你需要了解SerialPort发送和接收,请关注博主下一篇文章。创作不易,点赞,关注,有什么问题请评论指教,谢谢。

202104151629418126.gif