Arduino - PC通信

时间:2018-04-24 13:37:54

标签: wpf arduino serial-port

我写了一个小的wpf程序来控制一些LED。我建了4个不同的modi:

LEDON,LEDOFF,DIMMING,FLASH

它很简单,工作正常。我将a,b,c或d(4个不同的按钮)发送到arduino并执行相应的循环。

现在我尝试在我的WPF程序中创建一个可以控制LED亮度的滑块。我的滑块创建了0到255之间的值,我发送给arduino。

现在我问输入的字节是否是一个数字,如果是,我执行一个应该使用analog.write(PIN,value);确定亮度的方法。

WPF:

 private void targetSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            try
            {
                var val = Math.Round(targetSlider.Value).ToString();
                Console.WriteLine("WPF:  " + val);
                serialPort1.Write(val);

                var ArduVal = serialPort1.ReadByte();
                Console.WriteLine("Arduino: " + ArduVal);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

Arduino的:

void loop()
  {
    checkSerial();
    if(lightON)LightON();
    else if(lightOFF)LightOFF();
    else if(lightDIM) LightDIM();
    else if(lightBLINK) LightBLINK();
  }
  void checkSerial()
  {
    while(Serial.available()>0){
      int incoming=Serial.read();
      if(isdigit(incoming)){
        executeSlider(incoming); 
        Serial.print(incoming);
      }
      else{
          char c=incoming;
          executeCommand(c);
        }
    }
  }
   void executeSlider(int val){
        analogWrite(BLUE, val);
        analogWrite(GREEN, val);
        analogWrite(RED, val);
    }

如您所见,我检查滑块的值(发送到arduino)和到达arduino的值。

arduino值总是在50左右通勤。我不明白为什么?我应该通过一个阵列吗?或arudino-PC通信出了什么问题?

控制台输出:

WPF:  2
Arduino: 53
WPF:  4
Arduino: 48
WPF:  4
Arduino: 53
WPF:  5
Arduino: 50
WPF:  6
Arduino: 53
WPF:  8
Arduino: 50
WPF:  8
Arduino: 53
WPF:  10
Arduino: 51
WPF:  10
Arduino: 53
WPF:  12
Arduino: 52
WPF:  13
Arduino: 53
WPF:  14
Arduino: 54
WPF:  14
Arduino: 53
WPF:  15
Arduino: 54
WPF:  16
Arduino: 52
WPF:  16
Arduino: 57
WPF:  17
Arduino: 52
WPF:  18
Arduino: 56
WPF:  20
Arduino: 52
WPF:  20
Arduino: 57
WPF:  21
Arduino: 52
WPF:  22
Arduino: 56
WPF:  23
Arduino: 52
WPF:  25
Arduino: 57
WPF:  26
Arduino: 53
WPF:  27
Arduino: 48
WPF:  29
Arduino: 52
WPF:  30
Arduino: 57
WPF:  31
Arduino: 53
WPF:  32
Arduino: 49
WPF:  33
Arduino: 52
WPF:  34
Arduino: 57
WPF:  35
Arduino: 53
WPF:  37
Arduino: 50

修改 我改变了我的arduino的读取功能

 void checkSerial()
  {
    while(Serial.available()>0){
      int incoming=Serial.read();
      if(isdigit(incoming)){
          int sliderVal=Serial.parseInt();
           executeSlider(sliderVal); 
           Serial.print(sliderVal);
      }
      else{
          char c=incoming;
          executeCommand(c);
      }
    }
  }

但是传入的值仍在48-58之间

4 个答案:

答案 0 :(得分:0)

我认为您所寻找的是Serial.readStringUntilSerial.parseInt()

请注意,parseInt()会忽略任何不是数字或减号的初始字符 还要注意它是必要的阻塞 - 程序执行将阻塞,直到它已读取整数(以空格或\ n

之类的非数字字符结尾)

你可以做这样的事情(只是一个例子):

while(1) {
  int number = Serial.parseInt(); // Read until you find a number(sequence of digits)
  Serial.print(number); // Repeat it back
}
  • 在这种情况下,你忽略了&#39; WPF:&#39;字符串在行的开头

编辑: 我认为奇怪的是:

WPF:  4
Arduino: 48
WPF:  4
Arduino: 53

您是否看到了与您正在尝试的最新Arduino代码相同的行为? 你可以在你的arduino上试试这个代码并查看它报告的内容吗?

loop() {
  while(1) { // Repeat everything back exactly without any conversions or 
    // processing on the part of arduino, byte after byte in hexa format.
    // Alternatives are DEC, HEX and OCT
    if(Serial.available()) {
      Serial.println(Serial.read(), HEX);
    }
  }
}

答案 1 :(得分:0)

你没有显示所有的arduino代码,看起来你想要获得3个值?您无法获取该数据导致您无法解析它。看看这个例子,如果你从任何串口发送任何命令,它会在arduino端执行此操作希望有所帮助。

   /*
    if you wanted to send 4 values.
    you could do something like "setv.1.2.3\n"
    and the data would be parsed to
    cmdv = setv;
    val  = 1;
    val2 = 2;
    val3 = 3;
    */

    String command;

    void loop()
    {
      if (Serial.available())
      {
        char c = Serial.read();
        if (c == '\n')
        {
          parseCommand(command);
          command = "";
        }
        else
        {
          // this is where it gets added
          command += c;
        }
      }
    }
    // parsed
    void parseCommand(String com)
    {
      String cmdv;
      String val;
      String val2;
      String val3;

      // set data like command.val.val2.val3
      cmdv = com.substring(0, com.indexOf("."));
      val = com.substring(com.indexOf(".")  + 2 , com.indexOf(".") + 1);
      val2 = com.substring(com.indexOf(".") + 3 , com.indexOf(".") + 2);
      val3 = com.substring(com.indexOf(".") + 4);


      if (cmdv("setv")) {
        // set values from serial "setv.1.2.3\n"
        //convert the value to int if needed val.toInt()
        // previously define color values as int
        analogWrite(BLUE, val.toInt());
        analogWrite(GREEN, val2.toInt());
        analogWrite(RED, val3.toInt());
      }

      // send values if Serial recieves "sendv.1.2.3\n"
      if (cmdv("sendv")) {
        //convert the value to int if needed val.toInt()
        Serial.println(val.toInt()); // 1
        Serial.println(val2.toInt());// 2
        Serial.println(val3.toInt());// 3
      }

    }

答案 2 :(得分:0)

我制作了一个Java应用程序与Arduino通讯,并希望将PWM值发送到Arduino。我已经使用ArduinoJson来解码0-255之间的值。您必须从应用程序向Arduino发送JSON编码的字符串。

答案 3 :(得分:0)

  1. 您在哪里读取打印的Arduino值? WPF或Arduino串行监视器。 如果是WPF,请在串行监视器中阅读以检查其是否相同?

  2. 您使用var ArduVal = serialPort1.ReadByte();在C#应用程序中,而在Arduino中,则使用Serial.print(incoming);

由于要读取字节,因此应使用Serial.write()而不是Serial.print()

  1. 此外,尝试使用C#中的Serial.ReadExisting()函数