シリアルポートからデータを受信し、各行をキューに入れ、行をデキューし、わずかにフォーマット (先頭の文字を削除、トリミングなど) してから、フォーマットされた行をリストボックスに表示しています。
タイマーを使用して、200 ミリ秒ごとに Dequeuing メソッドを起動しています。すべてが機能していますが、少し遅い/遅いようです。
デキューとフォーマットを処理するために BackgroundWorker を使用することを検討していますが、行き詰まっています。
FormLoad で backgroundworker を開始しようとしましたが、すぐにコードを 1 回だけ実行することに気付きました。ループを作成するためにバックグラウンド ワーカー コード内でラベルと goto を試しましたが (よくわかりません)、CPU 使用率が高くなり、機能しませんでした。
また、シリアル受信イベントで「 backgroundWorker1.RunWorkerAsync(); 」を使用して、新しいデータが入るたびに実行しようとしましたが、「バックグラウンドワーカーは現在ビジーです」という例外がスローされます
そのため、キューを継続的に処理 (デキュー) するには、バックグラウンド ワーカーが必要です。
コード: ここにデータ受信イベントがあり、その下にバックグラウンド ワーカーにあるデキュー コードがあります。どんな助けでも大歓迎です。
// Serial Data Received
private void serialPort1_DataReceived(
object sender,
System.IO.Ports.SerialDataReceivedEventArgs e)
{
RxString = serialPort1.ReadTo("\u0003");
q.Enqueue(RxString);
}
次のコードはデキュー コードです。
// Dequeue items, format, then display in listbox
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
if (q.Count == 0)
{
// do nothing if q is empty
}
else
do
{
output = (q.Dequeue().ToString());
output = output.TrimStart(new char[] { (char)02 });
output = output.TrimEnd(new char[] { (char)03 });
if (output.StartsWith("C"))
{
ClearAll();
}
else if (output.StartsWith("W98"))
{
txtTax.Text = (output.Remove(0, 5));
}
else if (output.StartsWith("W99"))
{
txtTotal.Text = (output.Remove(0, 24));
}
else
{
listOrderItems.Items.Add(output.Remove(0, 5));
listOrderItems.SelectedIndex = listOrderItems.Items.Count - 1;
}
} while (q.Count > 0);
}