我已经在这里阅读了很多有关如何使用.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为执行一些异步任务带来了新的可能性,例如似乎可以在SerialPort流上使用的ReadAsync方法,我很想知道推荐使用什么方法来处理这些情况。
例如,您能否尝试这样的事情,我想您想利用的是 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(); } }