C#程序因功能而变慢
我正在编写一个C#程序,通过串行端口与Arduino接口,我有一个函数updateRPMs(),它使程序速度减慢到无法使用的程度。它在使用时每1秒被调用一次。该程序运行几个PWM风扇 以下是函数: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
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];
}
}
}