1

さて、私はこの 4 日間、C# でこの SerialPort コントロールを使用して苦労してきましたが、満足のいく結果は得られませんでした。説明させてください:

はかり (単純な要求/応答パターン) をシミュレートする ac# prog と通信するデバイス (Arduino UNO ボード) があり、デバイスは 3 バイトからなるコマンド シーケンスを送信します (重量を要求します): +CHR(13) シミュレーターはシミュレートされた重みで応答します (デバイスがこの重みをキャッチして解析する方法を整理したので、これはもはや問題ではありません)。DataReceive イベントを使用すると、Serialport.Read() を使用してデータを失っているように見えるので、これまでこのアプローチを無駄にしていました。シミュレーターは、常に上記のシーケンスをリッスンしている必要があります。バイト数であり、GUI が必要です。

さらに明確にする必要がある場合は、これまでに行ったコードを提供できます。これに光を当てていただければ幸いです。

前もって感謝します。

更新 1


これは私がこれまで持っているコードです:

ConcurrentQueue<byte> queue = new ConcurrentQueue<byte>();
....
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
   bool listening = true;
   while(listening)
   {
     if(serialPort.BytesToRead > 0)
     {
        byte b = (byte)serialPort.ReadByte();
        queue.Enqueue(b);
     }
   }
}

したがって、コマンドは文字 13 (ASCII では CR) で終了する必要があるため、次のようになります。

public string GetCommand()
{
    string ret = "";
    byte[] ba = new byte[1];
    byte b = (byte)' ';

    while(b!=13)
    {
       if(queue.TryDequeue(out b))
       {
          ba[0] = b;
          ret += ASCIIEncoding.ASCII.GetString([ba]);
       } 
    }
    return ret;
}

この GetCommand() メソッドをテストするために、buton_click イベント内のメイン UI スレッドから呼び出しますが、アプリがハングします。GetCommand() を呼び出す別のスレッドを作成する必要がありますか?

4

2 に答える 2

3

少量のデータならこれでOK。ただし、http 情報を渡す場合のようにデータが大きい場合は、キューのサイズが十分でない可能性があります。したがって、ノンブロッキング タイプのアーキテクチャを使用する必要があると思います。

于 2012-11-09T04:02:14.760 に答える