C# 串口通信简单示例

news2024/9/24 7:21:21

C# 简单串口通信示例

  • 串口通信
  • 示例代码

串口通信

C# 串口通信主要操作:

  • 命名空间:using System.IO.Ports;
  • 获取端口:string[] ports = System.IO.Ports.SerialPort.GetPortNames();
  • 设置端口名:serialPort1.PortName = “COM1”; // 字符串
  • 设置波特率:serialPort1.BaudRate = 115200;// int.Parse(“115200”);
  • 设置数据位:serialPort1.DataBits = 1; // int.Parse(“1”);
  • 设置停止位:serialPort1.StopBits = StopBits.One;
    • StopBits.One:停止位1
    • StopBits.OnePointFive:停止位1.5
    • StopBits.Two:停止位2
  • 设置校验位:serialPort1.Parity = Parity.None;
    • Parity.None:无
    • Parity.Even:奇校验
    • Parity.Odd:偶校验
  • 打开串口:serialPort1.Open();
  • 关闭串口:serialPort1.Close();
  • 可读字节:serialPort1.BytesToRead;
  • 读取数据:serialPort1.Read(buffer, 0, len);
  • 写入数据:serialPort1.Write(buffer);
  • 接收事件: XXX_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e);

示例代码

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

namespace serial_tools
{
    public partial class Form1 : Form
    {
        String serialPortName;

        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            string[] ports = System.IO.Ports.SerialPort.GetPortNames(); // 获取本机可用串口端口
            comboBoxPort.Items.AddRange(ports);
            comboBoxPort.SelectedIndex = comboBoxPort.Items.Count > 0 ? 0 : -1; // 有可用端口显示第一个

            comboBoxBaudrate.Text = "115200"; // 默认波特率
            comboBoxDataBits.Text = "8"; // 默认数据位:8
            comboBoxStopbit.Text = "1"; // 默认停止位:1
            comboBoxCheck.Text = "无"; // 默认无校验
        }

        /// <summary>
        /// 重写 系统消息函数
        /// </summary>
        /// <param name="m"></param>
        protected override void WndProc(ref Message m)
        {
           
            base.WndProc(ref m);
        }

        /// <summary>
        /// 串口数据接收
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            int len = serialPort1.BytesToRead; // 获取可读字节数
            byte[] buff = new byte[len]; // 创建缓存数据数组
            serialPort1.Read(buff, 0, len); // 把数据读取到buff数组

            string str = Encoding.Default.GetString(buff); // Byte值转ASCII字符串

            Invoke((new Action(() => {
                if (checkBoxHexShow.Checked)
                {
                    textBoxRecv.AppendText(byteToHexStr(buff));
                }
                else
                { 
                    textBoxRecv.AppendText(str);                 
                }
            
            }))); // 对话框追加显示数据
        }


        public static string byteToHexStr(byte[] bytes)
        {
            string hexStr = "";
            try
            {
                if (bytes != null) {
                    for (int i = 0; i < bytes.Length; i++)
                    {
                        hexStr += bytes[i].ToString("X2");
                        hexStr += " "; // 两个Hex数值以空格隔开
                    }
                }

                return hexStr;
            }
            catch (Exception)
            {
                return hexStr;
            }
        }

        /// <summary>
        /// 打开关闭串口
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonPortOnOff_Click(object sender, EventArgs e)
        {
            if (buttonPortOnOff.Text == "打开串口") {
                try
                {
                    serialPort1.PortName = comboBoxPort.Text; // 获取选择的串口端口
                    serialPortName = comboBoxPort.Text;
                    serialPort1.BaudRate = int.Parse(comboBoxBaudrate.Text); // 获取选择的波特率
                    serialPort1.DataBits = int.Parse(comboBoxDataBits.Text); // 获取选择的数据位

                    // 设置停止位
                    if (comboBoxStopbit.Text == "1") { serialPort1.StopBits = StopBits.One; }
                    else if (comboBoxStopbit.Text == "1.5") { serialPort1.StopBits = StopBits.OnePointFive; }
                    else if (comboBoxStopbit.Text == "2") { serialPort1.StopBits = StopBits.Two; }

                    // 设置奇偶校验
                    if (comboBoxCheck.Text == "无") { serialPort1.Parity = Parity.None; }
                    else if (comboBoxCheck.Text == "奇校验") { serialPort1.Parity = Parity.Even; }
                    else if (comboBoxCheck.Text == "偶校验") { serialPort1.Parity = Parity.Odd; }

                    // 打开串口
                    serialPort1.Open();
                    buttonPortOnOff.Text = "关闭串口";

                }
                catch (Exception ex)
                {
                    MessageBox.Show("串口打开失败"+ ex.ToString(), "警告",
                        MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            else
            {
                try
                {
                    serialPort1.Close();
                }
                catch (Exception ex)
                { 
                
                }

                buttonPortOnOff.Text = "打开串口"; 
            }
        }

        /// <summary>
        /// 清空接收数据
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonClearRecv_Click(object sender, EventArgs e)
        {
            textBoxRecv.Clear();
        }

        /// <summary>
        /// 发送数据
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonSendData_Click(object sender, EventArgs e)
        {
            String Str = textBoxSend.Text.ToString(); // 获取发送文本框里的数据
            try
            {
                if (Str.Length > 0) {
                    serialPort1.Write(Str); // 串口发送数据
                }
            }
            catch (Exception)
            { 
            
            }
        }

        /// <summary>
        /// 清除发送数据
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonClearSend_Click(object sender, EventArgs e)
        {
            textBoxSend.Clear();
        }

        private void comboBoxPort_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void comboBoxPort_MouseClick(object sender, MouseEventArgs e)
        {

        }
    }
}

窗体界面设计
在这里插入图片描述

运行效果
在这里插入图片描述

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

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

相关文章

【C++】继承 ⑫ ( 继承的二义性 | virtual 虚继承 )

文章目录 一、继承的二义性1、场景说明 - 继承的二义性2、继承中的二义性报错3、完整代码示例 二、virtual 虚继承1、虚继承引入2、虚继承语法3、代码示例 - 虚继承 一、继承的二义性 1、场景说明 - 继承的二义性 A 类 是 父类 , B 类 和 C 类 继承 A 类 , 是 子类 , D 类 多…

一文了解和使用nginx(附带图文)

前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 一文了解和使用nginx 一. nginx 简介1.1 什么是 nginx 和可以做什么事情1.2 正向代理1.3 反向代理1.4 负载均衡1.5 SSL 配置1.6 管理…

Galaxy生信云平台|Maftools高效地汇总、分析、注释和可视化肿瘤基因突变MAF文件...

2023-10-25&#xff0c;Galaxy中国镜像站 UseGalaxy.cn 平台新增 5 个工具。 MAF Tools Maftools-突变景观图: 绘制肿瘤基因突变景观图Maftools-突变汇总: 汇总MAF文件中的突变信息Maftools-共突变与互斥突变: 计算共突变和互斥突变Maftools-队列比较&#xff1a;比较两个队列之…

用VSCODE启动Java项目

下载插件 推荐下载插件 启动 在vscode中打开项目或将项目拖进vscode,等进度条加载完成即成启动项目

Redis快速上手篇(四)(Spring Cache,缓存配置)(注解方式)

Spring Cache 从3.1开始&#xff0c;Spring引入了对Cache的支持。其使用方法和原理都类似于Spring对事务管理的支持。Spring Cache是作用在方法上的 使用Spring Cache的时候我们要保证我们缓存的方法对于相同的方法参数要有相同的返回结果。 使用Spring Cache需要我们做两方面…

NSS [SWPUCTF 2022 新生赛]numgame

NSS [SWPUCTF 2022 新生赛]numgame 开题有一个数学表达式&#xff0c;试了一下不可能/-到正确的答案。 view-source:查看源码 解码之后是一个路由/NsScTf.php&#xff0c;访问一下得到了真正的源码。 访问一下/hint2.php call_user_func()&#xff1a;把第一个参数作为回调函数…

C/C++不及格学生 2020年9月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C不及格学生 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C不及格学生 2020年9月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 给出一名学生的语文和数学成绩&#xff0c;判断他是…

代码随想录二刷 Day50

198.打家劫舍 这个题一开始由于给出来的例子陷入了思维误区&#xff0c;以为结果就是每隔一个取一个&#xff0c;其实有可能中间隔很多个。比如一下这个例子 下面这种写法不对。 class Solution { public:int rob(vector<int>& nums) {int odd_sum 0;int even_su…

10月最新H5自适应樱花导航网站源码SEO增强版

10月最新H5自适应樱花导航网源码SEO增强版。非常强大的导航网站亮点就是对SEO优化比较好。 开发时PHP版本&#xff1a;7.3开发时MySQL版本&#xff1a;5.7.26 懂前端和PHP技术想更改前端页面的可以看&#xff1a;网站的前端页面不好看&#xff0c;你可以查看index目录&#x…

“人类高质量数据”如何训练计算机视觉模型?

人类的视觉系统可以复制吗&#xff1f; 答案是肯定的。 计算机视觉 (Computer Vision) 技术的不断普及&#xff0c;让机器识别和处理图像就像人的大脑一样&#xff0c;且速度更快、更准确。 机器像人类一样去“思考” 计算机视觉 (Computer Vision) 是近年来人工智能增长最快…

Linux网络编程:IP协议

目录 一. IP协议的功能 二. IP协议报头 2.1 IP报头的格式 2.2 IP报头各部分含义 三. IP报文的分片问题 3.1 什么是分片 3.2 分片的原理 3.3 合并报文 四. 网段划分 4.1 网络号和主机号 4.2 网络号和主机号的划分策略 4.3 特殊的IP地址 4.4 IP地址数量不足问题 五.…

最新SQL注入漏洞修复建议

点击星标&#xff0c;即时接收最新推文 本文选自《web安全攻防渗透测试实战指南&#xff08;第2版&#xff09;》 点击图片五折购书 SQL注入漏洞修复建议 常用的SQL注入漏洞的修复方法有两种。 1&#xff0e;过滤危险字符 多数CMS都采用过滤危险字符的方式&#xff0c;例如&…

Kotlin中使用ViewBinding绑定控件并添加点击事件

文章目录 效果1、加入依赖2、与控件进行绑定在 Activity 中使用视图绑定 3、监听控件 效果 实现源码 class MainActivity : AppCompatActivity() {lateinit var binding:ActivityMainBindingoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstan…

[GXYCTF2019]Ping Ping Ping 1

题目环境 给了一个ip参数 注意题目Ping Ping Ping 意思就是让我们进行Ping地址 随便输入一个地址Ping一下 URL?ip0 有回显结果&#xff0c;和上题类似 [ACTF2020 新生赛]Exec 1-CSDN博客 查看当前目录文件URL?ip0;ls&#xff08;这里使用堆叠注入查询&#xff09;直接给出了咱…

第10期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练 Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大型语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以…

原来服务器这么有用-Docker安装

原来服务器这么有用-Docker安装 1. 前言 在此之前青阳通过各种方式介绍过自己通过服务器搭建的一些玩法&#xff0c;也写过一些教程&#xff0c;但是那些教程&#xff0c;现在回头来看&#xff0c;都是有些杂乱了&#xff0c;统一性不强。我就准备重新整理一下之前写的文章&a…

基于单片机16位智能抢答器设计

**单片机设计介绍&#xff0c;1645【毕设课设】基于单片机16位智能抢答器设计&#xff08;裁判功能、LCD数码管显示&#xff09;汇编 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序程序文档 六、 文章目录 一 概要 基于单片机16位智能抢答器设计&#x…

Go学习第八章——面向“对象”编程(入门——结构体与方法)

Go面向“对象”编程&#xff08;入门——结构体与方法&#xff09; 1 结构体1.1 快速入门1.2 内存解析1.3 创建结构体四种方法1.4 注意事项和使用细节 2 方法2.1 方法的声明和调用2.2 快速入门案例2.3 调用机制和传参原理2.4 注意事项和细节2.5 方法和函数区别 3 工厂模式 Gola…

【C++】初阶模板

泛型编程 如何实现一个通用的交换函数呢&#xff1f; void Swap(int& left, int& right) {int temp left;left right;right temp; } void Swap(double& left, double& right) {double temp left;left right;right temp; } void Swap(char& left, c…

【Java集合类面试二十四】、ArrayList和LinkedList有什么区别?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;ArrayList和LinkedList有…