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

示例代码,仅供参考。

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

相关推荐
小羊没烦恼!11 小时前
系统内部模块(子系统)之间的耦合以及模块(子系统)划分
java·开发语言·前端·数据库·算法·c#
UIU11413 小时前
头文件可以防什么错?运用头文件做声明
c++·学习·c#
鑫 源19 小时前
C#源码开源, 获取macOS 电池数据,包括iOS (xamarin开发)
c#·.net·xamarin
爱吃奥利奥_wen1 天前
面向对象三板斧:封装、继承、多态,到底在“装“什么、“承“什么、“变“什么?
开发语言·经验分享·c#
阿钱真强道2 天前
课时03 嵌入式技术应用设计实训 | 串口通信:USART 收发二进制 与 printf
串口·usart·二进制协议·printf重定向·stm32f103·嵌入式入门·中断接收
wflynn2 天前
GitHub 今日推荐|SCSKiller:游戏着色器预编译消除卡顿
开源·c#·github·nvidia·amd·directx12
疯狂的维修2 天前
关于用C#写电机起保停控制
开发语言·c#
用户788477316342 天前
门店核销闭环:小程序扫码 + .NET 幂等接口 + WPF 看板,一天能跑通
微信小程序·c#
samble3 天前
从零搭建灌装监控系统(十三):报警系统设计,生命周期与通知
c#·wpf·mvvm·modbus·工业控制
miofly3 天前
GitHub 今日推荐|SCSKiller:游戏着色器预编译消除卡顿
开源·c#·github