ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

C# 多线程读取多个串口数据

2026/8/29 16:53:29 拓冰建站 浏览量
C# 多线程读取多个串口数据 目录方法1使用 Thread 类方法2使用 Task 类推荐使用如果您喜欢此文章请收藏、点赞、评论谢谢祝您快乐每一天。在C#中处理多线程读取多个串口数据通常涉及使用System.IO.Ports.SerialPort类并通过System.Threading命名空间中的类如Thread、ThreadPool或Task来实现多线程。以下是一些实现此功能的方法方法1使用 Thread 类using System;using System.IO.Ports;using System.Threading;class Program{static void Main(){SerialPort[] ports { new SerialPort(COM1), new SerialPort(COM2) };Thread[] threads new Thread[ports.Length];for (int i 0; i ports.Length; i){ports[i].BaudRate 9600;ports[i].Parity Parity.None;ports[i].StopBits StopBits.One;ports[i].DataBits 8;ports[i].Handshake Handshake.None;ports[i].DataReceived new SerialDataReceivedEventHandler(DataReceivedHandler);ports[i].Open();threads[i] new Thread(new ParameterizedThreadStart(ReadData));threads[i].Start(ports[i]);}Console.WriteLine(Press any key to exit...);Console.ReadKey();for (int i 0; i ports.Length; i){ports[i].Close();threads[i].Join(); // Wait for threads to finish before closing.}}static void ReadData(object port){SerialPort sp (SerialPort)port;while (sp.IsOpen){if (sp.BytesToRead 0){string data sp.ReadLine(); // Assuming data is line-based, use ReadExisting if not line-based.Console.WriteLine($Data received from {sp.PortName}: {data});}}}static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e){SerialPort sp (SerialPort)sender;ThreadPool.QueueUserWorkItem(o ReadData(sp)); // Handle data in the thread pool to avoid blocking the UI thread.}}方法2使用 Task 类推荐使用using System;using System.IO.Ports;using System.Threading.Tasks;using System.Collections.Generic;using System.Linq;class Program{static void Main(){ListTask tasks new ListTask();ListSerialPort ports new ListSerialPort { new SerialPort(COM1), new SerialPort(COM2) };foreach (var port in ports){port.BaudRate 9600;port.Parity Parity.None;port.StopBits StopBits.One;port.DataBits 8;port.Handshake Handshake.None;port.DataReceived new SerialDataReceivedEventHandler(DataReceivedHandler);port.Open();tasks.Add(Task.Run(() ReadData(port))); // Start a task for each ports read operation.}Task.WaitAll(tasks.ToArray()); // Wait for all tasks to complete if needed, otherwise you can continue without waiting for them to complete.Console.WriteLine(Press any key to exit...);Console.ReadKey(); // Prevent the console from closing immediately after starting tasks.foreach (var port in ports) port.Close(); // Close ports after user input or when done with tasks.}static void ReadData(SerialPort port){while (port.IsOpen){if (port.BytesToRead 0){string data port.ReadLine(); // Assuming data is line-based, use ReadExisting if not line-based.Console.WriteLine($Data received from {port.PortName}: {data});}}}static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) Task.Run(() ReadData((SerialPort)sender)); // Handle data in a separate task to avoid blocking the UI thread or main thread.}以上方法仅是示例仅供参考。如果您喜欢此文章请收藏、点赞、评论谢谢祝您快乐每一天。