マイクロコントローラーを介してセンサーからいくつかのシリアルポートから読み取ろうとしています。各シリアル ポートは 2000 を超える測定値を受信します (各測定値は 7 バイトで、すべて 16 進数です)。そして、彼らは同時に発砲しています。現在、4 つのシリアル ポートからポーリングしています。また、各測定値を String に変換し、Stringbuilder に追加します。データの受信が完了すると、ファイルに出力されます。問題は、CPU 消費が非常に高く、80% から 100% の範囲にあることです。
私はいくつかの記事を読み、最後に Thread.Sleep(100) を置きました。データが来ないときの CPU 時間を短縮します。また、BytesToRead が 100 より小さい場合は、各ポーリングの最後に Thread.Sleep を配置します。これは、ある程度役立つだけです。
誰かがシリアルポートからポーリングして取得したデータを処理するソリューションを提案できますか? 何かを取得するたびに追加すると、問題が発生する可能性がありますか?
//I use separate threads for all sensors
private void SensorThread(SerialPort mySerialPort, int bytesPerMeasurement, TextBox textBox, StringBuilder data)
{
textBox.BeginInvoke(new MethodInvoker(delegate() { textBox.Text = ""; }));
int bytesRead;
int t;
Byte[] dataIn;
while (mySerialPort.IsOpen)
{
try
{
if (mySerialPort.BytesToRead != 0)
{
//trying to read a fix number of bytes
bytesRead = 0;
t = 0;
dataIn = new Byte[bytesPerMeasurement];
t = mySerialPort.Read(dataIn, 0, bytesPerMeasurement);
bytesRead += t;
while (bytesRead != bytesPerMeasurement)
{
t = mySerialPort.Read(dataIn, bytesRead, bytesPerMeasurement - bytesRead);
bytesRead += t;
}
//convert them into hex string
StringBuilder s = new StringBuilder();
foreach (Byte b in dataIn) { s.Append(b.ToString("X") + ","); }
var line = s.ToString();
var lineString = string.Format("{0} ---- {2}",
line,
mySerialPort.BytesToRead);
data.Append(lineString + "\r\n");//append a measurement to a huge Stringbuilder...Need a solution for this.
////use delegate to change UI thread...
textBox.BeginInvoke(new MethodInvoker(delegate() { textBox.Text = line; }));
if (mySerialPort.BytesToRead <= 100) { Thread.Sleep(100); }
}
else{Thread.Sleep(100);}
}
catch (Exception ex)
{
//MessageBox.Show(ex.ToString());
}
}
}