gpt4 book ai didi

c# - 使用 .NET 框架读取串口的正确方法是什么?

转载 作者:IT王子 更新时间:2023-10-29 04:14:52 25 4
gpt4 key购买 nike

我在这里阅读了很多关于如何使用 .NET SerialPort 类从串行端口读取数据的问题,但没有一种推荐方法对我来说是完全有效的。

这是我现在使用的代码:

SerialPort port = new SerialPort("COM1");
port.DataReceived += new SerialDataReceivedEventHandler(MyDataReceivedHandler);

和事件处理程序:

void MyDataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
int count = port.BytesToRead;
byte[] ByteArray = new byte[count];
port.Read(ByteArray, 0, count);
}

但我仍然有时会丢失数据。我尝试了不同的方式来读取事件处理程序中的数据,但没有成功。

随着 .NET 4.5 为执行一些异步任务带来新的可能性,例如 ReadAsync似乎可用于 SerialPort 流的方法,我很想知道处理这些情况的推荐方法是什么。

最佳答案

你能试试这样吗,例如我想你想利用的是 port.ReadExisting() 方法

 using System;
using System.IO.Ports;

class SerialPortProgram
{
// Create the serial port with basic settings
private SerialPort port = new SerialPort("COM1",
9600, Parity.None, 8, StopBits.One);
[STAThread]
static void Main(string[] args)
{
// Instatiate this
SerialPortProgram();
}

private static void SerialPortProgram()
{
Console.WriteLine("Incoming Data:");
// Attach a method to be called when there
// is data waiting in the port's buffer
port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
// Begin communications
port.Open();
// Enter an application loop to keep this thread alive
Console.ReadLine();
}

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
// Show all the incoming data in the port's buffer
Console.WriteLine(port.ReadExisting());
}
}

或者你想根据你想做的来做,你可以试试这个

public class MySerialReader : IDisposable
{
private SerialPort serialPort;
private Queue<byte> recievedData = new Queue<byte>();

public MySerialReader()
{
serialPort = new SerialPort();
serialPort.Open();
serialPort.DataReceived += serialPort_DataReceived;
}

void serialPort_DataReceived(object s, SerialDataReceivedEventArgs e)
{
byte[] data = new byte[serialPort.BytesToRead];
serialPort.Read(data, 0, data.Length);
data.ToList().ForEach(b => recievedData.Enqueue(b));
processData();
}

void processData()
{
// Determine if we have a "packet" in the queue
if (recievedData.Count > 50)
{
var packet = Enumerable.Range(0, 50).Select(i => recievedData.Dequeue());
}
}

public void Dispose()
{
if (serialPort != null)
{
serialPort.Dispose();
}
}

关于c# - 使用 .NET 框架读取串口的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13754694/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com