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

目录

[1. 创建串口对象](#1. 创建串口对象)

[2. 创建线程用于发送和接收数据](#2. 创建线程用于发送和接收数据)

使用Thread类

使用Task类

[3. 启动线程/任务并管理资源](#3. 启动线程/任务并管理资源)

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

[5. 处理异常和错误(可选)](#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#中使用多个线程来管理多个串口的发送和接收数据了。

示例代码,仅供参考。

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

相关推荐
何以解忧唯有撸码4 小时前
c# + YOLODotNet+OpenCVSharp 实现物品轨迹追踪
计算机视觉·c#·winform·yolov8·opencvsharp
阿松爱学习14 小时前
【Unity开发】局部区域截图功能实现
unity·c#
zhanghaha131415 小时前
C# 系列教程_1 基础语法篇(面向新手系统教程)
开发语言·c#
昂好的day16 小时前
固高运动控制卡实战(下):点位运动与直线/圆弧插补 API 详解
开发语言·c#
淡海水20 小时前
08-02-优化-LINQ与函数式编程的GC代价
unity·c#·.netcore·linq·gc
sali-tec21 小时前
C# 基于OpenCv的视觉工作流-章114-视觉与http通讯
图像处理·人工智能·opencv·计算机视觉·c#
波力海苔夹心脆67521 小时前
C# 委托与事件详解:委托声明、Action/Func、多播、event 与 EventHandler 入门教程
开发语言·c#·.net·上位机·委托·事件
He BianGu2 天前
【笔记】C# 中BindingFlags的详细作用
笔记·c#
?abc!2 天前
(贪心)621. 任务调度器
java·前端·c#
开开心心就好2 天前
电脑小说阅读器,支持朗读和自定义皮肤
服务器·开发语言·javascript·算法·pdf·c#·音视频