【WPF开发】上位机开发-串口收发
一、引言
在现代工业控制、嵌入式系统等领域,串口通信作为一种常见的通信方式,被广泛应用于各种场景。C#作为一门强大的编程语言,结合Windows Presentation Foundation(WPF)框架,可以轻松实现串口通信功能。本文将带领大家一步步实现C# WPF串口通信,并在控制台打印接收到的数据。
二、环境准备
在开始编写代码之前,请确保您的开发环境满足以下条件:
- 安装Visual Studio 2019或更高版本。
- 创建一个WPF应用程序项目。
三、实现步骤
1.初始化串口
首先,我们需要创建一个SerialPort
对象,并对其进行配置。以下是一个初始化串口的示例方法:
public bool InitCOM(string PortName)
{serialPort = new SerialPort(PortName, 115200, Parity.None, 8, StopBits.One);serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);serialPort.ReceivedBytesThreshold = 1;serialPort.RtsEnable = true;return OpenPort();
}
在这段代码中,我们设置了串口的名称、波特率、校验位、数据位和停止位。同时,我们为serialPort
对象订阅了DataReceived
事件,以便在接收到数据时进行处理。
2.打开串口
接下来,我们需要编写一个方法来打开串口。以下是一个打开串口的示例方法:
public bool OpenPort()
{try{serialPort.Open();}catch (Exception ex){MessageBox.Show($"无法打开串口: {ex.Message}");return false;}return serialPort.IsOpen;
}
在这段代码中,我们尝试打开串口,并在打开失败时捕获异常,显示错误信息。
3.接收数据并打印到控制台
当串口接收到数据时,会触发DataReceived
事件。我们可以在事件处理程序中读取数据,并将其打印到控制台。以下是一个处理数据接收的示例方法:
private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{int bytesToRead = serialPort.BytesToRead;byte[] readBuffer = new byte[bytesToRead];serialPort.Read(readBuffer, 0, bytesToRead);string str = Encoding.Default.GetString(readBuffer);Dispatcher.Invoke(() =>{MessageBox.Show(str);});Console.WriteLine(str);
}
在这段代码中,我们首先读取串口缓冲区中的数据,然后将其转换为字符串。接着,我们在UI线程上显示一个消息框,并在控制台上打印接收到的数据。
4.发送数据
最后,我们来实现发送数据的功能。以下是一个发送数据的示例方法:
public void SendCommand(string CommandString)
{if (serialPort != null && serialPort.IsOpen){byte[] WriteBuffer = Encoding.ASCII.GetBytes(CommandString);serialPort.Write(WriteBuffer, 0, WriteBuffer.Length);}else{MessageBox.Show("串口未打开,无法发送数据。");}
}
在这段代码中,我们首先检查串口是否已打开,然后发送指定的字符串。
四、总结
通过本文,我们介绍了如何在C# WPF应用程序中实现串口通信,包括初始化串口、打开串口、接收数据、发送数据以及在控制台打印接收到的数据。掌握这些基本技巧,将为您的WPF串口通信项目开发带来极大便利。在实际应用中,您可以根据需求对代码进行优化和扩展,以满足更复杂的功能需求。
界面还在编写中。。。。。
最终代码:
using System;
using System.IO.Ports;
using System.Text;
using System.Windows;
//必要的库public SerialPort serialPort { get; set; }public MainWindow(){InitializeComponent();if (InitCOM("COM9")){Console.WriteLine("Hello, World!");SendCommand("asdasdasd"); // 发送字符}}public bool InitCOM(string PortName){serialPort = new SerialPort(PortName, 115200, Parity.None, 8, StopBits.One);serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);serialPort.ReceivedBytesThreshold = 1;serialPort.RtsEnable = true;return OpenPort();}private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e){int bytesToRead = serialPort.BytesToRead; // 获取实际可读的字节数byte[] readBuffer = new byte[bytesToRead]; // 根据实际可读的字节数分配缓冲区serialPort.Read(readBuffer, 0, bytesToRead); // 读取数据string str = Encoding.Default.GetString(readBuffer); // 将字节数组转换为字符串// 在UI线程上显示消息框Dispatcher.Invoke(() =>{MessageBox.Show(str);});Console.WriteLine(str); // 打印到控制台}public bool OpenPort(){try{serialPort.Open();}catch (Exception ex){MessageBox.Show($"无法打开串口: {ex.Message}");return false;}return serialPort.IsOpen;}public void SendCommand(string CommandString){if (serialPort != null && serialPort.IsOpen){byte[] WriteBuffer = Encoding.ASCII.GetBytes(CommandString);serialPort.Write(WriteBuffer, 0, WriteBuffer.Length);}else{MessageBox.Show("串口未打开,无法发送数据。");}}// 在窗口关闭时,确保串口被关闭protected override void OnClosed(EventArgs e){base.OnClosed(e);if (serialPort != null && serialPort.IsOpen){serialPort.Close();}}
相关文章:
【WPF开发】上位机开发-串口收发
一、引言 在现代工业控制、嵌入式系统等领域,串口通信作为一种常见的通信方式,被广泛应用于各种场景。C#作为一门强大的编程语言,结合Windows Presentation Foundation(WPF)框架,可以轻松实现串口通信功能…...
ubuntu开启 远程登录 允许root远程登录
如果没有22端口服务 sudo apt update sudo apt install openssh-server sudo ufw allow.ssh sudo passwd root 修改配置文件 sudo vim /etc/ssh/sshd_config Port 22 修改为 Port 22 #PermitRootLogin prohibit-password 修改为 PermitRootLogin yes service ssh restart …...

《昇思25天学习打卡营第23天|RNN实现情感分类》
使用RNN进行情感分类:基于IMDB数据集的LSTM应用 引言 情感分析是自然语言处理(NLP)中的一个重要应用,广泛用于电影评论、社交媒体等文本数据的情感分类任务。本文将介绍如何使用递归神经网络(RNN)实现情感…...

机械设计基础B(学习笔记)
绪论 机构:是一些具备各自特点的和具有确定的相对运动的基本组合的统称。 组成机构的各个相对运动部分称为构件。构件作为运动单元,它可以是单一的整体,也可以是由几个最基本的事物(通常称为零件)组成的刚性结构。 构件…...

MybatisPlusException: Error: Method queryTotal execution error of sql 的报错解决
项目场景: 相关背景: 开发环境 开发系统时 系统页面加载正常 ,发布运行环境后运行一段时间,前端页面 突然出现 报错信息, 报错信息如下: MybatisPlusException: Error: Method queryTotal execution erro…...

人工智能领域的顶尖影响力人物(部分代表)
人工智能(AI)是模拟人类智能过程的计算机系统或机器的理论和开发。它致力于创建能够执行需要人类智能的任务的机器,如视觉感知、语音识别、决策制定和翻译之间的语言。AI领域包括机器学习、深度学习、自然语言处理等子领域,并涉及…...
Python:jsonl文件转json文件,并做字段处理
在使用LLaMA-Factory对shenzhi-wang/Llama3-8B-Chinese-Chat(https://huggingface.co/shenzhi-wang/Llama3-8B-Chinese-Chat/tree/main)进行微调时,希望使用COIG-CQIA的小红书数据集(https://huggingface.co/datasets/m-a-p/COIG-…...
安全产品在防御勒索病毒中的作用
在数字时代,网络安全威胁日益严峻,其中勒索病毒尤为猖獗,它通过加密受害者的数据并要求赎金换取解密密钥,给个人和企业带来了巨大的经济损失。然而,关于安全产品是否真正有效的问题一直存在争议。本文将通过一个模拟实…...

NVIDIA 完全过渡到开源 GPU 内核模块
目录 支持的 GPU安装程序更改将包管理器与 CUDA 元包配合使用使用 runfile使用安装帮助程序脚本包管理器详细信息apt:基于 Ubuntu 和 Debian 的发行版dnf:Red Hat Enterprise Linux、Fedora、Kylin、Amazon Linux 或 Rocky Linuxzypper:SUSE …...

learning-cxx 学习cpp 环境配置 + bug解决
学习CPP网址 https://github.com/LearningInfiniTensor/learning-cxx 安装环境 1.配置xmake的环境 xmake是c的构建工具 最简单的配置方法就是安装mcvs,然后选择必要的那两个包 查看版本,是否安装成功 gcc --version g --version2.安装xmake 我的是…...
PHP 多线程和异步编程的常见陷阱
本文由 ChatMoney团队出品 在PHP开发中,多线程和异步编程是提高应用性能和响应速度的重要手段。然而,这些技术也带来了许多挑战和陷阱,如共享状态冲突、死锁、超时、资源泄漏以及调试困难等。本文将详细探讨这些陷阱,并提供相应的…...

STL 哈希 学习总结
概述 基础概念 哈希是通过特定的算法,将任意长度的数据映射为固定长度的数据串中。该映射的结果就被称为哈希值,也可以称为散列值。 例如在存储一个10000这个数据的时候,如果使用数组的话,则需要开辟对应大小空间内存ÿ…...
vue3页面编写-导入导出excel、展开查询项等
数据保持 <router-view v-slot"{ Component, route }"><keep-alive><component :is"Component" :key"route.name" v-if"route.meta.keepAlive" /></keep-alive><component :is"Component" :key…...

Java学习 - Spring Boot整合 Thymeleaf 实例
什么是 Thymeleaf Thymeleaf 是新一代的 Java 模板引擎,类似于 Velocity、FreeMarker 等传统引擎,其语言和 HTML 很接近,而且扩展性更高; Thymeleaf 的主要目的是将优雅的模板引入开发工作流程中,并将 HTML 在浏览器中…...
ubuntu20.04安装终端终结者并设置为默认终端
1、安装 terminator sudo apt-get install terminator 2、Ctrl Alt T 试一下打开什么终端,我的默认启动的是terminator;如果想换换默认的终端,还需以下一步 3、安装dconf-tools,这个是设置默认终端的必须 sudo apt-get install dconf-tools…...

以Zookeeper为例 浅谈脑裂与奇数节点问题
一、脑裂现象的定义与影响 脑裂(split-brain)是指在分布式系统中,因网络分区或其他故障导致系统被切割成两个或多个相互独立的子系统,每个子系统可能独立选举出自己的领导节点。这一现象在依赖中心领导节点(如Elastic…...

最新版kubeadm搭建k8s(已成功搭建)
kubeadm搭建k8s(已成功搭建) 环境配置 主节点 k8s-master:4核8G、40GB硬盘、CentOS7.9(内网IP:10.16.64.67) 从节点 k8s-node1: 4核8G、40GB硬盘、CentOS7.9(内网IP:10…...
C++学习笔记-友元函数的定义与使用
一、引言 在C中,友元函数(Friend Function)是一个独特而强大的特性,它打破了类的封装性,允许一个或多个非成员函数访问类的私有(private)和保护(protected)成员。尽管这…...

熵、交叉熵、KL散度
这里写目录标题 熵KL散度引入交叉熵。交叉熵的二分类公式: 再次理解SoftMax函数结束 熵 熵,是一个物理上的概念,表示一个系统的不确定性程度,或者表示一个系统的混乱程序。 下边是信息熵的演示: 信息熵的公式如下&…...

THS配置keepalive(yjm)
启动完THS管理控制台和THS后,登录控制台,进入实例管理》节点管理,可以分别使用界面配置和编辑配置设置长连接。 1、界面配置 点击界面配置》集群设置,启用长连接,设置长连接数、最大请求数和超时时间。 2、编辑配置 …...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...

mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...

并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...