C#程序因功能而减速

时间:2015-11-02 04:16:03

标签: c# arduino

我正在编写一个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#的新手,我们将不胜感激。

1 个答案:

答案 0 :(得分:0)

对于从串口读取,我建议你避免使用定时器从串口读取。您可以使用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];
        }
    }
}

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