c#串口多线程收发数据
时间: 2023-08-08 07:12:45 浏览: 265
在C#中,可以使用SerialPort类来进行串口通信。要实现多线程收发数据,可以使用以下步骤:
1. 创建一个SerialPort对象,设置好串口相关的属性(如波特率、数据位、停止位等)。
2. 在主线程中调用SerialPort对象的Open方法打开串口。
3. 创建一个新的线程,在该线程中循环读取串口数据,直到该线程被停止。
4. 在该线程中,可以使用SerialPort对象的Read方法读取串口数据,并通过回调方法将数据传递给主线程。
5. 在主线程中,可以使用委托来更新UI界面,显示串口收到的数据。
下面是一个示例代码:
```csharp
using System;
using System.IO.Ports;
using System.Threading;
public class SerialPortThread
{
private SerialPort serialPort;
private Thread thread;
private bool isRunning = false;
public delegate void DataReceivedEventHandler(byte[] data);
public event DataReceivedEventHandler DataReceived;
public SerialPortThread(string portName, int baudRate)
{
serialPort = new SerialPort(portName, baudRate);
serialPort.DataReceived += new SerialDataReceivedEventHandler(SerialPort_DataReceived);
}
public void Start()
{
if (!isRunning)
{
serialPort.Open();
isRunning = true;
thread = new Thread(new ThreadStart(ReceiveThread));
thread.Start();
}
}
public void Stop()
{
if (isRunning)
{
isRunning = false;
thread.Join();
serialPort.Close();
}
}
private void ReceiveThread()
{
while (isRunning)
{
if (serialPort.BytesToRead > 0)
{
byte[] buffer = new byte[serialPort.BytesToRead];
serialPort.Read(buffer, 0, buffer.Length);
DataReceived?.Invoke(buffer);
}
Thread.Sleep(10);
}
}
private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
// do nothing
}
}
```
在主线程中,可以使用以下代码来创建并启动串口线程:
```csharp
SerialPortThread serialPortThread = new SerialPortThread("COM1", 9600);
serialPortThread.DataReceived += new SerialPortThread.DataReceivedEventHandler(OnDataReceived);
serialPortThread.Start();
```
其中,OnDataReceived是回调方法,用于处理串口收到的数据。在该方法中,可以使用委托来更新UI界面,显示串口收到的数据。
```csharp
private void OnDataReceived(byte[] data)
{
this.Invoke(new Action(() =>
{
textBox1.AppendText(Encoding.ASCII.GetString(data));
}));
}
```
在主线程中,可以使用以下代码来停止串口线程:
```csharp
serialPortThread.Stop();
```
阅读全文