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 …

企业微信群发策略:高效触达客户的全新路径

在当前的数字化时代,企业微信已经成为了企业和客户之间沟通交流的主要渠道。通过企业微信进行定向消息群发,我们可以迅速传递信息至目标客户,进而提高品牌知名度、增强用户参与度。为了更好地利用企业微信进行精准、高效的营销推广&#xff0…

贰[2],函数OpenWindow/CloseWindow

函数OpenWindow C形式 LIntExport void OpenWindow( const HTuple& Row, const HTuple& Column, const HTuple& Width, const HTuple& Height, …

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

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

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

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

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

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

女生学习Java合适吗?需要学哪些?

其实女生心思细腻也更容易理解用户心理,更容易注意到其他人注意不到的细节,对这方面感知能力比男性要强,所以说女生做Java也是个不错的选择。 从难易程度上来说,需要一定的逻辑思维能力,Java抽象度较高,在…

C#里面的泛型(T),泛型类,泛型方法,泛型接口等简单解释

https://blog.csdn.net/dap769815768/article/details/81946506 只是比较简单的解释&#xff0c;在实际使用中&#xff0c;如果遇到需要深入研究的场景&#xff0c;再翻阅相关资料深入研究下。 一、泛型T 这个T在实际使用中很常见&#xff0c;比如List<T>。其实我们还…

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

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

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

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

MySql表分区类型

在MySQL中&#xff0c;表分区是一种将大型表拆分成更小、更易管理的部分的技术。表分区可以帮助提高查询性能、简化数据管理和维护等方面。在MySQL中&#xff0c;有几种不同类型的分区可以用于对表进行分区。以下是MySQL中常用的分区类型&#xff1a; 1. RANGE分区&#xff1a…

2024年企业在数据安全战略方面有哪些变化

根据IBM的数据&#xff0c;2023年数据泄露的平均成本达到了创纪录的445万美元&#xff0c;比2020年上涨了15%&#xff0c;仅是财务影响就足以终结一家企业&#xff0c;但数据泄露也可能对品牌声誉和客户对企业的看法产生毁灭性影响。 安全领导人忙得不可开交&#xff0c;随着员…

Python Click 简单使用说明

Python Click库的来源&#xff1a; Click是一个Python的命令行接口库&#xff0c;它由Alexandru Dutra和Ignacio Vergara于2010年创建。Click的目标是提供一种简单而灵活的方式来创建命令行应用程序。 常用参数说明&#xff1a; click.command()&#xff1a;这个装饰器用于定…

EasyCode代码生成模板

前言&#xff1a; EasyCode是 IDEA 开发的一个代码生成插件&#xff0c;主要通过自定义模板&#xff08;基于velocity&#xff09;来生成各种你想要的代码。相信大家都了解EasyCode是干嘛用的&#xff0c;下面是比较简约的一个生成模板&#xff0c;个人比较喜欢。 Controller …

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

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

ubuntu20.04设置开机自启动jar(依赖其他服务)

目的&#xff1a; 有的时候我们的项目是部署在物理机上给其他公司员工使用&#xff0c;对于他们来说操作越简单越好。所以我需要实现将我的jar部署在ubuntu上&#xff0c;实现开机自启。&#xff08;我的项目依赖emqx服务&#xff09;。 步骤&#xff1a; 切换到system目录 …