Не удалось удалить символ T из передатчика Arduino
Я написал код для своего передатчика Arduino. Я хочу отправлять данные на приемник Arduino через последовательные порты Tx и Rx.
Проблема в том, что я не смог отбросить символ «T», и он появляется как выходное значение на выводе 9, 10 или 3.
Это код передатчика и приемника. Мне нужно только изменить код приемника.
Код передатчика:
char HEADER_BYTE = 'T'; // Заголовок символа
#define potPin1 A1 // Контакт потенциометра 1
#define potPin2 A2 // Потенциометр 2 вывод
#define potPin3 A4 // 3-контактный потенциометр
void setup() {
Serial.begin(9600); // Установить скорость передачи данных для последовательной связи
Serial1.begin(9600);
}
void loop() {
int servo1Angle = map(analogRead(potPin1), 0, 1023, 0, 180); // Сопоставить показания потенциометра с диапазоном угла сервопривода
int servo2Angle = map(analogRead(potPin2), 0, 1023, 0, 180); // Сопоставить показания потенциометра с диапазоном углов сервопривода
int motorSpeed = map(analogRead(potPin3), 0, 1023, 0, 250); // Сопоставить показания потенциометра с диапазоном скорости двигателя (настроить на основе драйвера)
// задержка(1);
Serial1.write(HEADER_BYTE); // Отправить символ заголовка
Serial.println(HEADER_BYTE);
Serial1.write(servo1Angle); // Отправить угол сервопривода 1
Serial.println(servo1Angle);
Serial1.write(servo2Angle); // Отправить угол сервопривода 2
Serial.println(servo2Angle);
Serial1.write(motorSpeed); // Отправка скорости двигателя
Serial.println(motorSpeed);
delay(10);
}
Код получателя:
#include <Servo.h>
Servo myservo1;
Servo myservo2;
int pot_pin = 3;
void setup() {
Serial.begin(9600); // Запустить последовательную связь
Serial1.begin(9600);
pinMode(pot_pin,OUTPUT);
myservo1.attach(9);
myservo2.attach(10);
// myservo.write(90); // установить сервопривод в среднюю точку
}
void loop() {
if (Serial1.available() >= 4) {
if (Serial1.peek() == 'T') {
Serial1.read(); // Отбрасываем символ 'T'
}
int incomingByte = Serial1.read();
// переключатель (incomingByte) {
// случай 84:
int pot1 = Serial1.read();
int pot2 = Serial1.read();
int pot3 = Serial1.read();
myservo1.write(pot1);
Serial.print(pot1);
Serial.print(" ");
myservo2.write(pot2);
Serial.print(pot2);
Serial.print(" ");
analogWrite(pot3,3);
Serial.print(pot3);
Serial.println(" ");
// перерыв;
//}
}
}
@anwar alfawdaei, 👍-1
1 ответ
Я вижу здесь две проблемы.
Во-первых, T
— не очень хороший выбор для заголовка. Вы используете
двоичный протокол (из-за Serial.write()
), отправка байтов с
числовые значения от 0 до 250. Константа 'T'
на самом деле означает 84
(код ASCII для заглавной буквы T), и это значение может отображаться
в пределах фактических данных. Если вы хотите оформить свои сообщения заголовком
байт, я предлагаю вам выбрать байт, который не может быть частью тела
сообщение. Например, 255.
Во-вторых, ваша логика прочтения сообщения неверна:
if (Serial1.peek() == 'T') {
Serial1.read(); // Отбрасываем символ 'T'
}
Вы должны спросить себя: что бы делал этот код, если бы байт в верхней части
буфера не 'T'
? Что он должен делать вместо этого? Я думаю,
Правильным решением было бы отбросить все входящие байты, пока не будет найдено
ожидаемый заголовок.
int incomingByte = Serial1.read();
Зачем отбрасывать этот байт? Байт заголовка уже отброшен (если настоящее время). Зачем отбрасывать следующий байт? Это наверняка испортит ваше сообщение.
Я предлагаю что-то вроде этого:
void loop() {
if (Serial1.available() >= 4) {
if (Serial.read() == HEADER_BYTE) {
int pot1 = Serial1.read();
int pot2 = Serial1.read();
int pot3 = Serial1.read();
// ...
}
}
}
Здесь, если мы ожидаем байт заголовка, а получаем что-то еще, мы просто
Отбрасываем полученный байт и переходим к следующей итерации loop()
. Далее
когда в последовательном входном буфере окажется четыре байта, мы попробуем еще раз.
- Arduino Serial.ReadString() проблема
- Как разделить входящую строку?
- Серийный монитор, когда порт используется другим приложением
- String() против char для простого управления потоком
- Как анализировать многострочные последовательные данные с неизвестным количеством строк?
- Найдите ОК или ОШИБКУ в последовательной строке
- Новичок, изучающий Serial.readString()
- Назначение светодиодного индикатора