Arduino иногда не реагирует при чтении последовательных команд
Когда я отправляю шестнадцатеричные числа через компьютер на Arduino Leonardo, он иногда не реагирует, но последовательный монитор сообщает, что оно было отправлено. Мой код;
void setup()
{
Serial.begin(9600);
pinMode(9, OUTPUT);
pinMode(A0, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
}
void loop()
{
delay(100); // Подождите 100 миллисекунд
Serial.println(Serial.read());
if (Serial.read() == 49) {
Serial.println("left");
analogWrite(9, 1023);
digitalWrite(A0, HIGH);
analogWrite(10, 1023);
digitalWrite(11, LOW);
}
if (Serial.read() == 50) {
Serial.println("right");
analogWrite(9, 1023);
digitalWrite(A0, HIGH);
analogWrite(10, 1023);
digitalWrite(11, LOW);
}
if (Serial.read() == 51) {
Serial.println("backwards");
analogWrite(9, 1023);
digitalWrite(A0, LOW);
analogWrite(10, 1023);
digitalWrite(11, LOW);
}
if (Serial.read() == 52) {
Serial.println("forwards");
analogWrite(9, 1023);
digitalWrite(A0, HIGH);
analogWrite(10, 1023);
digitalWrite(11, HIGH);
}
if (Serial.read() == 48) {
Serial.println("stop");
analogWrite(9, 0);
digitalWrite(A0, LOW);
analogWrite(10, 0);
digitalWrite(11, LOW);
}
}
Когда я отправляю числа 1,2,3,4 и 0, он читает, что делает команда. Контакты A0 и D11 управляют направлением контроллера двигателя, а контакты D9 и D10 — скоростью.
@Kyle_3_1415, 👍-1
Обсуждение1 ответ
Лучший ответ:
Serial.println(Serial.read()); if (Serial.read() == 49) {
Вы делаете здесь два чтения, а не одно. Итак, вы читаете и отображаете, а затем читаете второй байт (не тот, который вы отобразили).
Было бы гораздо лучше:
int cmd = Serial.read();
Serial.println(cmd);
if (cmd == 49) {
... do something ...
} else if (cmd == 50) {
.. do something else ...
}
И так далее.
Кроме того, зачем использовать цифры, если можно отображать символы ASCII? например.
int cmd = Serial.read();
Serial.println(cmd);
if (cmd == '1') {
... do something ...
} else if (cmd == '2') {
.. do something else ...
}
Вы также можете рассмотреть возможность использования:
if (!Serial.available())
return;
Таким образом, вы не будете проверять несуществующие последовательные данные.
Почему задержка?
Когда я сделал задержку, мне показалось, что это работает лучше., @Kyle_3_1415
- Реализация Dshot на Arduino (протокол ESC)
- Измерение скорости двигателя постоянного тока с помощью поворотного энкодера
- Как остановить серводвигатель в текущем положении при использовании последовательного порта? Я хочу, чтобы он оставался в одном положении при получении «0».
- Multiple Wire.write() не работает для Arduino Nano I2C
- Какие компоненты можно подключить к контактам 0/1 (RX/TX) без предотвращения загрузки кода?
- Каков наилучший (самый быстрый и надежный) способ отправки сообщений между Python на ПК и Arduino через последовательный порт?
- Serial — отправляет данные в Arduino, пока Arduino отправляет данные
- 2 кнопки нажаты одновременно, логика лифта
последовательный монитор печатает байт, отличный от того, который управляет двигателями, @jsotola