使用.NET框架读取串行端口的正确方法是什么?

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

这是我现在使用的代码:

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为执行某些异步任务带来了新的可能性,例如可能在SerialPort流上使用的ReadAsync方法,我很想知道处理这些情况的推荐方法是什么。

你可以尝试这样的事情,例如我认为你想要使用的是port.ReadExisting()方法

  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 class new SerialPortProgram(); } private 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 Application.Run(); } 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 recievedData = new Queue(); 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(); } } 

我使用了与@MethodMan类似的代码,但我必须跟踪串口发送的数据,并查找终止字符以了解串口何时完成发送数据。

 private string buffer { get; set; } private SerialPort _port { get; set; } public Port() { _port = new SerialPort(); _port.DataReceived += new SerialDataReceivedEventHandler(dataReceived); buffer = string.Empty; } private void dataReceived(object sender, SerialDataReceivedEventArgs e) { buffer += _port.ReadExisting(); //test for termination character in buffer if (buffer.Contains("\r\n")) { //run code on data received from serial port } }