Почему вывод 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