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];
}
}
}
我假设您知道如何附加到一个事件,因为您已经在您的代码中使用了计时器 ;)
我正在编写一个 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];
}
}
}
我假设您知道如何附加到一个事件,因为您已经在您的代码中使用了计时器 ;)