Почему вывод 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
}
@user31362, 👍-1
Обсуждение2 ответа
▲ 2
Пришло время погладить наши хрустальные шары, какие символы?
На самом деле это не имеет большого значения, причиной является ReadOneByte(), вы печатаете ByteRead, не проверяя, можно ли его распечатать. Символ больше 127 будет выглядеть странно при печати, только 32-126 могут быть напечатаны (127 — пробел), см. http://www.asciitable. com/ для более подробной информации. В этом случае я бы напечатал значение как шестнадцатеричное число, Serial.println(ByteRead, HEX);
Если вы все еще получаете символы после изменения, возможно, другие отпечатки имеют ту же проблему
,
@Code Gorilla
▲ 0
выберите тот же серийный порт Baudrate в списке внизу окна последовательного монитора, который вы указали в коде.
,
@Chamod Pathirana
Смотрите также:
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- В чем разница между Serial.write и Serial.print? И когда они используются?
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Программы построения последовательных данных
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Очистить существующий массив при получении новой последовательной команды
Моментальный снимок вывода был бы весьма полезен..., @KC Tucker