C#串口通讯

在C#写串口通讯小程序时,可以使用System.IO.Ports命名空间提供的SerialPort类。下面是一个简单的例子,包含了一个基本的UI,用于设置串口参数和进行通讯。这里使用了Windows Forms(WinForms)来创建UI。

步骤:

  1. 创建新的C#项目: 在Visual Studio中创建一个新的Windows Forms应用程序项目。

  2. 设计UI: 打开Form1.cs文件,通过拖放控件创建以下UI元素:

    • 两个ComboBox控件用于选择串口和波特率。
    • 一个Button控件用于打开/关闭串口。
    • 一个TextBox控件用于显示接收到的数据。
    • 一个TextBox控件用于输入要发送的数据。
    • 一个Button控件用于发送数据。
  3. 添加SerialPort控件:Form1.cs文件中,在类的顶部添加以下代码:

    using System.IO.Ports;

    在类的声明下方添加以下代码:

    private SerialPort serialPort;

  4. 初始化串口:Form1的构造函数中初始化串口和其他控件:

    public Form1() { InitializeComponent(); // 初始化串口 serialPort = new SerialPort(); serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); // 获取可用串口并添加到ComboBox string[] ports = SerialPort.GetPortNames(); comboBoxPort.Items.AddRange(ports); // 默认波特率选择 comboBoxBaudRate.SelectedItem = "9600"; }

  5. 打开/关闭串口按钮点击事件: 添加以下代码到打开/关闭按钮的点击事件中:

    private void buttonOpenClose_Click(object sender, EventArgs e) { if (!serialPort.IsOpen) { // 打开串口 serialPort.PortName = comboBoxPort.SelectedItem.ToString(); serialPort.BaudRate = int.Parse(comboBoxBaudRate.SelectedItem.ToString()); try { serialPort.Open(); buttonOpenClose.Text = "关闭串口"; } catch (Exception ex) { MessageBox.Show("串口打开失败:" + ex.Message, "错误"); } } else { // 关闭串口 serialPort.Close(); buttonOpenClose.Text = "打开串口"; } }

  6. 发送数据按钮点击事件: 添加以下代码到发送按钮的点击事件中:

    private void buttonSend_Click(object sender, EventArgs e) { if (serialPort.IsOpen) { string data = textBoxSend.Text; serialPort.Write(data); } else { MessageBox.Show("串口未打开!", "错误"); } }

  7. 接收数据事件处理: 添加以下代码用于处理接收到的数据:

    private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) { SerialPort sp = (SerialPort)sender; string data = sp.ReadExisting(); // 在UI线程上更新TextBox BeginInvoke(new Action(() => { textBoxReceive.AppendText(data); })); }

  8. 清理资源: 在窗体关闭时,确保关闭串口并释放资源:

    private void Form1_FormClosing(object sender, FormClosingEventArgs e) { if (serialPort.IsOpen) { serialPort.Close(); } }

完整代码如下:

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.Ports;


namespace 串口程序
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
      
            // 初始化串口
            serialPort1 = new SerialPort();
            serialPort1.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

            // 获取可用串口并添加到ComboBox
            string[] ports = SerialPort.GetPortNames();
            comboBoxPort.Items.AddRange(ports);

            // 设置默认的串口号
            if (ports.Length > 0)
            {
                comboBoxPort.SelectedItem = ports[0];
            }
            // 默认波特率选择
            comboBoxBaudRate.SelectedItem = "9600";
        }

        private void button1_Click(object sender, EventArgs e)//打开串口
        {
            if (!serialPort1.IsOpen)
            {                
                    // 打开串口
                    serialPort1.PortName = comboBoxPort.SelectedItem.ToString();
                    serialPort1.BaudRate = int.Parse(comboBoxBaudRate.SelectedItem.ToString());
              
                try
                {
                    serialPort1.Open();
                    buttonOpenClose.Text = "关闭串口";
                    buttonOpenClose.BackColor = Color.Lime;
                }
                catch (Exception ex)
                {
                    MessageBox.Show("串口打开失败:" + ex.Message, "错误");
                }
            }
            else
            {
                // 关闭串口
                serialPort1.Close();
                buttonOpenClose.Text = "打开串口";
                buttonOpenClose.BackColor = Color.White;
            }
        }

        private void button2_Click(object sender, EventArgs e)//发送数据
        {
            if (serialPort1.IsOpen)
            {
                string data = textBoxSend.Text;
                byte[] byteData = Encoding.UTF8.GetBytes(data); // 将字符串转换为字节数组
                serialPort1.Write(byteData, 0, byteData.Length);
            }
            else
            {
                MessageBox.Show("串口未打开!", "错误");
            }
        }

        private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)//接收数据
        {
            SerialPort sp = (SerialPort)sender;

            int bytesToRead = sp.BytesToRead;
            byte[] byteData = new byte[bytesToRead];

            sp.Read(byteData, 0, bytesToRead);

            // 将接收到的字节数组转换为字符串
            string data = Encoding.UTF8.GetString(byteData);


            // 在UI线程上更新TextBox
            BeginInvoke(new Action(() =>
            {
                textBoxReceive.AppendText(data + Environment.NewLine);
            }));
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)//关闭窗体时关闭串口
        {
            if (serialPort1.IsOpen)
            {
                serialPort1.Close();
            }
        }

        private void button3_Click(object sender, EventArgs e)//清空发送/接收数据
        {
            textBoxSend.Clear();
            textBoxReceive.Clear();

        }
    }
}

调试截图如下:

以上程序只是一个简单的demo,有很多没有完善,比如接收和发送字符串会出现乱码,小弟只是在此抛砖引玉,望各位大神补齐!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LabelStudio数据标注详细方法

文章目录 情感分析任务Label Studio使用指南1. label-studio 安装2. label-studio 项目创建3. 情感分析任务标注3.1 语句级情感分类任务3.2 属性级情感分析任务3.2.1 属性-情感极性-观点词抽取(1)Span类型标签(2)Relation类型标签…

PyTorch: 基于【VGG16】处理MNIST数据集的图像分类任务【准确率98.9%+】

目录 引言在Conda虚拟环境下安装pytorch步骤一:利用代码自动下载mnist数据集步骤二:搭建基于VGG16的图像分类模型步骤三:训练模型步骤四:测试模型运行结果后续模型的优化和改进建议完整代码结束语 引言 在本博客中,小…

antd+vue:tree组件:父级节点禁止选择并不展示选择框——基础积累

antdvue:tree组件:父级节点禁止选择并不展示选择框——基础积累 1.判断哪些是父节点,给父节点添加disabled属性——this.permissionList是数据源2.通过css样式来处理disabled的父节点3.完整代码如下: 最近在写后台管理系统的时候,…

C语言—每日选择题—Day47

第一题 1. 以下逗号表达式的值为() (x 4 * 5, x * 5), x 25 A:25 B:20 C:100 D:45 答案及解析 D 本题考查的就是逗号表达式,逗号表达式是依次计算每个表达式,但是只输出最后一个表…

DRF从入门到精通一(DRF介绍、API接口、接口测试工具)

文章目录 DRF入门规范一、Web应用模式1.前后端混合开发模式2.前后端分离开发模式 二、API接口概念Json格式与XML格式的区别前端、前台、后端以及后台的区别 三、接口测试工具:Postman/Apifox DRF入门规范 DRF(django rest framework)是基于django的一个框架&#xf…

文心一言 VS 讯飞星火 VS chatgpt (157)-- 算法导论12.3 4题

四、用go语言,删除操作可交换吗?可交换的含义是,先删除 x 再删除 y 留下的结果树与先除 y 再删除 x 留下的结果树完全一样。如果是,说明为什么? 否则,给出一个反例。 文心一言: 在Go语言中,删除操作是不…

企业信息建设现状

信息化建设是传统计算机与互联网技术高速发展并融合的产物,现阶段已经成为引领产业创新的决定性技术手段。 随着信息化的不断发展与进步,各行各业都开始了信息化的建设与应用。信息化是未来发展的大趋势,企业运用信息技术可以大幅度提高员工效…

知识|基于混合模式的多余度飞控全数字仿真系统研究

*余度(Redundancy):一种确保安全的设计手段,使得出现两个及以上故障时,才会引起既定不希望发生的工作状态。 飞行控制软件主要完成飞行传感器数据处理、飞行姿态控制和余度管理任务,对保证飞机安全性和可靠…

leetCode算法—2.两数相加

1.给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0…

干货:企业如何讲好品牌故事

品牌故事讲得好,不仅能够体现品牌特色还能向消费者传递品牌精神的重要工具,优秀的品牌故事能够促进产品销量,为品牌带来曝光率,今天媒介盒子就来和大家聊聊:如何讲好品牌故事。 一、 品类历史和故事 品牌虽然是新品牌…

基于单片机智能家具无线遥控控制系统设计

**单片机设计介绍,基于单片机智能家具无线遥控控制系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的智能家具无线遥控控制系统设计可以实现对家具(如灯具、窗帘、空调等)的…

【Python】解读a+=b 和 a=a+b是否一样?看完恍然大悟!

文章目录 前言一、可变对象和不可变对象总结 前言 在Python中,对于可变和不可变对象的行为差异是一个重要概念,特别是在涉及到和操作时。理解这一点对于编写高效且无误的代码至关重要。 一、可变对象和不可变对象 首先,让我们谈谈可变和不可…

JVM的内存分区以及垃圾收集

1.JVM的内存分区 1.1方法区 方法区(永久代)主要用来存储已在虚拟机加载的类的信息、常量、静态变量以及即时编译器编译后的代码信息。该区域是被线程共享的。 1.2虚拟机栈 虚拟机栈也就是我们平时说的栈内存,它是为java方法服务的。每个方法在执行的…

分析若依的文件上传处理逻辑

分析若依的文件上传处理逻辑 注:已经从若依框架完成拆分,此处单独分析一下人家精彩的封装,也来理解一下怎么做一个通用的上传接口!如有分析的,理解的不透彻的地方,大家多多包含,欢迎批评指正&am…

【C语言必学知识点五】指针

指针 导言一、指针与指针变量二、指针变量的创建和指针类型三、指针类型的意义3.1 指针 /- 整数3.2 指针解引用 四、野指针4.1 定义4.2 野指针的成因4.3 指针未初始化4.4 指针越界访问4.5 指针指向的空间被释放4.6 如何规避野指针 五、指针运算5.1指针-整数5.2 指针-指针5.2.1 …

B037-Mybatis基础

目录 为什么需要Mybatis?mybatis简介入门案例其余见代码查询流程增删改流程 - 变动数据要加事务去持久化抽取公共类 mapper接口开发规则概述代码 mapper.xml引入本地约束文件别名日志管理作用log4j的使用规范 井大括号与dollar大括号的区别 框架:半成品&…

Linux篇:信号

一、信号的概念: ①进程必须识别能够处理信号,信号没有产生,也要具备处理信号的能力---信号的处理能力属于进程内置功能的一部分 ②进程即便是没有收到信号,也能知道哪些信号该怎么处理。 ③当进程真的受到了一个具体的信号的时候…

Word公式居中+序号右对齐

Word公式居中序号右对齐 # 号制表位法表格法Mathtype法 # 号 制表位法 表格法 Mathtype法 参考1 参考2

力扣每日一题:2132. 用邮票贴满网格图(2023-12-14)

力扣每日一题 题目:2132. 用邮票贴满网格图 日期:2023-12-14 用时:38 m 32 s 思路:使用前缀和+差分,只是往常是一维,现在变二维了,原理差不多 时间:22ms 内存&#xff1…

certum ev ssl证书1180元一年,360浏览器显示公司名

Certum旗下的EV SSL证书是审核最严的数字证书,不仅对网站传输数据进行加密,还可以对网站身份进行验证,除此之外,它独有的绿色地址栏提升了网站的真实性,增强了客户对网站的信任感。今天就随SSL盾小编了解Certum旗下的E…