Не удалось удалить символ 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("  ");
    // перерыв;
    //}
  }
}

, 👍-1


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(). Далее когда в последовательном входном буфере окажется четыре байта, мы попробуем еще раз.

,