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

示例代码,仅供参考。

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

相关推荐
吴可可12313 小时前
多段线局部约束缩放实现
c#
棉晗榜17 小时前
C# HttpClient配置具有tls指纹发起跟浏览器一样的请求解决反爬虫防护
开发语言·爬虫·c#
吴可可12317 小时前
在CAD中点击添加多段线顶点的方法与实现
c#
全栈小517 小时前
【C#】.net core,静态方法线程安全解析,面试时经常被问的线程安全就藏在里面
安全·c#·.netcore
天下无敌笨笨熊18 小时前
C#视频开发心得
开发语言·c#·音视频
LccKyI19 小时前
C#基础编程 面试题汇总(三)
笔记·c#
半亩码田20 小时前
C#转Python第4.1篇:当 try-catch 遇上 try-except:异常处理的大不同
开发语言·python·c#
z落落21 小时前
C# Modbus-RTU 串口读写设备+CRC16+邮件告警
开发语言·c#
DS随心转小程序21 小时前
Gemini只能导出了一部分Word文档,很少的一部分,不是我这个窗口所有的对话内容?
开发语言·人工智能·c#·word·豆包·deepseek·ai导出鸭