webentwicklung-frage-antwort-db.com.de

Was ist der richtige Weg, um eine serielle Schnittstelle mit .NET Framework zu lesen?

Ich habe hier viele Fragen zum Lesen von Daten von seriellen Ports mit der .NET-Klasse SerialPort gelesen, aber keiner der empfohlenen Ansätze hat sich für mich als vollständig effizient erwiesen.

Hier ist der Code, den ich gerade benutze:

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

Und der Eventhandler:

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

Aber manchmal fehlen mir noch Daten. Ich habe versucht, die Daten in der Ereignisbehandlungsroutine auf andere Weise zu lesen, aber ohne Glück.

Da .NET 4.5 neue Möglichkeiten bietet, einige asynchrone Aufgaben auszuführen, z. B. mit der ReadAsync -Methode, die in einem SerialPort-Stream verwendet werden kann, bin ich gespannt, welche Vorgehensweise empfohlen wird diese Fälle.

30

Könnten Sie so etwas ausprobieren? Ich denke, Sie möchten die port.ReadExisting () -Methode verwenden

 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()); 
    } 
}

Oder möchten Sie es basierend auf dem, was Sie versucht haben, tun, können Sie dies versuchen

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();
        }
  }
22
MethodMan

Ich habe ähnlichen Code wie @MethodMan verwendet, aber ich musste die Daten verfolgen, die der serielle Anschluss sendete, und nach einem Abschlusszeichen suchen, um zu wissen, wann der serielle Anschluss die Daten gesendet hat.

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
    }
}
4
user1184321
    using System;
    using System.IO.Ports;
    using System.Threading;

    namespace SerialReadTest
    {
        class SerialRead
        {
            static void Main(string[] args)
            {
        Console.WriteLine("Serial read init");
        SerialPort port = new SerialPort("COM6", 115200, Parity.None, 8, StopBits.One);
        port.Open();
        while(true){
          Console.WriteLine(port.ReadLine());
        }

    }
}
}
1
Vimukthi Sineth