2016-12-21 10 views
1

Основной обзор. Я отправляю серийные данные из Arduino. Из-за приложения WPF. До сих пор все это прекрасно работало. Сегодня я реализовал цикл в коде Arduino, который ищет «Y» (ascii 89) в последовательном порту, если он получен, он покидает цикл и возвращается обратно в то, что я вызываю в автономном режиме, и прекращает отправку данных через online = ложный.Странное поведение при общении через последовательный порт от VS WPF до Arduino

Теперь то странное в том, что ...

  1. Он работал отлично до этого цикла, поэтому он должен быть что-то делать с попытками отправить новые данные, как только он покинул «онлайн цикл ».

  2. Он отлично работает с серийным монитором Arduino, который предполагает, что это проблема с WPF, хотя код не изменился в разделе загрузки.

Код для обеих этих программ довольно большой, поэтому я постараюсь, чтобы он был кратким, предоставляя всю необходимую информацию.

void loop() { 
    // Check to see if the testbench is in offline mode and run the respective code. 
    if (Online == false) { 
    OfflineMode(); 
    } 
    // Check to see if the testbench is in online mode and run the respective code. 
    if (Online == true) { 
    OnlineMode(); 
    } 
} 

void OfflineMode() { 
    while (Serial.available()) 
    processlncomingByte(Serial.read()); 
    } 

Я тогда случаи переключения для обработки входящих параметров - Я знаю, что это работает отлично, как это будет также загрузить после Arduino сброса.

void processlncomingByte (const byte c) { 
    if (isdigit (c)) { 
    currentValue *= 10; 
    currentValue += c - '0'; 
    } else { 
    // end of digit 
    // The end of the number signals a state change 
    handlePreviousState(); 
    // set the new state, if we recognize it 
    switch (c) { 
     case 'A': 
     state = GOT_A; 
     break; 
etc... 

Интернет Режим

void OnlineMode() { 
    CheckForStop(); 
    SendSerialData(); 
} 

void CheckForStop() { 
    //Serial.println("..."); 
    if (Serial.available() > 0) { 
    //Serial.println("getting something"); 
    ch = (char)Serial.read(); 
    inputString = ch; 
    if (ch == 89) { 
     //Serial.end(); 
     Online = false; 
     //Serial.begin(9600); 
     exit; 
     //return; 
    } 
    } else 
    delay(5); 
} 

SendSerialData() состоит из всего диапазона serial.print, выводя в одну большую строку для WPF для обработки.

Here is a screenshot of the serial monitor working

Как вы увидите по ссылке выше, монитор выплевывает нагрузку данных, останавливается, когда я посылаю Y и, наконец, я посылаю Q на «вопрос» ли Arduino готов к приему параметров а S означает «Да». Отличный материал!

Однако, как вы можете видеть из приведенной ниже ссылки, это не относится к WPF. Извините, я могу загрузить только 2 изображения на данный момент, поэтому пришлось их комбинировать.

Combo of screenshots

Вот цикл в настоящее время она застрять в

private bool checkArduinoisReady() { 
    Stopwatch Uploadtimer = new Stopwatch(); 
    if (!myPort.IsOpen) 
    return false; 
    // Debug.Print("port is ready to be opened"); 
    string tempdata; 
    Uploadtimer.Start(); 
    myPort.DiscardInBuffer(); 
    Start: 
    myPort.WriteLine("Q" + Environment.NewLine); 
    Debug.Print("sent Q"); 
    tempdata = myPort.ReadExisting(); 
    Debug.Print("tempdata_" + tempdata.ToString()); 
    if (Uploadtimer.ElapsedMilliseconds > 5000) 
    return false; 
    if (tempdata.Contains("S")) 
    return true; 
    else 
    goto Start; 
} 

И на отдельной странице это, как я могу остановить входящие данные.

private void StopTest(object sender, RoutedEventArgs e) { 
    MessageBoxResult StopConfirm = MessageBox.Show("Are you sure you want to stop the test?", "Stop the test", MessageBoxButton.YesNo, MessageBoxImage.Question); 
    if (StopConfirm == MessageBoxResult.Yes) { 
    Timer.Stop(); 
    Debug.Print("Timer Stopped"); 
    myPort.DiscardInBuffer(); 
    Start: 
    for (int i = 0; i < 100; i++) { 
     myPort.WriteLine("Y"); 
    } 
    string tempData = myPort.ReadExisting(); 
    Debug.Print("Checking..."); 
    Debug.Print("tempData_" + tempData); 
    if (string.IsNullOrWhiteSpace(tempData)) { 
     Debug.Print("Its null!!"); 
     comments_textbox.Text = comments_textbox.Text + "Test Aborted"; 
     MessageBoxResult SaveCurrentData = MessageBox.Show("Would you like to save the data collected up until this point?", "Save", MessageBoxButton.YesNo, MessageBoxImage.Question); 
     if (SaveCurrentData == MessageBoxResult.Yes) { 
     SaveFile(); 
     } 
     if (SaveCurrentData == MessageBoxResult.No) { 
     myPort.Close(); 
     NavigationService.Navigate(new Uri("testSettings.xaml", UriKind.RelativeOrAbsolute)); 
     } 
    } else { 
     Debug.Print("Still going..."); 
     goto Start; 
    } 
    } 
} 

Самый большой камнем преткновения для меня - почему это работает над последовательным монитором, но не в приложении. И он также работает, как только я перезагружаю Arduino. Я также попробовал resetFunc() в Arduino, но это тоже не помогло.

Заранее спасибо.

+0

Прежде всего, я бы поставил небольшую задержку между передающей и повторно действующей функциями.Затем последовательный порт может возвращать также частичное сообщение, поэтому запись «tempdata = myPort.ReadExisting();» неверно (вы должны добавить). Наконец, я буду использовать последовательный порт как устройство ASYNCHRONOUS, а не синхронное. Вы можете использовать 1) таймер для отправки байта Q (например) каждую секунду, а затем, когда вы получите правильную строку, вы можете просто остановить ее. Другой таймер может обнаружить таймаут (и если вы получите правильные данные, просто остановите его до его запуска). Наконец, прочитайте входящие данные через – frarugi87

+0

[Событие DataReceived] (https://msdn.microsoft.com/en-us/library/system.io.ports.serialport.datareceived (v = vs.110) .aspx) Класс SerialPort. Не забудьте всегда добавлять в буфер, а затем удалять из него, когда это делается. Попробуйте это, и я думаю, что это сработает (этот подход обычно сохранял мой день, когда последовательный порт не вел себя правильно) – frarugi87

+0

HI @ frarugi87, спасибо за ответ! Я внедрил таймер, который помогает всем, гораздо приятнее! RE myPort.ReadExisting неверен. Я вижу, откуда вы пришли, тем не менее, чтение и добавление байта, например, в настоящее время не работает, поскольку Arduino, похоже, ничего не отправляет, насколько это касается программного обеспечения. и, следовательно, приложение ничего не получает, и определенно не «S» – charley

ответ

0

Получается, что у меня все еще был resetFunc() в моем случае коммутатора, который мешал последовательному монитору продолжать отправлять данные!