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.双击查找到数据,进行查看 说明:当我们知道数据库有数据的关键字,…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
