2016-04-29 4 views
0

Ich möchte eine serielle Schnittstelle ständig lesen und die Ausgabe in einem Textfeld in meiner Windows 10 Universal App (C#). Ich fand diesen Code aus dem MS serielle Probe von https://github.com/ms-iot/samples/tree/develop/SerialSample/CS:Wie kann ich ständig die serielle Schnittstelle in Windows 10 Universal (C#) lesen

private async void Listen() 
    { 
     try 
     { 
      if (serialPort != null) 
      { 
       dataReaderObject = new DataReader(serialPort.InputStream); 

       while (true) 
       { 
        await ReadAsync(ReadCancellationTokenSource.Token); 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      if (ex.GetType().Name == "TaskCanceledException") 
      { 
       CloseDevice(); 
      } 
     } 
     finally 
     { 
      if (dataReaderObject != null) 
      { 
       dataReaderObject.DetachStream(); 
       dataReaderObject = null; 
      } 
     } 
    } 

    private async Task ReadAsync(CancellationToken cancellationToken) 
    { 
     Task<UInt32> loadAsyncTask; 

     uint ReadBufferLength = 1024; 

     cancellationToken.ThrowIfCancellationRequested(); 

     dataReaderObject.InputStreamOptions = InputStreamOptions.Partial; 

     loadAsyncTask = dataReaderObject.LoadAsync(ReadBufferLength).AsTask(cancellationToken); 

     UInt32 bytesRead = await loadAsyncTask; 
     if (bytesRead > 0) 
     { 
      reciveTextBox.Text = dataReaderObject.ReadString(bytesRead); 
     } 
    } 

aber wenn ich die Hören() aufrufen Funktion mit einem Tastenklick, einige Male liest den Port manchmal nicht.

Bitte geben Sie eine Lösung, die ständig die serielle Schnittstelle lesen und geben Sie die Ausgabe in das Textfeld ein.

Der vollständige Code von MainPage.xaml.cs ist hier: http://pastebin.com/dmsTUBmT

Antwort

2

ich ein Beispiel auf GitHub haben: Arduino_UWP_App

Wenn kurz zu beschreiben. Hier sind Hauptvariablen:

private SerialDevice serialPort = null; 
DataReader dataReaderObject = null; 

Vergessen Sie nicht zu verweisen:

using Windows.Devices.SerialCommunication; 
using Windows.Devices.Enumeration; 
using Windows.Storage.Streams; 

Zuerst sollten Sie finden Gerät

string qFilter = SerialDevice.GetDeviceSelector("COM3"); 
DeviceInformationCollection devices = await DeviceInformation.FindAllAsync(qFilter); 

     if (devices.Any()) 
     { 
      string deviceId = devices.First().Id; 
      await OpenPort(deviceId); 
     } 

In der Art und Weise, wie diese Sie Port öffnen konnte:

private async Task OpenPort(string deviceId) 
    { 
     serialPort = await SerialDevice.FromIdAsync(deviceId); 
     if (serialPort != null) 
     { 
      serialPort.WriteTimeout = TimeSpan.FromMilliseconds(1000); 
      serialPort.ReadTimeout = TimeSpan.FromMilliseconds(1000); 
      serialPort.BaudRate = 9600; 
      serialPort.Parity = SerialParity.None; 
      serialPort.StopBits = SerialStopBitCount.One; 
      serialPort.DataBits = 8; 
      serialPort.Handshake = SerialHandshake.None; 
     } 
    } 

Und jetzt können Sie für Nachrichten hören:

while (true) 
     { 
      await Listen(); 
     } 

.......

private async Task Listen() 
    { 
      if (serialPort != null) 
      { 
       dataReaderObject = new DataReader(serialPort.InputStream); 
       await ReadAsync(ReadCancellationTokenSource.Token); 
      }   
    } 

.......

private async Task ReadAsync(CancellationToken cancellationToken) 
    { 
     Task<UInt32> loadAsyncTask; 

     uint ReadBufferLength = 256; // only when this buffer would be full next code would be executed 
     dataReaderObject.InputStreamOptions = InputStreamOptions.Partial; 
     loadAsyncTask = dataReaderObject.LoadAsync(ReadBufferLength).AsTask(cancellationToken); // Create a task object 

     UInt32 bytesRead = await loadAsyncTask; // Launch the task and wait until buffer would be full 

     if (bytesRead > 0) 
     { 
      string strFromPort = dataReaderObject.ReadString(bytesRead); 
     } 
    } 
+0

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. – Marusyk

0

es, dass die durch die Manipulation erscheint Lese-Timeout kann man verschiedene Antworten erhalten. Je niedriger die Anzahl (Millisekunden), desto höher die Lesegeschwindigkeit und die gelesenen Bytes sind näher oder gleich dem, was BytesAvailable waren.

Je höher die Zahl, desto langsamer die Antwort und desto vollständiger der Lesepuffer (der mehr als eine Antwort vom Quellgerät enthalten kann).

Der ursprüngliche SerialSample-Code würde dies anzeigen, und wenn er so geändert wird, dass er vorbestimmte zeitgesteuerte Schreibvorgänge in einer Schleife ausführt, kann man die erwarteten Antworten für jeden Zeitüberschreitungswert auf andere Weise lesen. Diejenigen, die mit SPS-Geräten experimentieren, werden wahrscheinlich in der Lage sein, dies leicht zu erkennen, welche Art von Antwort von einer bestimmten SPS zu erwarten ist.

+0

Ehrlich gesagt verstehe ich nicht, wie dies mit der Frage verbunden werden kann "manchmal liest es den Port manchmal nicht." –

Verwandte Themen