我想从几个串口从传感器通过微控制器读取。 每个串行端口将获得超过2000个测量(每个测量为7个字节,所有十六进制)。 他们都在同一时间发射。 现在我是从4个串口轮询。 另外,我每次测量转换成字符串,并将其追加到一个StringBuilder。 当我完成接收数据时,他们将在输出中的文件。 问题是CPU消耗是非常高的,范围从80%至100%。
我去了,虽然一些文章,把Thread.sleep代码(100)结尾。 它减少了CPU的时候没有数据到来。 我也把在Thread.sleep代码每个轮询的末尾时BytesToRead小于100。不仅有助于在一定程度上。
可有人提出一个解决方案,从串口轮询和处理,我得到的数据? 也许追加每次我得到的东西引起该问题的时间?
//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());
}
}
}