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#中使用多个线程来管理多个串口的发送和接收数据了。

示例代码,仅供参考。

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

相关推荐
Neil201317 小时前
ajax跨域请求
c#
唐青枫17 小时前
别把 Razor 当成几段 HTML:C#.NET Razor Pages、MVC 视图与实战详解
c#·.net
专注仿真1 天前
CMO模型文档-活动单元基类
c#·模型·cmo·活动单元基类
我是苏苏1 天前
Agent 开发实战 :C#实现语义检索!向量数据库Qdrant的下载安装及调试步骤
c#·ai编程
光泽雨1 天前
IEnumerable<T> 详细讲解
c#·c
Lost of 程序猿1 天前
.NET 10 船端单机部署与离线升级实战:从闪退事故到无感回滚
c#·asp.net·.net
淡海水1 天前
11-04-Unity-Span-foreach-LINQ的分配与热路径边界
unity·c#·linq·foreach·span
唐青枫2 天前
对象到底住在哪里?C#.NET 托管堆从分配、GC 到内存排查
c#·.net
fogota2 天前
Emoji与Segoe MDL2 Assets的比较
c#·wpf
灸木2 天前
C# 多线程与异步
c#