C# 多线程下 串口如何读取不确定长度的字节 串口接收不到数据即为采集结束
时间: 2024-11-06 17:36:27 浏览: 12
在C#中,使用多线程来处理串口数据读取是一种常见的做法,特别是当需要处理不确定长度的数据时。以下是一个基本的步骤和示例代码,介绍如何在多线程环境下从串口读取不确定长度的字节,并在没有接收到新数据时结束采集。
### 步骤:
1. **打开串口**:配置并打开串口。
2. **启动读取线程**:创建一个线程专门用于读取串口数据。
3. **读取数据**:在线程中循环读取串口数据,直到没有新数据为止。
4. **关闭串口**:在读取结束后关闭串口。
### 示例代码:
```csharp
using System;
using System.IO.Ports;
using System.Threading;
class Program
{
static SerialPort serialPort;
static bool keepReading = true;
static void Main(string[] args)
{
// 配置串口参数
serialPort = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
try
{
serialPort.Open();
Console.WriteLine("串口已打开");
// 启动读取线程
Thread readThread = new Thread(ReadFromPort);
readThread.Start();
// 主线程等待用户输入以结束程序
Console.WriteLine("按任意键结束...");
Console.ReadKey();
}
catch (Exception ex)
{
Console.WriteLine("错误: " + ex.Message);
}
finally
{
if (serialPort.IsOpen)
{
serialPort.Close();
Console.WriteLine("串口已关闭");
}
}
}
private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
// 触发事件时,表示有数据到达
Console.WriteLine("数据到达");
}
private static void ReadFromPort()
{
while (keepReading)
{
if (serialPort.BytesToRead > 0)
{
byte[] buffer = new byte[serialPort.BytesToRead];
int bytesRead = serialPort.Read(buffer, 0, buffer.Length);
Console.WriteLine($"读取了 {bytesRead} 个字节");
// 处理读取到的数据
}
else
{
// 如果没有新数据,等待一段时间再检查
Thread.Sleep(100);
}
}
}
}
```
### 说明:
- `SerialPort` 类用于管理串口通信。
- `DataReceived` 事件在串口接收到数据时触发。
- `ReadFromPort` 方法在一个单独的线程中运行,持续检查是否有新的数据可读。
- 使用 `BytesToRead` 属性来判断是否有未读取的数据。
- 通过设置 `keepReading` 变量为 `false` 可以停止读取线程。
这个示例展示了如何在C#中使用多线程来处理不确定长度的串口数据读取,并在没有新数据时自动结束读取过程。
阅读全文