news 2026/9/3 10:54:52

C# 多个串口多个线程发送数据和接收数据

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C# 多个串口多个线程发送数据和接收数据

目录

1. 创建串口对象

2. 创建线程用于发送和接收数据

使用Thread类

使用Task类

3. 启动线程/任务并管理资源

4. 优雅地关闭串口和线程/任务(可选)

5. 处理异常和错误(可选)


如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

在C#中实现多个串口通信,同时使用多个线程发送和接收数据,可以通过以下几个步骤来实现:

1. 创建串口对象

首先,需要创建一个SerialPort对象,并配置其参数,如波特率、数据位、停止位等。

using System.IO.Ports;

SerialPort serialPort = new SerialPort("COM1")
{
BaudRate = 9600,
Parity = Parity.None,
DataBits = 8,
StopBits = StopBits.One,
Handshake = Handshake.None,
ReadTimeout = 500,
WriteTimeout = 500
};

2. 创建线程用于发送和接收数据

为了使用多个线程,你可以使用Thread类或者更现代的Task类(推荐使用Task,因为它提供了更多的灵活性和功能)。

使用Thread类

Thread sendThread = new Thread(SendData);
Thread receiveThread = new Thread(ReceiveData);

void SendData()
{
serialPort.Open();
while (true) // 或者其他条件判断退出循环
{
if (serialPort.IsOpen)
{
string dataToSend = "Hello"; // 发送的数据
serialPort.WriteLine(dataToSend); // 或者 serialPort.Write(dataToSend);
Thread.Sleep(1000); // 等待1秒再发送
}
}
}

void ReceiveData()
{
serialPort.Open();
while (true) // 或者其他条件判断退出循环
{
if (serialPort.IsOpen)
{
string receivedData = serialPort.ReadLine(); // 或者 serialPort.ReadExisting();
Console.WriteLine("Received: " + receivedData);
}
}
}

使用Task类

Task sendTask = Task.Run(() => SendData());
Task receiveTask = Task.Run(() => ReceiveData());

void SendData()
{
serialPort.Open();
while (true) // 或者其他条件判断退出循环
{
if (serialPort.IsOpen)
{
string dataToSend = "Hello"; // 发送的数据
serialPort.WriteLine(dataToSend); // 或者 serialPort.Write(dataToSend);
Task.Delay(1000).Wait(); // 等待1秒再发送
}
}
}

void ReceiveData()
{
serialPort.Open();
while (true) // 或者其他条件判断退出循环
{
if (serialPort.IsOpen)
{
string receivedData = serialPort.ReadLine(); // 或者 serialPort.ReadExisting();
Console.WriteLine("Received: " + receivedData);
}
}
}

3. 启动线程/任务并管理资源

启动线程或任务,并在不再需要时适当地关闭串口并结束线程或任务。例如:

sendThread.Start(); // 或者 await sendTask; 对于Task使用await关键字在async方法中启动。
receiveThread.Start(); // 或者 await receiveTask; 对于Task使用await关键字在async方法中启动。

4. 优雅地关闭串口和线程/任务(可选)

当不再需要发送或接收数据时,应该优雅地关闭串口和结束线程或任务。例如:

serialPort.Close(); // 关闭串口。对于多线程或多任务环境,确保在所有发送/接收操作完成后再调用。可以使用同步锁或事件来控制。
// sendThread.Abort(); // 不推荐使用Abort,因为它可能导致资源未释放等问题。更好的方式是设置一个标志位来控制循环的退出。例如:bool stop = true; 当需要停止时设置stop=true; 在循环中检查stop。对于Task,可以使用TaskCompletionSource。

5. 处理异常和错误(可选)

在发送和接收数据的方法中添加异常处理逻辑,以便在发生错误时能够优雅地处理:

try { /* 发送或接收代码 */ }
catch (Exception ex) { Console.WriteLine("Error: " + ex.Message); }

这样,你就可以在C#中使用多个线程来管理多个串口的发送和接收数据了。

示例代码,仅供参考。

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 10:37:02

蓝桥杯国赛单片机代码深度解析:模块化、状态机与工程实践

1. 项目概述:从国赛真题到实战代码的深度复盘最近在整理过往的竞赛资料,翻到了第十一届蓝桥杯单片机设计与开发大学组国赛的代码。这不仅仅是一份代码,更像是一份浓缩了特定时期技术挑战、设计思路和临场应对策略的“考古”样本。蓝桥杯的单片…

作者头像 李华
网站建设 2026/9/1 12:23:22

Coze智能体搭建全指南:从0基础入门到企业级工作流实战

Coze(扣子)是目前搭建 AI 智能体绕不开的平台,尤其当你需要把大模型、知识库、插件、工作流和多端发布串在一起时,它能省掉大量从零开发的工作。很多教程会把 Coze 讲得很玄,实际上核心就三件事:搭建智能体…

作者头像 李华
网站建设 2026/9/1 13:15:44

基于springboot+vue跨境电商管理系统的设计与实现(源码+讲解视频+LW)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

作者头像 李华
网站建设 2026/8/31 2:52:49

YOLOv8校园能耗行为识别系统实战指南

简介:目标检测是计算机视觉的基础任务,其核心在于从图像中准确定位并分类感兴趣对象;YOLO系列模型凭借端到端、高效率的特性,成为轻量级部署场景的首选。在智慧校园建设中,将目标检测技术落地为设备状态识别系统&#…

作者头像 李华
网站建设 2026/8/31 22:20:13

FPGA驱动VGA显示:从时序原理到Verilog代码实战

1. 从零到一:为什么选择FPGA驱动VGA? 如果你手头有一块FPGA开发板,想用它来点亮一块老旧的VGA显示器,这绝对是一个经典且极具成就感的入门项目。很多人可能会问,现在都是HDMI、DP的天下了,为什么还要折腾VG…

作者头像 李华
网站建设 2026/8/31 20:12:22

数学建模实战:MATLAB插值与拟合从原理到竞赛应用

1. 从“笔记”到“实战”:为什么我们需要重读经典教材每次翻开《数学建模与数学实验》这类经典教材,尤其是像汪天飞老师编写的版本,我都有一种复杂的感觉。一方面,书中的理论框架清晰,是打基础的绝佳材料;但…

作者头像 李华