Почему вывод serial monitor показывает неопознанные символы?

#define LED 13
#define BAUDRATE 9600
#define DEBUGOUTPUT 0
#define LED 13
#define powercontrol 10

// переменные контрольной суммы
byte generatedChecksum = 0;
byte checksum = 0;
int payloadLength = 0;
byte payloadData[64] = {0};
byte poorQuality = 0;
byte attention = 0;
byte meditation = 0;

// системные переменные
long lastReceivedPacket = 0;
boolean bigPacket = false;

///////////////// /////////
// Настройка микропроцессора //
///////////////////////////
void setup() {
  pinMode(LED, OUTPUT);
  Serial.begin(BAUDRATE); // USB
}

/////////////////////////////////
// Чтение данных из последовательного UART //
/////////////////////////////////
byte ReadOneByte() {
  int ByteRead;
  while(!Serial.available());
  ByteRead = Serial.read();
  #if DEBUGOUTPUT 
  Serial.print((char)ByteRead);
  // вывод того же байта из последовательного порта USB (в целях отладки)
  #endif
  return ByteRead;
}

/////////////
//ГЛАВНЫЙ ЦИКЛ//
/////////////
void loop() {
  // Ищем байты синхронизации
  if(ReadOneByte() == 170) {
    if(ReadOneByte() == 170) {
      payloadLength = ReadOneByte();
      if(payloadLength > 169)
      //Длина полезной нагрузки не может быть больше 169
        return;
      generatedChecksum = 0;
      for(int i = 0; i < payloadLength; i++) {
        payloadData[i] = ReadOneByte();
        //Чтение полезной нагрузки в память
        generatedChecksum += payloadData[i];
      }
      checksum = ReadOneByte();
      // Читаем байт контрольной суммы из потока
      generatedChecksum = 255 - generatedChecksum;
      //Возьмем дополнение сгенерированной контрольной суммы
      if(checksum == generatedChecksum) {
        poorQuality = 200;
        attention = 0;
        meditation = 0;
        for(int i = 0; i < payloadLength; i++) {
          // Разбираем полезную нагрузку
          switch (payloadData[i]) {
            case 2:
              i++;
              poorQuality = payloadData[i];
              bigPacket = true;
              break;
            case 4:
              i++;
              attention = payloadData[i];
              break;
            case 5:
              i++;
              meditation = payloadData[i];
              break;
            case 0x80:
              i = i + 3;
              break;
            case 0x83:
              i = i + 25;
              break;
            default:
              break;
          } // выключатель
        } // для цикла

        #if !DEBUGOUTPUT
        // *** Добавьте сюда свой код ***
        if(bigPacket) {
          if(poorQuality == 0) digitalWrite(LED, HIGH);
          else digitalWrite(LED, LOW);
          Serial.print("PoorQuality: ");
          Serial.print(poorQuality, DEC);
          Serial.print(" Attention: ");
          Serial.print(attention, DEC);
          Serial.print(" Time since last packet: ");
          Serial.print(millis() - lastReceivedPacket, DEC);
          lastReceivedPacket = millis();
          Serial.print("\n");
          switch(attention / 10) {
            digitalWrite(LED, HIGH);
            digitalWrite(LED, LOW);
          }
        }
        #endif
        bigPacket = false;
      } else {
        // Ошибка контрольной суммы
      } // конец, если еще для контрольной суммы
    } // конец, если прочитан байт 0xAA
  } // конец, если прочитан байт 0xAA
}

, 👍-1

Обсуждение

Моментальный снимок вывода был бы весьма полезен..., @KC Tucker


2 ответа


2

Пришло время погладить наши хрустальные шары, какие символы?

На самом деле это не имеет большого значения, причиной является ReadOneByte(), вы печатаете ByteRead, не проверяя, можно ли его распечатать. Символ больше 127 будет выглядеть странно при печати, только 32-126 могут быть напечатаны (127 — пробел), см. http://www.asciitable. com/ для более подробной информации. В этом случае я бы напечатал значение как шестнадцатеричное число, Serial.println(ByteRead, HEX);

Если вы все еще получаете символы после изменения, возможно, другие отпечатки имеют ту же проблему

,

0

выберите тот же серийный порт Baudrate в списке внизу окна последовательного монитора, который вы указали в коде.

,