2015-11-02 2 views
0

Я пишу программу C# для взаимодействия с Arduino через последовательный порт, и у меня есть функция updateRPMs(), которая замедляет работу программы настолько, что она непригодна для использования. Он вызывается каждые 1 секунду, когда он используется. В программе задействовано несколько вентиляторов PWM.C# program Замедление из-за функции

Вот функция:

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

Вы должны использовать Секундомер в C#, чтобы проверить, какая часть кода вызывает проблемы. – niksofteng

+0

Прежде всего, что вызывает эту функцию? Затем, как часто ардуино отправляет данные? Скорость передачи? И почему бы вам не использовать входящие данные из последовательного буфера? И почему вы используете функцию «DiscardOutBuffer»? – frarugi87

+0

1. У меня есть таймер, срабатывающий каждые 1 секунду, вызывающий функцию. 2. каждые 500 мс. 3. 9600. 4. Не знаете, что вы имеете в виду? Я думал, это то, что сделал ReadLine. 5. Я предполагаю, что если я использую ReadLine(), мне не нужно. –

ответ

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]; 
     } 
    } 
} 

Я предполагаю, что вы знаете, как прикрепить к событию, так как вы уже использовали один таймер INI код;)

+1

Спасибо, это и трюк с кодом arduino исправили проблему. В коде arduino была функция, запрашивающая вращение вентилятора, а таймаут по умолчанию - 1 секунда, и получение RPM от 12 вентиляторов заняло некоторое время. И код C# пытался запустить код ни на что, что вызывало замедление. –

Смежные вопросы