Связь arduino с компьютером через с#

Тема в разделе "Arduino & Shields", создана пользователем Ann_0, 9 май 2021.

Метки:
  1. Ann_0

    Ann_0 Нуб

    Доброго времени суток!!
    В жалких попытках сделать программу которая будет с компа отправлять сигнал на ардуинку и в ответ получать зажатую клавишу. Программка простая: узнаю порт -> подключаюсь -> две кнопки для отправки "1" и "2"-> и жмакая на любую из кнопок ардуино возвращает Keyboard.press('1или2').
    Проблема в том что например нажав на кнопку "1" ардуино спамит 1, после того как нажал "2" спамит 2 и если нажать еще раз "1" то продолжает спамить 2.
    Можно поменять порядок и количество кнопок эффект будет одинаковым - последняя нажатая не перебивается.

    Вопрос! Есть ли способ для запуска условий не повисая на последнем(они должны чередоваться) или есть какие-то ограничения в работе с платой. Ну или я накосячил в C#.
    Пробовал использовать While, Switch результат везде одинаковый.
    Использую Arduino Leonardo. Arduino ide 1.8.13.

    Код ардуино:
    Код (C++):
    #include <Keyboard.h>
    char incomingByte = 0;
    void setup()
    {
      Serial.begin(250000);
      Keyboard.begin();
    }
    void loop()
    {
    if(Serial.available()>0){incomingByte = Serial.read();}
      if(incomingByte == '0')
      {
        Keyboard.press('1');
      }
      if(incomingByte == '1')
      {
        Keyboard.press('2');
      }
    }
    Код на кнопке в С#:
    Код (C++):
    serialPort.WriteLine("0");
     
     
  2. akl

    akl Гуру

    по идее после превращения ардуины в клавиатуру, serial ваще не должен работать.
     
  3. kemal

    kemal Нуб

    А как происходит отправка команды в ардуину? Вот тот кусок кода на шарпе - он откуда вызывается? Не получается ли так, что ардуина эмулирует нажатие кнопки на клавиатуре, а программа на шарпе в ответ на это снова посылает команду? И получаем бесконечный цикл.

    Как сделать? Сложно сказать, нужно разобраться, что именно хотим получить в итоге.
     
  4. Ann_0

    Ann_0 Нуб

    Проблема что все работает но лочится на последней команде, и как это обойти ...
     
  5. ZAZ-965

    ZAZ-965 Гуру

    Код (C++):
    #include <Keyboard.h>
    char incomingByte = 0;
    void setup()
    {
      Serial.begin(250000);
      Keyboard.begin();
    }
    void loop()
    {
           if  (Serial.available()>0)
                    { incomingByte = Serial.read();
                         if (incomingByte == '0')
                            {  Keyboard.press('1');   }
                         if (incomingByte == '1')
                            { Keyboard.press('2');   }
                    }    
    }
     
     
  6. Ann_0

    Ann_0 Нуб

    К сожалению ничего не изменилось. Также лочится на последней кнопке.
     
  7. akl

    akl Гуру

    а если так?
    Код (C++):
    #include <Keyboard.h>
    char incomingByte = 0;
    void setup()
    {
      Serial.begin(250000);
      Keyboard.begin();
    }
    void loop()
    {
           if  (Serial.available()>0)
                    { incomingByte = Serial.read();
                         if (incomingByte == '0')
                            {  Keyboard.press('1');   }
                         if (incomingByte == '1')
                            { Keyboard.press('2');   }
                         delay(50);
                         Keyboard.releaseAll();
                    }  
    }
     
    но вообще это круто если оно одновременно и как клавиатура и как виртуальный ком-порт работает.
     
    Ann_0 нравится это.
  8. Ann_0

    Ann_0 Нуб

    Дружище твой код не работает, но ты гений !!!!
    Потому что если сделать так то все работает.

    Код (C++):
    #include <Keyboard.h>
    char incomingByte = 0;
    void setup()
    {
      Serial.begin(250000);
      Keyboard.begin();
    }
    void loop()
    {
           if  (Serial.available()>0)
                    { incomingByte = Serial.read();
                         if (incomingByte == '0')
                            {
                              Keyboard.releaseAll();
                              delay(50);
                              Keyboard.press('1');   }
                         if (incomingByte == '1')
                            {
                              Keyboard.releaseAll();
                              delay(50);
                              Keyboard.press('2');   }
                       
                    }
                 
    }
     
  9. akl

    akl Гуру

    это код из стандартного примера. так что если он не работает - это странно

    может 50 мс задержки мало
     
  10. Ann_0

    Ann_0 Нуб

    Да там весь код из стандартного примера, только для uno урок где светодиодом мигают.
    А не срабатывает скорее всего из-за того что я использую зажатие кнопки.
    Но ты напомнил про Keyboard.releaseAll(); и оказалось что если ставить его перед зажатием то все работает.
    Я даже не рассматривал этот вариант, потому что нажатия друг за другом проходили нормально.
    А в итоге все правильно одна кнопка зажата, после чего я зажимаю вторую, не отжимая первую, поэтому ее срабатывание и не видно.
    Как то элементарно, аж стыдно что сразу не додумался.