Доброго времени суток!! В жалких попытках сделать программу которая будет с компа отправлять сигнал на ардуинку и в ответ получать зажатую клавишу. Программка простая: узнаю порт -> подключаюсь -> две кнопки для отправки "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");
А как происходит отправка команды в ардуину? Вот тот кусок кода на шарпе - он откуда вызывается? Не получается ли так, что ардуина эмулирует нажатие кнопки на клавиатуре, а программа на шарпе в ответ на это снова посылает команду? И получаем бесконечный цикл. Как сделать? Сложно сказать, нужно разобраться, что именно хотим получить в итоге.
Код (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++): #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(); } } но вообще это круто если оно одновременно и как клавиатура и как виртуальный ком-порт работает.
Дружище твой код не работает, но ты гений !!!! Потому что если сделать так то все работает. Код (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'); } } }
Да там весь код из стандартного примера, только для uno урок где светодиодом мигают. А не срабатывает скорее всего из-за того что я использую зажатие кнопки. Но ты напомнил про Keyboard.releaseAll(); и оказалось что если ставить его перед зажатием то все работает. Я даже не рассматривал этот вариант, потому что нажатия друг за другом проходили нормально. А в итоге все правильно одна кнопка зажата, после чего я зажимаю вторую, не отжимая первую, поэтому ее срабатывание и не видно. Как то элементарно, аж стыдно что сразу не додумался.