【发布时间】:2021-07-06 17:57:49
【问题描述】:
我的串口数据来自 STM32,格式如下:
Array_A 0.0382, 0.0382, 0.0382, 0.0382, 0.0382, 0.0382, 0.0389, 0.0394, 0.0382
Array_B 0.0077, 0.0077, 0.0077, 0.0077, 0.0077, 0.0077, 0.0077, 0.0077, 0.0077
我对数据的处理代码如下
if (RadioButtonA.Checked || RadioButtonB.Checked)
{
string StrSerialIn = SerialPort1.ReadExisting();
string StrSerialInRam;
System.Windows.Forms.RichTextBox TB = new System.Windows.Forms.RichTextBox();
TB.Multiline = true;
TB.Text = StrSerialIn;
StrSerialInRam = TB.Lines[0];
if (StrSerialInRam.Contains("Poti"))
{
textBox2.Text = StrSerialInRam;
}
StrSerialInRam = TB.Lines[0].Substring(0, 8);
if (StrSerialInRam == "Array_A ")
{
Sen_A = TB.Lines[0];
string[] valA = Sen_A.Split(',');
S1A_Val = valA[0].Substring(8);
S2A_Val = valA[1];
S3A_Val = valA[2];
S4A_Val = valA[3];
S5A_Val = valA[4];
S6A_Val = valA[5];
S7A_Val = valA[6];
S8A_Val = valA[7];
S9A_Val = valA[8];
}
Sen_A = "";
StrSerialInRam = TB.Lines[1];
if (StrSerialInRam.Contains("Poti"))
{
textBox2.Text = StrSerialInRam;
}
StrSerialInRam = TB.Lines[1].Substring(0, 8);
if (StrSerialInRam == "Array_B ")
{
Sen_B = TB.Lines[1];
string[] valB = Sen_B.Split(',');
S1B_Val = valB[0].Substring(8);
S2B_Val = valB[1];
S3B_Val = valB[2];
S4B_Val = valB[3];
S5B_Val = valB[4];
S6B_Val = valB[5];
S7B_Val = valB[6];
S8B_Val = valB[7];
S9B_Val = valB[8];
}
Sen_B = "";
StrSerialInRam = TB.Lines[2];
if (StrSerialInRam.Contains("Poti"))
{
textBox2.Text = StrSerialInRam;
}
}
我的问题是当前的数据处理在 30 Hz 左右完成,但我希望在 350Hz - 400Hz 左右尽快处理我的数据。目前,由于处理速度慢,我正在丢失一些数据。有没有最快的方法来做到这一点?提前致谢。
【问题讨论】:
-
为什么要使用 TextBox 和 RichTextBox 控件来处理数据?此外,永远不要(永远)使用
Lines属性,除非时间根本不算数。使用 StringBuilder 对象来存储您的数据。不要以任何方式使用 UI 元素。 -
所有代码逻辑都包含在一个方法中。您应该以不同的方法(或异步任务/线程)拆分为 UI 逻辑和网络逻辑。将两者混合在一起会导致 UI(冻结或响应缓慢)和网络数据处理的性能问题。
-
@Jimi - 我没有使用过 StringBuilder 对象。你能举一些例子或参考吗?我必须提取来自 STM 的 Array 数据的每个值并将其存储在 datagridview 中。
-
我建议你重建你的代码,StringBuilder 类的功能很容易理解。你还需要更好地解释你的数据是由什么组成的,例如,为什么你有所有这些
if (StrSerialInRam.Contains("Poti")) { textBox2.Text = StrSerialInRam; }。您必须指定接收数据的方式。串行端口通常意味着在 UI 线程以外的线程中引发的事件(例如,DataReceived)。 高速(我们称之为)需要智能缓冲,可能需要处理队列。 -
DataGridView 更新完全是另一回事。您使用的是什么数据源?期待什么样的互动?用户能否以您想要达到的速度读取/评估值? -- .Net 版本也很重要,等等。