我正在编写一个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#的新手,我们将不胜感激。
答案 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];
}
}
}
我假设您知道如何附加到某个事件,因为您已经在代码中使用了计时器;)