C# 程序由于功能而变慢

C# program Slowing down due to function

我正在编写一个 C# 程序以通过串行端口与 Arduino 连接,我有一个函数 updateRPMs() 会减慢程序的速度,以至于无法使用。使用时每 1 秒调用一次。该程序运行几个 PWM 风扇。

函数如下:

private void updateRPMs()
    {
        TextBox[] RPMS = { Fan1RPM, Fan2RPM, Fan3RPM, Fan4RPM, Fan5RPM, Fan6RPM, Fan7RPM, Fan8RPM, Fan9RPM, Fan10RPM, Fan11RPM, Fan12RPM };
        List<String> sepData = new List<String>();
        if (CONNECTED)
        {
            String data = serialPort1.ReadLine();
            // MessageBox.Show(data);

            sepData = (data.Split(';').ToList());


            if (sepData.Count == 12)
            {
                for (int i = 0; i < 12; i++)
                {
                    RPMS[i].Text = sepData[i];
                }
            }
            serialPort1.DiscardOutBuffer();
        }

    }

这是 Arduino 发送给程序的东西:

a840.00;b885.00;c0;d0;e0;f0;g1635.00;h2070.00;i0;j0;k0;l0

我知道我可以将它推送到不同的线程,但我试图在计时器触发后立即更新它。

我想知道是否有什么我可以改变的,或者我是否做过任何愚蠢的事情。我是 C# 新手,如有任何帮助,我们将不胜感激。

对于串口读取,我建议你避免使用定时器来读取串口。您可以使用 DataReceived 事件,每次从串行接收到一些数据时都会触发该事件。

当然你可以收到部分数据包,所以最好将数据存储在缓冲区中然后进行分析。

String readBuffer = "";

private static void DataReceivedHandler(
                    object sender,
                    SerialDataReceivedEventArgs e)
{
    SerialPort sp = (SerialPort)sender;
    readBuffer += sp.ReadExisting();

    int newLineIndex = -1;
    while ((newLineIndex = readBuffer.IndexOf("\n")) >= 0)
    { // Analyze buffer
        String currentLine = readBuffer.Substring(0,newLineIndex);
        if (currentLine.length() > 0)
            analyzeLine(currentLine);
        readBuffer = readBuffer.Substring(newLineIndex+1);
    }
}

public void analyzeLine(String data)
{
    static TextBox[] RPMS = { Fan1RPM, Fan2RPM, Fan3RPM, Fan4RPM, Fan5RPM, Fan6RPM, Fan7RPM, Fan8RPM, Fan9RPM, Fan10RPM, Fan11RPM, Fan12RPM };
    List<String> sepData = (data.Split(';').ToList());
    if (sepData.Count == 12)
    {
        for (int i = 0; i < 12; i++)
        {
            RPMS[i].Text = sepData[i];
        }
    }
}

我假设您知道如何附加到一个事件,因为您已经在您的代码中使用了计时器 ;)