C# winform 串口读取字节流,MB级别字节流
一、串口读取字节流
在 C# 中使用 Windows Forms (WinForms) 应用程序进行串口通信时,通常会使用 System.IO.Ports
命名空间中的 SerialPort
类。以下是一个简单的示例,展示了如何设置一个串口并读取字节流。
步骤 1: 添加引用
确保你的项目中已经包含了对 System.IO.Ports
的引用。
步骤 2: 创建一个串口实例
在 WinForms 应用程序中,你可以在 Form 的代码文件里创建一个 SerialPort
实例,并设置其属性。
步骤 3: 设置事件处理程序
你需要设置一些事件处理程序来处理数据接收和其他串口事件。
下面是一个简单的例子:
1using System;
2using System.IO.Ports;
3using System.Windows.Forms;
4
5public partial class MainForm : Form
6{
7 private SerialPort serialPort = new SerialPort();
8
9 public MainForm()
10 {
11 InitializeComponent();
12 InitializeSerialPort();
13 }
14
15 private void InitializeSerialPort()
16 {
17 // 设置串口参数
18 serialPort.PortName = "COM1"; // 根据实际设备更改端口号
19 serialPort.BaudRate = 9600; // 根据实际需要更改波特率
20 serialPort.Parity = Parity.None;
21 serialPort.StopBits = StopBits.One;
22 serialPort.DataBits = 8;
23 serialPort.Handshake = Handshake.None;
24
25 // 添加事件处理程序
26 serialPort.DataReceived += SerialPort_DataReceived;
27 serialPort.ErrorReceived += SerialPort_ErrorReceived;
28 serialPort.PinChanged += SerialPort_PinChanged;
29
30 // 打开串口
31 serialPort.Open();
32 }
33
34 private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
35 {
36 // 从串口中读取字节
37 byte[] buffer = new byte[serialPort.BytesToRead];
38 serialPort.Read(buffer, 0, buffer.Length);
39
40 // 处理接收到的数据
41 ProcessReceivedData(buffer);
42 }
43
44 private void ProcessReceivedData(byte[] data)
45 {
46 // 这里可以处理接收到的数据
47 foreach (byte b in data)
48 {
49 Console.WriteLine($"Received byte: {b}");
50 }
51 }
52
53 private void SerialPort_ErrorReceived(object sender, SerialErrorReceivedEventArgs e)
54 {
55 Console.WriteLine("Error received: " + e.EventType);
56 }
57
58 private void SerialPort_PinChanged(object sender, SerialPinChangedEventArgs e)
59 {
60 Console.WriteLine("Pin changed: " + e.EventType);
61 }
62
63 protected override void OnClosing(CancelEventArgs e)
64 {
65 base.OnClosing(e);
66 if (serialPort.IsOpen)
67 {
68 serialPort.Close();
69 }
70 }
71}
注意事项:
- 确保在打开串口之前设置了正确的串口属性(如端口号、波特率等)。
- 在关闭应用程序时,记得关闭串口以避免资源泄漏。
- 如果你的应用程序需要在主线程之外处理串口事件,请注意 UI 更新必须通过
Invoke
或BeginInvoke
方法来进行,因为这些操作需要在 UI 线程中执行。
二、MB级别字节流数据处理
要一次性读取兆级别的数据(例如几百 KB 到几 MB),你需要确保你的串口硬件能够支持这样的传输速率,并且你的软件能够高效地处理大量的数据。以下是一个修改后的示例,用于处理较大的数据量:
步骤 1: 设置 SerialPort 属性
确保你的串口配置正确,能够支持较大的数据传输。例如,如果使用的是 USB 转串口适配器,可能需要较高的波特率(例如 115200 或更高)。
步骤 2: 使用 DataReceived 事件
在 DataReceived
事件处理程序中,你可以使用循环来读取所有可用的数据,直到没有更多数据可读为止。
示例代码
1using System;
2using System.IO.Ports;
3using System.Text;
4using System.Windows.Forms;
5
6public partial class MainForm : Form
7{
8 private SerialPort serialPort = new SerialPort();
9
10 public MainForm()
11 {
12 InitializeComponent();
13 InitializeSerialPort();
14 }
15
16 private void InitializeSerialPort()
17 {
18 // 设置串口参数
19 serialPort.PortName = "COM1"; // 根据实际设备更改端口号
20 serialPort.BaudRate = 115200; // 高速传输可能需要更高的波特率
21 serialPort.Parity = Parity.None;
22 serialPort.StopBits = StopBits.One;
23 serialPort.DataBits = 8;
24 serialPort.Handshake = Handshake.None;
25
26 // 添加事件处理程序
27 serialPort.DataReceived += SerialPort_DataReceived;
28
29 // 打开串口
30 serialPort.Open();
31 }
32
33 private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
34 {
35 try
36 {
37 int bytesToRead = serialPort.BytesToRead;
38 byte[] buffer = new byte[bytesToRead];
39
40 // 循环读取所有可用的数据
41 while (serialPort.BytesToRead > 0)
42 {
43 int bytesRead = serialPort.Read(buffer, 0, buffer.Length);
44 ProcessReceivedData(buffer, bytesRead);
45 }
46 }
47 catch (Exception ex)
48 {
49 Console.WriteLine($"Error reading data: {ex.Message}");
50 }
51 }
52
53 private void ProcessReceivedData(byte[] data, int bytesRead)
54 {
55 // 这里可以处理接收到的数据
56 string text = Encoding.UTF8.GetString(data, 0, bytesRead);
57 Console.WriteLine($"Received data: {text}");
58
59 // 如果需要将数据写入文件或进一步处理,可以在这里实现
60 // 例如:
61 // File.WriteAllBytes("data.bin", data);
62 }
63
64 protected override void OnClosing(CancelEventArgs e)
65 {
66 base.OnClosing(e);
67 if (serialPort.IsOpen)
68 {
69 serialPort.Close();
70 }
71 }
72}
注意事项:
-
缓冲区大小:如果你预期接收的数据量非常大,可能需要调整
buffer
的大小。例如,你可以设置一个固定的较大缓冲区,或者动态调整缓冲区大小。 -
性能考虑:对于大量数据的传输,确保串口驱动和硬件能够支持高速传输。如果硬件限制了数据传输速度,那么即使软件能够处理更大的缓冲区,也可能无法达到预期的性能。
-
错误处理:在读取数据时,一定要注意异常处理,确保程序的健壮性。
-
多线程:如果你的应用程序需要处理其他任务(如用户界面更新),考虑将数据处理逻辑放到另一个线程中执行,以避免阻塞 UI。
-
内存管理:处理大量数据时,要小心管理内存,避免内存溢出等问题。
-
数据完整性:确保数据在传输过程中没有丢失或损坏。你可能需要实现某种形式的校验机制来验证数据的完整性。
相关文章:
C# winform 串口读取字节流,MB级别字节流
一、串口读取字节流 在 C# 中使用 Windows Forms (WinForms) 应用程序进行串口通信时,通常会使用 System.IO.Ports 命名空间中的 SerialPort 类。以下是一个简单的示例,展示了如何设置一个串口并读取字节流。 步骤 1: 添加引用 确保你的项目中已经包含…...
创建一个简单的单链表
1.头文件的Slist.h的代码 #pragma once #include<stdio.h> #include<stdlib.h> #include<assert.h> #include<string.h> typedef int SListint; typedef struct Slist//单链表 {SListint data;struct Slist* next; }SL;//尾插 void SlistPushBank(SL*…...

15.1 Zookeeper简介安装及基础使用
1. Zookeeper介绍 1.1 介绍 1.2 应用场景简介 1.3 zookeeper工作原理 1.4 zookeeper特点...

详细说明Java中Map和Set接口的使用方法
Map与Set的基本概念与场景 Map和set是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例化子类有关。以前常见的搜索方式有: 1. 直接遍历,时间复杂度为O(N),元素如果比较多效率会非常慢。 2. 二分查找&#x…...
CSS3 scale 适配
Scale适配,在前端开发中,特别是在CSS3中,主要指的是使用scale()函数对元素进行缩放处理,以适应不同的屏幕尺寸或达到特定的视觉效果。以下是对Scale适配的详细介绍: 一、基本概念 scale() 是CSS3中transform属性的一…...

SX_初识GitLab_1
1、对GitLab的理解: 目前对GitLab的理解是其本质是一个远程代码托管平台,上面托管多个项目,每个项目都有一个master主分支和若干其他分支,远程代码能下载到本机,本机代码也能上传到远程平台 1.分支的作用:…...

这才是 PHP 高性能框架 Workerman 的立命之本
大家好,我是码农先森。 在这个大家都崇尚高性能的时代,程序员的谈笑间句句都离不开高性能,仿佛嘴角边不挂着「高性能」三个字都会显得自己很 Low,其中众所皆知的 Nginx 就是高性能的代表。有些朋友可能连什么是高性能都不一定理解…...

Python——记录pip问题(解决下载慢、升级失败问题)
在python开发中,经常需要使用到各种各样的库。 pip又是我们常用的安装工具。但是国外的源下载速度实在太慢,经常导致超时。 有很多朋友刚刚学Python的时候,会来问为什么pip下载东西这么慢啊? 而且pycharm里面下载库也是非常的慢…...
Windows Server 2025 Preview 部署 Ⅰ—— ISO下载和硬件要求
目录 1. 预览版下载2. Windows 服务器的硬件要求2.1安装 Windows Server 2025 虚拟机注意事项2.2 CPU2.3 RAM / Memory2.4 存储 Storage2.5 网络 Network2.6 其他需求 1. 预览版下载 下载网站:https://www.microsoft.com/en-in/evalcenter/download-windows-server…...

AI2-CUDA、CuDNN、TensorRT的详细安装教程
一、查看本机的显卡 首先你要看你的电脑是否有NVIDIA的独立显卡,你可以在设备管理器-显示适配器中查看 点击“开始”--找到“NVIDA Control Panel” 点击帮助--系统信息--组件,查看NVCUDA.DLL对应的产品名称,就可以看住CUDA的版本号 这里的版…...
TCP连接中重复使用了两个相同的端口怎么办
1.检查并避免重复配置: 首先,应该检查系统的配置和应用程序的设置,确保没有错误地将多个服务或进程配置为使用相同的端口号。 使用网络监控工具(如netstat、ss等)来查看当前哪些端口正在被使用。 2.使用端口复用选项…...
如何自定义异常
目录 为什么自定义异常自定义异常的步骤参考资料 为什么自定义异常 自定义异常是指开发者根据应用程序的需求和逻辑,自行定义的异常类。与 Java 提供的标准异常类(如 NullPointerException、IOException 等)不同,自定义异常允许程…...

C++中的依赖注入
目录 1.概述 2.构造函数注入 3.setter方法注入 4.接口注入 5.依赖注入框架 6.依赖注入容器 7.依赖注入框架的工作原理 8.依赖注入的优势 9.总结 1.概述 依赖注入是一种设计模式,它允许我们在不直接创建对象的情况下为对象提供其依赖项;它通过将…...
CSS平面转换-平移
平面转换-平移 属性 transform: translate(X轴移动距离, Y轴移动距离); 取值 像素单位取值百分比(参照盒子自身尺寸计算结果)正负均可 技巧translate()只写一个值表示只沿着X轴移动单独设置X或Y轴距离:translateX()或translateY() 代码 …...

Linux-3:Shell编程——基础语法(0-50%)
目录 前言 一、变量 1.定义变量 2.使用变量 3.修改变量 4.将命令的结果赋值给变量 5.只读变量 6.删除变量 二、传递参数 三、字符串 1.字符串举例 2.统计字符串长度 3.字符串拼接 4.截取字符串 总结 前言 Shell是一种程序设计语言。作为命令语言,它…...
C++ --> string类模拟实现(附源码)
欢迎来到我的Blog,点击关注哦💕 前言: C中STL扮演着极其重要的角色,学习C重中之重的就是学习STL,虽然string不作为containers的其中一员,但是也是值得学习的le类。下面就进行string的模拟实现 string的模拟…...

基于PHP+MySQL组合开发的微信活动投票小程序源码系统 带完整的安装代码包以及搭建部署教程
系统概述 在当今数字化时代,微信作为社交媒体的巨头,为企业和个人提供了丰富的互动营销平台。其中,投票活动作为一种有效的用户参与和互动方式,被广泛应用于各种场景。为了满足这一需求,我们推出了一款基于PHPMySQL组…...

利用Arcgis设置分式标注(分子分母标注)
因工作需要,需要设置分式标注,下面详细介绍下如何利用arcgis 设置分式标注,以下操作以供参考,如有疑义可提出。 一、准备工作 软件:arcmap 示例数据:行政区shp矢量图 二、操作步骤 1.添加数据 将行政区sh…...

大麦网抢票攻略:使用Python Selenium实现
随着互联网技术的发展,在线购票已成为人们获取演出、比赛等活动门票的主要方式。然而,面对热门活动,门票往往在开售瞬间被抢购一空。为了解决这一问题,本文将介绍如何利用Python和Selenium技术实现大麦网的自动抢票。 1. 环境准备…...

Navicat 在整个数据库中查找字符
Navicat 在整个数据库中查找字符 1.首先打开Navicat,连接目标数据库。2.选择工具选项卡,选择在数据库或模式中查找。3.查找前填入关键字信息,点击查找4.双击查找到数据,进行查看 说明:当我们知道数据库有数据的关键字,…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...

Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...