C#程序因功能而变慢

C#程序因功能而变慢,c#,arduino,C#,Arduino,我正在编写一个C#程序,通过串行端口与Arduino接口,我有一个函数updateRPMs(),它使程序速度减慢到无法使用的程度。它在使用时每1秒被调用一次。该程序运行几个PWM风扇 以下是函数: private void updateRPMs() { TextBox[] RPMS = { Fan1RPM, Fan2RPM, Fan3RPM, Fan4RPM, Fan5RPM, Fan6RPM, Fan7RPM, Fan8RPM, Fan9RPM, Fan10RPM, F

我正在编写一个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();
        }

    }
我知道我可以把它推到另一个线程,但我正试图让它在计时器启动后立即更新


我想知道是否有什么我可以改变的,或者是否有什么我做过的愚蠢的事情。我是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];
        }
    }
}
String readBuffer=”“;
私有静态无效DataReceivedHandler(
对象发送器,
SerialDataReceivedEventArgs(e)
{
SerialPort sp=(SerialPort)发送方;
readBuffer+=sp.ReadExisting();
int newLineIndex=-1;
而((newLineIndex=readBuffer.IndexOf(“\n”))>=0)
{//分析缓冲区
字符串currentLine=readBuffer.Substring(0,newLineIndex);
如果(currentLine.length()>0)
分析线(电流线);
readBuffer=readBuffer.Substring(newLineIndex+1);
}
}
公共void分析行(字符串数据)
{
静态文本框[]RPM={Fan1RPM、Fan2RPM、Fan3RPM、Fan4RPM、Fan5RPM、Fan6RPM、Fan7RPM、Fan8RPM、Fan9RPM、Fan10RPM、Fan11RPM、Fan12RPM};
List sepData=(data.Split(“;”).ToList();
如果(sepData.Count==12)
{
对于(int i=0;i<12;i++)
{
RPM[i].Text=sepData[i];
}
}
}

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

您应该在C#中使用秒表来检查导致问题的代码部分。首先,是什么调用此函数的?那么,arduino多久发送一次数据?波特率为什么不使用从串行缓冲区传入的数据呢?为什么要使用
丢弃器
功能。我有一个计时器,每1秒启动一次,调用函数。2.每隔500毫秒。3.96004.不知道你是什么意思?我以为ReadLine就是这么做的。5.我想如果我使用ReadLine(),我不需要。谢谢,这和对arduino代码的调整修复了这个问题。arduino代码有一个查询风扇旋转的函数,默认超时为1秒,从12个风扇获取RPM需要一段时间。而C#代码试图在任何东西上运行代码,这导致了速度的减慢。
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];
        }
    }
}