Arduino - связь с ПК - PullRequest
       9

Arduino - связь с ПК

0 голосов
/ 24 апреля 2018

Я написал небольшую программу wpf для управления некоторыми светодиодами.Я построил 4 различных режима:

LEDON, LEDOFF, DIMMING, FLASH

Это очень просто и отлично работает.Я посылаю a, b, c или d (4 разные кнопки) в arduino и выполняю соответствующий цикл.

Теперь я пытаюсь создать слайдер в моей программе WPF, который может управлять яркостью светодиодов.Мой ползунок создает значения от 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 голосов
/ 29 июля 2019
  1. Где вы читаете напечатанные вами значения Arduino? WPF или Arduino Serial Monitor. Если WPF, пожалуйста, прочитайте в последовательном мониторе, чтобы проверить, если это то же самое?

  2. Вы используете var ArduVal = serialPort1.ReadByte (); в приложении C # в Arduino вы используете Serial.print (входящий);

Поскольку вы читаете байты, вам следует использовать Serial.write () вместо Serial.print ()

  1. Также попробуйте использовать функцию Serial.ReadExisting () из C #
0 голосов
/ 05 июня 2018

вы не показываете весь свой код 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 голосов
/ 29 апреля 2019

Я сделал Java-приложение для связи с Arduino и хотел отправить значения PWM в Arduino.Я использовал ArduinoJson для декодирования значений от 0 до 255. Вы должны отправить JSON-кодированные строки в Arduino из вашего приложения.

0 голосов
/ 25 апреля 2018

Мне кажется, что вы ищете Serial.readStringUntil и Serial.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);
    }
  }
}
...