さて、私はこの 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() を呼び出す別のスレッドを作成する必要がありますか?