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();        }    }}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/34729.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

solidity智能合约如何实现跨合约调用函数

背景 比如现在有一个需求、我需要通过外部合约获取BRC20 token的总交易量。那么我需要在brc20的转账函数里面做一些调整,主要是两个函数内统计转移量。然后再提供外部获取函数。 /*** dev Sets amount as the allowance of spender over the callers tokens.** Ret…

文化财经wh6boll带macd多空转折点提示指标公式源码

文化财经wh6boll带macd多空转折点提示指标公式源码: DIFF:EMA(CLOSE,12) - EMA(CLOSE,26); DEA:EMA(DIFF,9); MACD:2*(DIFF-DEA); MID:MA(CLOSE,26);//求N个周期的收盘价均线,称为布林通道中轨 TMP2:STD(CLOSE,26);//求M个周期内的收盘价的标准差 …

onlyoffice实现在单页面加载文档的功能

草图 实现案例的基本原型 这里我们的样式库使用的是Tailwindcss,我们的前端UI组件库使用的是Ant Design Vue。 基本原型是,有个按钮,没有点击按钮的时候,页面显示的时普通的内容。当点击这个按钮的时候,页面加载文档…

【Linux】线程Thread

🔥博客主页: 我要成为C领域大神🎥系列专栏:【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 ​ ​ 线程概述 …

云层区分神经网络模型——二分类

云层区分神经网络模型——二分类 问奶奶,是什么让他们维护一份感情长达年,奶奶说那个年代什么东西坏了都会想要修,现在什么坏了都想着换。 安装依赖 # 要运行脚本,请先安装以下库:pip install tensorflowpip install …

JAVA每日作业day6.26

ok了家人们,今天我们学习了面向对象-多态,话不多说我们一起来看看吧 一.多态概述 面向对象的第三大特性:封装、继承、多态 我们拿一个生活中的例子来看 生活中,比如跑的动作,小猫、小狗和大象,跑起来是不一…

山水风景视频素材去哪里下?去哪里找?山水风景下载网站分享

在这个数字时代,视频已经成为最直观、有效的传达情感和分享故事的工具。对于那些渴望通过视频传递视觉美感和情感共鸣的创作者来说,拥有高质量的山水风景视频素材是关键。互联网虽然是一个信息量庞大的平台,但找到令人赞叹的山水风景视频素材…

【Linux】使用ntpdate同步时间

ntpdate 是一个在 Linux 系统中用于同步系统时间的命令行工具,它通过与 NTP 服务器通信来调整本地系统时钟。然而,需要注意的是,ntpdate 已经被许多现代 Linux 发行版弃用。 安装 yum install -y ntpdate 查看时间 date同步时间 ntpdate ntp…

问界M9累计大定破10万,创中国豪车新纪录

ChatGPT狂飙160天,世界已经不是之前的样子。 更多资源欢迎关注 6月26日消息,华为常务董事、终端BG董事长、智能汽车解决方案BU董事长余承东今日宣布,问界M9上市6个月,累计大定突破10万辆。 这一成绩,也创造了中国市场…

postman汉化中文(Windows)

Postman 是一款专业的 API 开发工具,为开发者提供了创建、测试、调试和分享 HTTP 请求的便利性和灵活性。其主要功能包括请求构建与发送、自动化测试、团队协作与分享、实时监视与调试以及环境与变量管理。无论是个人开发者还是团队,Postman 都能有效地提…

深入了解 msvcr120.dll问题解决指南,msvcr120.dll在电脑中的重要性

在Windows操作系统中,.dll 文件扮演了非常重要的角色,它们包含许多程序运行所需的代码和数据。其中 msvcr120.dll 是一个常见的动态链接库文件,是 Microsoft Visual C Redistributable Packages 的一部分。这篇文章将探讨 msvcr120.dll 的功能…

使用Python进行并发和并行编程:提高效率的秘诀

使用Python进行并发和并行编程:提高效率的秘诀 ​ 大家好,今天我们来聊聊如何使用Python进行并发和并行编程,以提升数据处理的效率;在之前的文章中,我们探讨了Python的函数式编程和数据流处理。今天,我们将…

C++用Crow实现一个简单的Web程序,实现动态页面,向页面中输入数据并展示

Crow是一个轻量级、快速的C微框架,用于构建Web应用程序和RESTful API。 将处理前端页面的POST请求以添加数据的逻辑添加到 /submit 路由中,并添加了一个新的路由 / 用于返回包含输入框、按钮和表格的完整页面。当用户向表格添加数据时,JavaS…

SpringAOP执行流程——从源码画流程图

文章目录 了解ProxyFactory入门操作添加多个Advice的执行顺序关于异常Advice关于proceed()方法指定方法才进行增强逻辑 创建代理对象的其他方式ProxyFactoryBeanBeanNameAutoProxyCreatorDefaultAdvisorAutoProxyCreator 对SpringAOP的理解TargetSourceProxyFactory选择JDK/CJL…

【教学类-64-05】20240625彩棒鱼骨图(二)AB排列 6.5*1CM 6选2根 30种

背景需求: 【教学类-64-04】20240619彩棒鱼骨图(一)6.5*1CM 6根棒子720种-CSDN博客文章浏览阅读897次,点赞23次,收藏13次。【教学类-64-04】20240619彩棒鱼骨图(一)6.5*1CM 6根棒子720种https:…

JetBrains Rider 2024安装教程

一、下载Rider 1、进入官网,点击“下载” 2、下载完毕 二、安装Rider 1、双击下载的exe文件 2、点击“下一步” 3、可以点击“浏览”选择安装路径,之后点击“下一步” 4、选中图中四项,点击“下一步” 5、选中图中四项,点击“下…

Go语言学习:每日一练1

Go语言学习:每日一练1 目录 Go语言学习:每日一练1变量声明函数定义流程控制 ifrange遍历switch 变量声明 package main//定义变量 var a 1 const Message “hello,world”func main() {b : 2 //短变量声明var c 3c TestMethod(a, b, c)} //定义函数…

进程、CPU、MMU与PCB之间的关系

目录 进程与cpu(中央处理器) 源代码、程序、cpu与进程的关系 cpu超线程 CPU的简易架构与处理数据过程 进程与MMU(内存管理单元) mmu作用 cpu和mmu的关系 进程与PCB(进程控制块) PCB介绍与内部成员…

组合数学、圆排列、离散数学多重集合笔记

自用 如果能帮到您,那也值得高兴 知识点 离散数学经典题目 多重集合组合 补充容斥原理公式 隔板法题目 全排列题目:

Loki部署及使用

简介 loki 是云原生的日志服务,本文讲解loki的部署,日志接入和查询日志的简单使用。 理论 Loki 分两部分,Loki 是日志引擎部分,Promtail 是收集日志端。 Loki 是主服务器,负责存储日志和处理查询 。 promtail 是代理,负责收集日志并将其发送给 loki 。 promtail 是日志…