c#写一个队列的串口通信
时间: 2023-11-22 18:56:05 浏览: 141
用C#一步步写串口通信.pdf
以下是一个基于C#的队列串口通信示例:
```csharp
using System;
using System.IO.Ports;
using System.Threading;
namespace QueueSerialCommunication
{
class Program
{
static bool _continue;
static SerialPort _serialPort;
static Queue<string> _messageQueue = new Queue<string>(); // 用于存储发送的消息队列
static void Main(string[] args)
{
string portName = "COM1"; // 修改为实际的串口号
int baudRate = 9600; // 修改为实际的波特率
_serialPort = new SerialPort();
_serialPort.PortName = portName;
_serialPort.BaudRate = baudRate;
_serialPort.ReadTimeout = 500;
_serialPort.WriteTimeout = 500;
_serialPort.Open();
_continue = true;
// 启动消息发送线程
Thread sendThread = new Thread(new ThreadStart(SendMessage));
sendThread.Start();
// 启动消息接收线程
Thread receiveThread = new Thread(new ThreadStart(ReceiveMessage));
receiveThread.Start();
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
_continue = false;
sendThread.Join();
receiveThread.Join();
_serialPort.Close();
}
static void SendMessage()
{
while (_continue)
{
if (_messageQueue.Count > 0)
{
string message = _messageQueue.Dequeue();
_serialPort.WriteLine(message);
Console.WriteLine("Sent: " + message);
}
Thread.Sleep(100); // 等待一段时间再发送下一条消息
}
}
static void ReceiveMessage()
{
while (_continue)
{
try
{
string message = _serialPort.ReadLine();
Console.WriteLine("Received: " + message);
}
catch (TimeoutException) { }
}
}
static void EnqueueMessage(string message)
{
_messageQueue.Enqueue(message);
}
}
}
```
这个示例程序创建了一个串口对象并打开串口。它使用两个线程,一个用于发送消息,另一个用于接收消息。发送的消息存储在一个队列中,发送线程每次从队列中取出一条消息进行发送。接收线程不断从串口中读取数据并输出到控制台。
你可以在`EnqueueMessage`方法中将要发送的消息添加到队列中,例如:
```csharp
EnqueueMessage("Hello, world!");
```
串口通信需要注意的一些问题:
- 确保串口配置正确,包括波特率、数据位、停止位、校验位等。
- 发送和接收的消息必须按照约定的协议格式进行编码和解码。
- 发送的消息必须包含结束符,例如换行符或者特定的字符,接收时需要根据结束符进行分包处理。
阅读全文