Отладочные сообщения (Serial)
Компьютер эта штука, которая умеет быстро считать, например. Но надо же знать, что он поcчитал. И надо ему как-то сообщить, что он должен считать. Потому в древние времена очень часто звучали слова «устройства ввода и вывода информации», что по-английски input и output. Раз устройства, то подключены через порты. И для портов есть две основные команды inp и outp. Из-за очевидной необходимости что-то вводить и где-то смотреть результат компьютеров без клавиатур и мониторов не бывает. Точнее бывает но для особых нужд в условиях экономии денег и места (сервера, например, могут так работать).
А ситуаций, когда к микроконтроллеру не подключено монитора может быть сколько угодно. Записывает он, например, тихо температуру с влажностью на карту и ничего ни на каком экране не рисует.
Но чтобы записывал надо написать программу. Программы запросто могут содержать ошибки. Причём не только такие, которые выловит компилятор но и ошибки в какой-нибудь логике. Программы довольно часто требуют отладки, т.е поиска и исправления ошибок. На больших компьютерах не только всегда есть монитор, но и обычно есть средства отладки (с пошаговым просмотром действий). Но если такого отладчика нет, то довольно часто используют то, что называется «отладочное сообщение». Или «фантик», если его забывают удалить из программы до передачи пользователю. Обычно это строка типа «список 1, начало» и прочее мало что значащее. Потому что значение имеет не текст, а само то, что это сообщение появилось на экране. В программах множество всяких if, т.е того что выполняется при определённом условии. Могут быть циклы, которые написаны но так что никогда не запускаются (хотя должны, а не запускаются из-за ошибки). Читая последовательно появляющиеся на экране отладочные сообщения можно понять, что выполняла программа, а что нет.
В случае микроконтроллера проблема та же, но у микроконтроллера может не быть монитора. На время отладки для этих целей можно использовать монитор компьютера.
Очередная модификации мигалки:
Только в setup() появилась строка Serial.begin(9600);, т.е установка соединения с компьютером для передачи этих коротких строк. А включение и выключение светодиода сопровождаются строками Serial.println("LED ON/OFF");. Цифра 9600, скорее всего, скорость передачи информации через это соединение.
В правом верхнем углу кнопка, позволяющая запустить просмотр информации из порта:
Как-то это все нестабильно работает. После загрузки программы, например, он не желает запускать этот монитор. Приходится выходить и входить.
Но если запустить и ввести номер порта, то можно увидеть как на описанном примере раз в секунду не только светодиод будет мигать, но и новые сообщения будут появляться:
Раз можно использовать это соединение для получения отладочных записей, то почему не использовать его же для временной передачи команд на контроллер? Т.е если заменили им монитор, то почему им же не заменить клавиатуру?
Текст взят отсюда:
https://www.instructables.com/id/HOW-TO-use-the-ARDUINO-SERIAL-MONITOR/
Его чуть изменённый вариант:
Светодиод включается по кнопке клавиатуры »1», и выключается по «0». Все остальное игнорируется но выводится на экран-монитор.
Вот так результат выглядит:
Я могу ввести строку любой разумной длины. Serial.read() будет считывать эту строку по одному символу. Если найдут 1 или 0 но включить или выключить светодиод. После каждой целой строки передаётся символ с кодом 10 (шестнадцатеричное А). Это вполне стандартный компьютерный перевод строки. Тут по нему можно понять сколько строк отправлялось, а не только какие в них были буквы.
Полный текст:
int ByteReceived;
void setup() {
// initialize digital pin 13 as an output.
pinMode(13, OUTPUT);
Serial.begin(9600);
}
void loop() {
if (Serial.available() > 0)
{
ByteReceived = Serial.read();
Serial.print(ByteReceived);
Serial.print(" ");
Serial.print(ByteReceived, HEX);
Serial.print(" ");
Serial.print(char(ByteReceived));
if(ByteReceived == '1') // Single Quote! This is a character.
{
digitalWrite(13, HIGH);
Serial.print(" LED ON ");
}
if(ByteReceived == '0')
{
digitalWrite(13, LOW);
Serial.print(" LED OFF");
}
Serial.println(); // End the line
} // END Serial Available
}
|