私は ASM と C for PIC の経験があり、コーディングにはかなり慣れていません。私はまだC#で高レベルのプログラミングを学んでいます。
質問
C# でシリアル ポートのデータ受信および処理プログラムを作成しました。データが失われるのを避け、データがいつ来るかを知るために、DataReceivedイベントを設定し、読み取るバイトがなくなるまで処理メソッドにループします。
これを試みたところ、ループが際限なく続き、データを連続して受信すると、プログラムが他のタスク (取得したデータの処理など) からブロックされました。
C# でのスレッド化について読み、SerialPort.Bytes2Readプロパティを常にチェックするスレッドを作成して、利用可能なデータをいつ取得するかを認識できるようにしました。
新しいデータがまだ読み取られている間にデータを処理できる 2 番目のスレッドを作成しました。バイトが読み取られ、ReadSerial() にさらに読み取るバイトがあり、タイムアウト (シリアルから新しいバイトが読み取られるたびに再起動される) の場合、それらは引き続き処理され、DataProcessing() という名前のメソッドを介してフレームが組み立てられます。 ReadSerial() によって埋められる同じ変数。
これにより望ましい結果が得られましたが、私のソリューション ( ReadSerial()とDataProcessing()スレッドの両方が有効) では、CPU 使用率が 100% まで急上昇したことに気付きました!
このような高い CPU 使用率を引き起こさずに、この問題にどのように対処しますか?
public static void ReadSerial() //Method that handles Serial Reception
{
while (KeepAlive) // Bool variable used to keep alive the thread. Turned to false
{ // when the program ends.
if (Port.BytesToRead != 0)
{
for (int i = 0; i < 5000; i++)
{
/* I Don't know any other way to
implement a timeout to wait for
additional characters so i took what
i knew from PIC Serial Data Handling. */
if (Port.BytesToRead != 0)
{
RxList.Add(Convert.ToByte(Port.ReadByte()));
i = 0;
if (RxList.Count > 20) // In case the method is stuck still reading
BufferReady = true; // signal the Data Processing thread to
} // work with that chunk of data.
BufferReady = true; // signals the DataProcessing Method to work
} // with the current data in RxList.
}
}
}