首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Arduino - PC通信

Arduino - PC通信
EN

Stack Overflow用户
提问于 2018-04-24 21:37:54
回答 4查看 222关注 0票数 0

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

LEDON,LEDOFF,调光,闪光

它非常简单,而且运行得很好。我向arduino发送a、b、c或d (4个不同的按钮)并执行相应的循环。

现在我尝试在我的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之间。

EN

回答 4

Stack Overflow用户

发布于 2018-04-25 17:17:23

我想你要找的是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
}

  • 在本例中,您忽略了

行开头的'WPF:‘字符串

编辑:我觉得奇怪的是:

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);
    }
  }
}
票数 0
EN

Stack Overflow用户

发布于 2018-06-05 05:42:35

你没有展示你所有的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
      }

    }
票数 0
EN

Stack Overflow用户

发布于 2019-04-29 12:34:24

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50003135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档