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);// 获取可用串口并添加到ComboBoxstring[] 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线程上更新TextBoxBeginInvoke(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,有很多没有完善,比如接收和发送字符串会出现乱码,小弟只是在此抛砖引玉,望各位大神补齐!

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

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

相关文章

数据结构——队列

目录 一、队列的定义 二、队列的实现 1. 队列的顺序存储结构 1.1. 顺序队 1. 创建顺序队 2. 删除顺序队 3. 判断队列是否为空 4. 判断队列是否已满 5. 入队 6. 出队 7. 获取队列长度 8. 获取队首元素 1.2. 环形队 1. 创建环形队 2. 删除环形队 3. 判断环形队列…

C++导出C标准的dll动态库

1 新建项目 1.1 使用VS新建一个空项目 1.2 在属性页中将配置类型改为:动态库(dll) 2 添加头文件 添加文件Api.h,示例代码如下 #pragma once#define DLLEXPORT __declspec(dllexport)extern "C" {DLLEXPORT int getAdd(int a, int b); //求…

C++中的多态你真的了解吗?多态原理全面具体讲解

目录 1. 多态的概念 2. 多态的定义及实现 2.1 多态的构成条件 2.2 虚函数 2.3 虚函数的重写 2.4 C11 override 和 final 2.5 重载、覆盖(重写)、隐藏(重定义)的对比 3. 抽象类 3.1 概念 4. 多态的原理 4.1 虚函数表 4.2多态的原理 4.3 动态绑定与静态绑定 5. 单继…

使用helpdesk帮助台有什么好处?

Helpdesk帮助台是一套帮助IT团队管理IT工单生命周期、自动化日常工作、优化工作流程的集合,它可以帮助IT团队提高生产力、降低成本、改善服务水平和客户体验。 而helpdesk帮助台管理软件所带来的好处不仅限于IT运营,所有利益相关者都会受益,…

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

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

短剧分销平台开发,打造短剧内容变现新模式

短剧目前已经成为了影视行业中的一匹黑马,短剧主要是根据爽文小说翻拍,将小说中精彩高潮的剧情翻拍成短剧爽文,使得观众沉浸在短剧中,欲罢不能! 短剧分销平台是短剧推广的新模式,它打破了传统的分销模式。…

代码随想录算法训练营 | day51 动态规划 309.最佳买卖股票时机含冷冻期,714.买卖股票的最佳时机含手续费

刷题 309.最佳买卖股票时机含冷冻期 题目链接 | 文章讲解 | 视频讲解 题目:给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。 设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多…

启动cad显示丢失mfc140u.dll怎么办?mfc140u.dll丢失有效解决方法分享

在CAD软件或其他软件中,有时候会出现由于找不到mfc140u.dll文件而无法执行代码的错误提示。这个问题可能是由于多种原因引起的,例如文件损坏、缺失或被病毒感染等。下面将介绍五个常见的解决方法,并解释mfc140u.dll丢失的原因以及该文件对CAD…

7-1 六度空间 (PTA-数据结构)

“六度空间”理论又称作“六度分隔(Six Degrees of Separation)”理论。这个理论可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个人你就能够认识任何一个陌生人。”如图1所示…

Openwrt源码下载出现“The remote end hung up unexpected”

最近项目原因需要下载openwrt21.02版本源码,花费了很多时间,找到正确方法后,发现可以节省很多时间,记录下过程,方便自己,可能方便他人。 一.问题阐述 openwrt21.02下载链接如下: git clone -…

Python从入门到精通六:Python数据容器

数据容器入门 为什么学习数据容器 思考一个问题:如果我想要在程序中,记录5名学生的信息,如姓名。 如何做呢? 学习数据容器,就是为了批量存储或批量使用多份数据 Python中的数据容器: 一种可以容纳多份…

直播美颜SDK开发实战:从入门到精通

直播美颜SDK的应用已经成为许多直播平台和开发者关注的焦点。本文将带领读者深入探讨直播美颜SDK的开发实战,从入门到精通的过程。 1.引言 直播美颜SDK是一种集成了图像处理、人脸识别、滤镜算法等技术的开发工具包。通过使用该SDK,开发者能够为直播应…

深度学习 Day14——P3天气识别

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 文章目录 前言1 我的环境2 代码实现与执行结果2.1 前期准备2.1.1 引入库2.1.2 设置GPU(如果设备上支持GPU就使用GPU,否则使用C…

2023 re:Invent使用 PartyRock 和 Amazon Bedrock 安全高效构建 AI 应用程序

前言 本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 亚马逊云科技开发者社区, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道 “Your Data, Your AI, Your Future.(你的数据,你的AI&…

HarmonyOS保存应用数据

数据管理 1 概述 在移动互联网蓬勃发展的今天,移动应用给我们生活带来了极大的便利,这些便利的本质在于数据的互联互通。因此在应用的开发中数据存储占据了非常重要的位置,HarmonyOS应用开发也不例外。 本文将为您介绍HarmonyOS提供的数据管…

统信UOS上图形化配置系统和应用代理

原文链接:统信UOS上图形化配置系统和应用代理 hello,大家好啊,今天我要给大家介绍的是在统信UOS操作系统上如何通过图形化界面配置系统代理和应用代理。在许多公司的内网环境中,直接访问互联网可能受到限制,但通常会提…

智慧工地源码:为施工企业提供专业落地的解决方案

智慧工地利用物联网、大数据、AI等核心技术,实时采集现场数据,自动分析,精准分析、智能决策、科学评价,形成一套数据驱动的新型管理模式。为施工企业提供生产提效、安全可控、成本节约的项目管理解决方案,提升项目部管…

关于linux 磁盘占用排查问题

1.关于磁盘 查看整体磁盘占用大小 df -h 2. 先排除mysql 数据大小 查询库的大小 SELECT table_schema AS "Database", ROUND(SUM(data_length index_length) / 1024 / 1024, 2) AS "Size (MB)" FROM information_schema.TABLES GROUP BY table_schema…

理解Mysql索引原理及特性

作为开发人员,碰到了执行时间较长的sql时,基本上大家都会说”加个索引吧”。但是索引是什么东西,索引有哪些特性,下面和大家简单讨论一下。 1 索引如何工作,是如何加快查询速度 索引就好比书本的目录,提高数…

【力扣】19. 删除链表的倒数第 N 个结点

19. 删除链表的倒数第 N 个结点 相比于昨天,感觉刷题越来越轻松了~ 我进步了! 以后刷题力度要加快了,因为我报了蓝桥杯!加油~ 法一:计算链表长度 思路: 首先用个函数来计算出该链表的长度,然…