2016-04-29 42 views
0

私はシリアルポートを常に読んで、私のWindows 10の普遍的なアプリ(C#)のテキストボックスに出力を取得します。私はhttps://github.com/ms-iot/samples/tree/develop/SerialSample/CSからMSシリアルサンプルから、このコードを見つけました:どのように私は常時Windows 10のユニバーサル(C#)のシリアルポートを読むことができます

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

を私はが聞く呼び出したときに()ボタンをクリックするだけで機能は、いくつかの回では、それはない、時にはポートを読み込みます。

シリアルポートを常に読み、テキストボックスに出力するソリューションを提供してください。

MainPage.xaml.csの完全なコードはここにある:まもなく記述する場合Arduino_UWP_App

http://pastebin.com/dmsTUBmT

答えて

2

私はGitHubの上の例があります。

private SerialDevice serialPort = null; 
DataReader dataReaderObject = null; 

参照することを忘れないでください:

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

まずあなたがポートを開くことができます。このような方法では、デバイス

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

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

を見つける必要があります:

ここ は主要な変数であります
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; 
     } 
    } 

そして今、あなたがメッセージを聞くことができます。

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

このリンクは質問に答えるかもしれませんが、答えの本質的な部分をここに含めて参考にしてください。リンクされたページが変更された場合、リンクのみの回答は無効になります。 – Marusyk

0

それが操作していることを表示されます読み取りタイムアウトは異なる応答を受け取ることができます。数値が小さいほど(ミリ秒)、読み取り速度が速くなり、読み取りバイト数がBytesAvailableに近いかそれに等しくなります。

数値が大きいほど、レスポンスが遅くなり、フル・リード・バッファ(ソース・デバイスからの複数の応答を含む可能性があります)が発生します。

オリジナルのSerialSampleコードはこれを表示し、ループ内で所定のタイムド・ライトを実行するように変更されている場合、タイムアウト値ごとに異なる応答を読み取ることができます。 PLCデバイスを実験する人は、特定のPLCからどのような応答が期待できるのかを簡単に知ることができます。

+0

正直なところ、私はこれがどのように「時にはポートを読んでいないことがあるのか​​」という質問に関連する可能性があるのか​​分かりません。 –

関連する問題