C#接化发:串口通信

news2024/12/23 8:56:56

文章目录

    • 框架准备
    • 串口准备
    • 接、化、发
    • 测试

源码地址:C# 串口通信测试软件

框架准备

出于简单考虑,首先创建一个Winform项目,本文项目名称为portTest

串口通信,至少有两个串口才能通信,所以拖动两个GroupBox,一左一右,里面分别放置一个Combobox、一个按钮,以及两个TextBox用于发送和接收内容,第二个TextBox要点击右上角的三角选择多行

布局结果为

在这里插入图片描述

其中,串口A和串口B中各控件的名称为

串口A串口B
comboboxcbAcbB
按钮btnABtnB
发送文本框tbSendAtbSendB
接收文本框tbRecvAtbRecvB

串口准备

由于.Net6.0并不内置串口通信模块,所以需要额外下载,点击菜单栏工具->NuGet包管理器->管理解决方案的NuGet包,点击浏览选项卡,搜索Ports,选择System.IO.Ports,在右侧出现的详细信息中,选中portTest项目,点击安装按钮。

在这里插入图片描述

此外,如果没有合适的用于串口测试的硬件设备,可以下载一个虚拟串口,这里推荐开源的com0com,下载之后根据自己电脑位数选择一个进行安装,记住安装路径,安装结束后,打开相应路径中的setupg.exe,如下图所示,通过Add Pair可以添加串口对

在这里插入图片描述

在添加串口对之后,在右侧最上方可以更改串口名字,例如改为COM4COM5,然后点击apply,串口名字就会在左侧发生更改。根据右侧线路图可知,发给COM4的信息,会被转发给COM5;发给COM5的信息则会转发给COM4

接、化、发

点击F7进入代码页面,开始串口开发,主要分为一下流程。

本文基于.Net6.0在顶级语句中开发,所以不需要额外using;否则的话需要添加using System.IO.Ports;,以确保串口可以调用。并声明两个全局变量,用于后续的串口通信。

  SerialPort pA;
  SerialPort pB;

然后,确保combobox可以正确识别串口名称,故而在 InitializeComponent();下方,添加如下循环

foreach (var item in SerialPort.GetPortNames())
{
    cbA.Items.Add(item);
    cbB.Items.Add(item);
}

其中,GetPortNames函数可以获取所有可用的串口名称。

接下来,双击连接按钮,创建点击命令,下面以按钮A进行示例,对按钮B只需将所有的A换成B即可。

private void btnA_Click(object sender, EventArgs e)
{
    if (btnA.Text=="连接"){
        pA = new SerialPort(cbA.SelectedItem.ToString(), 
            115200, Parity.Odd, 7, StopBits.One);
        pA.Open();
        pA.DataReceived += PA_DataReceived;
        btnA.Text = "断开";
    }
    else{
        pA.Close();
        btnA.Text = "连接";
    }
}

SerialPort的构造函数中,输入参数分别是串口名称、波特率、校验位、长度、截止位。

PA_DataReceived是一个委托,为串口接收到数据时执行的操作,一般写完+=之后,点击回车VS会自动创建,其内容为

private void PA_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    byte[] data = new byte[pA.BytesToRead];
    pA.Read(data, 0, data.Length);//从串口读取数据
    string info = Encoding.UTF8.GetString(data);
    tbRecvA.BeginInvoke(new Action(() => { tbRecvA.Text += $"接收:{info}"; }));
}

由于串口的接收函数是异步执行的,并不属于窗口主线程,所以当串口接收到数据后,如果想在窗口中显示,就必须用BeginInvoke来另开一个线程。

最后,编写串口的发送程序,当tbSend检测到回车键时,则发送文本框中的内容。

代码为

private void tbSendA_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode != Keys.Enter)
        return;
    var data = Encoding.UTF8.GetBytes(tbSendA.Text);
    tbRecvA.Text += $"发送:{tbSendA.Text}\n";
    pA.Write(data, 0, data.Length);
}

测试

上面只实现了A组串口,将B组串口用相同的方法实现后,就可以进行测试了,效果如下

在这里插入图片描述

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

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

相关文章

Python 3 使用Hive 总结

启动HiveServer2 服务 HiveServer2 是一种可选的 Hive 内置服务,可以允许远程客户端使用不同编程语言向 Hive 提交请求并返回结果。 Thrift服务配置 假设我们已经成功安装了 Hive,如果没有安装,请参考:Hive 一文读懂 。在启动 H…

SAP后台表SE16和SE16N修改后台表数据方法

SAP后台表SE16和SE16N修改后台表数据方法 SAP中直接修改表、视图的Tcode有SE16N和SM30。 一 . SE16N界面输入&SAP_EDIT 其中使用SE16N修改表需要先输入命令&SAP_EDIT,回车左下角显示激活SAP编辑功能后,就可以对相应的表进行新增、删除、修改的操作。 有…

剑指offer44.数字序列中某一位的数字

最后一道题,我一定要自己做出来,想了不到一个小时想法差不多成熟了,但是有一个小细节出问题了,这个问题我在idea上debug都没debug出来。我先讲我的题解然后再讲我这个小问题出在哪里吧。以下是我的代码: class Soluti…

基于.Net Core开发的医疗信息LIS系统源码

SaaS模式.Net Core版云LIS系统源码 医疗信息LIS系统是专为医院检验科设计的一套实验室信息管理系统,能将实验仪器与计算机组成网络,使病人样品登录、实验数据存取、报告审核、打印分发,实验数据统计分析等繁杂的操作过程实现了智能化、自动化…

Mac m1芯片基于parallesls desktop安装Ubuntu

1.Ubuntu镜像下载 访问Ubuntu官网自行选择版本进行下载,可进行以下操作进行版本选择 对于Mac系统,不论VM/PD都需要用arm架构镜像,所以点击arm架构的镜像进行下载 2.准备PD PD安装包: 链接:https://pan.quark.cn/s/46…

深入了解Maven

目录 一.Maven介绍与功能 二.依赖管理 1.依赖的配置 2.依赖的传递性 3.排除依赖 4.依赖的作用范围 一.Maven介绍与功能 maven是一个项目管理和构建工具,是基于对象模型POM实现。 Maven的作用: 便捷的依赖管理:使用Maven可以简化依赖管…

FPGA GTP全网最细讲解,aurora 8b/10b协议,HDMI板对板视频传输,提供2组4套工程源码和技术支持

目录 1、前言免责声明 2、我这里已有的 GT 高速接口解决方案3、GTP 全网最细解读GTP 基本结构GTP 发送和接收处理流程GTP 的参考时钟GTP 发送接口GTP 接收接口GTP IP核调用和使用 4、设计思路框架HDMI输入视频配置及采集视频数据组包GTP aurora 8b/10b数据对齐视频数据解包图像…

四层和七层负载均衡的区别

一、四层负载均衡 四层就是ISO参考模型中的第四层。四层负载均衡器也称为四层交换机,它主要时通过分析IP层和TCP/UDP层的流量实现的基于“IP端口”的负载均衡。常见的基于四层的负载均衡器有LVS、F5等。 以常见的TCP应用为例,负载均衡器在接收到第一个来…

《HeadFirst设计模式(第二版)》第九章代码——组合模式

上一章链接: 《HeadFirst设计模式(第二版)》第九章代码——迭代器模式_轩下小酌的博客-CSDN博客 前面说到,当一个菜单里面出现了子菜单的时候,前面的迭代器模式得换成组合模式。 组合模式: 允许将对象组合成树形结构来表现部分-整…

PyTorch训练深度卷积生成对抗网络DCGAN

文章目录 DCGAN介绍代码结果参考 DCGAN介绍 将CNN和GAN结合起来,把监督学习和无监督学习结合起来。具体解释可以参见 深度卷积对抗生成网络(DCGAN) DCGAN的生成器结构: 图片来源:https://arxiv.org/abs/1511.06434 代码 model.py impor…

跨境电商平台风控揭秘:如何应对刷单风险?

跨境电商平台内部对比被举报的买家信息时,会进行一系列分析来确认是否存在刷评行为。系统会追溯买家的购买记录和留评记录,根据留评率等信息来判断是否存在刷评的行为。如果系统确认买家存在刷评行为,那么该买家曾经留下的所有评价都有可能被…

我国出租车行业的发展伪历史(依赖倒置)

一、前言 既然是“伪历史”,大家就暂且不要纠结故事的真实性了,因为我们今天主要讲的并非是中国出租车的发展史,而是希望通过这个伪历史的例子来用日常生活中的例子,来深入理解一下什么叫依赖倒置。 还是按照惯例,我…

【从零开始学习Linux】常用命令及操作

哈喽,哈喽,大家好~ 我是你们的老朋友:保护小周ღ 本期给大家带来的是 Linux 常用命令及操作,主要有三个分类:文件操作,目录操作,网络操作,创建文件 touch , 创建目录 mkdir , 删除…

【了解一下常见的设计模式】

文章目录 了解一下常用的设计模式(工厂、包装、关系)导语设计模式辨析系列 工厂篇工厂什么是工厂简单工厂「模式」(Simple Factory「Pattern」)简单工厂代码示例:简单计算器优点:缺点: 静态工厂模式特点: 工…

基于Spring Boot的社区诊所就医管理系统的设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频: 基于Spring Boot的社区诊所就医管理系统的设计与实现(Javaspring bootMySQL) 使用技术: 前端:html css javascript jQuery ajax thymeleaf 微信小程序 后端:Java …

改进YOLO系列:2.添加ShuffleAttention注意力机制

添加ShuffleAttention注意力机制 1. ShuffleAttention注意力机制论文2. ShuffleAttention注意力机制原理3. ShuffleAttention注意力机制的配置3.1common.py配置3.2yolo.py配置3.3yaml文件配置1. ShuffleAttention注意力机制论文 论文题目:SA-NET: SHUFFLE ATTENTION …

教育行业选择CRM的四大要求

随着互联网教育的发展和变迁,越来越多的教育机构开始意识到管理客户关系的重要性。然而,对于教育行业来说,选择一款适合自己的CRM系统也不轻松。下面就来说说,教育行业crm要如何来选择? 一、明确使用需求 在进行CRM选…

如何使用 ChatGPT 将文本转换为 PowerPoint 演示文稿

推荐:使用 NSDT场景编辑器 助你快速搭建可二次编辑的3D应用场景 步骤 1:将文本转换为幻灯片演示文稿 第一步涉及指示 ChatGPT 根据给定的文本生成具有特定数量幻灯片的演示文稿。首先,您必须向 ChatGPT 提供要转换的文本。 使用以下提示指示…

Gitlab服务部署及应用

目录 Gitlab简介 Gitlab工作原理 Gitlab服务构成 Gitlab环境部署 安装依赖包 启动postfix,并设置开机自启 设置防火墙 下载安装gitlab rpm包 修改配置文件/etc/gitlab/gitlab.rb,生产环境下可以根据需求修改 重新加载配置文件 浏览器登录Gitlab输…

Azure CLI 进行磁盘加密

什么是磁盘加密 磁盘加密是指在Azure中对虚拟机的磁盘进行加密保护的一种机制。它使用Azure Key Vault来保护磁盘上的数据,以防止未经授权的访问和数据泄露。使用磁盘加密,可以保护磁盘上的数据以满足安全和合规性要求。 参考文档:https://l…