从VS WPF到Arduino的串行通信时出现奇怪的行为

时间:2016-12-21 12:27:30

标签: c# wpf visual-studio arduino arduino-due

基本概述。我正在从Arduino发送串行数据,因为WPF应用程序。到目前为止,这一切都完美无缺。今天我在Arduino代码中实现了一个循环,寻找一个" Y" (ascii 89)在串口中,如果收到,它会离开循环并返回到我所谓的离线模式,并通过online = false停止发送数据。

现在奇怪的是......

  1. 在此循环之前它工作正常,因此一旦离开“在线循环”,尝试重新发送新数据就必须要做的事情。

  2. 它完全可以从Arduino串口监视器中运行,这表明它是一个WPF问题,尽管代码在上传部分没有改变。

  3. 这两个程序的代码非常大,所以我会尽量保持简洁,同时提供所需的所有信息。

    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时会停止,最后我会向问题发送问题' 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,它也会起作用。我也试过Arduino中的resetFunc(),但这也没有帮助。

    提前致谢。

1 个答案:

答案 0 :(得分:0)

事实证明我的交换机机箱中仍然有一个resetFunc(),这阻止了串行监视器继续发送数据!