Последовательные данные отображаются странно
У меня есть простой скетч, который распечатывает "Hello World" в сериале, но вместо этого я получаю кучу тарабарщины.
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println("Hello World");
delay(1000);
}
Почему не печатается "Hello World", как написано в коде?
@sachleen, 👍14
Обсуждение3 ответа
Возможно, плата и терминал используют разную скорость передачи данных. Проверьте нижний правый угол последовательного терминала Arduino и убедитесь, что он установлен на 9600.
Серийные данные
Последовательная связь работает, отправляя весь поток данных по одному биту за раз. Это отличается от стандартного параллельного порта, который отправляет по одному байту за раз. Оба устройства должны знать, с какой скоростью передаются данные. Кроме того, оба устройства должны работать с одинаковой скоростью. Это называется скоростью передачи.
Скорость передачи данных
Бод на самом деле означает просто количество импульсов в секунду. В контексте последовательной связи это означает, сколько бит передается в секунду. Одним из наиболее распространенных значений является 9600, но есть и другие распространенные значения, которые являются множителями или кратными 9600. Впрочем, это не имеет большого значения, если оба устройства работают с одинаковой скоростью.
Если я отправляю вам сообщения быстрее, чем вы их получаете, вы теряете данные. Если я отправляю вам сообщения медленнее, чем вы их получаете, вы получаете ерунду, смешанную с тем, что я вам отправил.
Данные, четность, стоповые биты
Если вы посмотрите документацию для <code>begin()</code>, вы увидите это может принимать два параметра:
Serial.begin(speed)
Serial.begin(speed, config)
Надеюсь, теперь вы понимаете, что такое скорость, это количество битов в секунду, с которыми Arduino будет обмениваться данными.
Второй параметр, config
, позволяет настроить некоторые другие параметры последовательной передачи данных. Это данные, четность и стоповые биты. На странице вы увидите такие значения, как 5N1
, 6N1
и SERIAL_8N1 (по умолчанию)
Первое число представляет количество битов данных. Второй символ сообщает вам, какой бит четности имеется. E
для четной четности, O
для нечетной четности или N
для отсутствия четности. Третье число говорит вам, сколько стоповых битов.
На самом деле, с 8N1 мы отправляем 10 бит на каждые 8 бит "ваших" данных. 1 стартовый бит, 8 бит данных и 1 стоповый бит.
В любом случае, обе стороны должны согласовать эту информацию, а также скорость. Последовательный терминал Arduino не дает вам возможности изменить эти настройки, но есть другие, поэтому вам необходимо убедиться, что все эти параметры конфигурации одинаковы.
Дополнительная информация на вики: Асинхронная последовательная связь
Я потратил полчаса, пытаясь решить эту проблему, и это был мой Arduino Pro Mini с 3,3 В, а я выбрал 5 В в Arduino IDE (на ПК). Последовательная печать никогда не работает так, даже если определена одна и та же скорость передачи данных.
Выберите правильную плату в Arduino IDE.
Чтобы было ясно, нужно выбрать правильный процессор (напряжение/тактовая частота) на вкладке Инструменты.
Ответ Сачлина (выше) гласит:
The board and terminal are probably not using the same baud rate.
Check the bottom right corner of the Arduino Serial Terminal
and make sure it is set to 9600.
Если этот номер равен 9600, а вы по-прежнему получаете искаженные данные, проверьте вывод, который вы получили при загрузке кода. Это должно выглядеть примерно так:
Sketch uses 2754 bytes (8%) of program storage space. Maximum is 30720 bytes.
Global variables use 195 bytes (9%) of dynamic memory, leaving 1853 bytes for local variables. Maximum is 2048 bytes.
C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avrdude -CC:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf -v -patmega328p -carduino -PCOM5 -b57600 -D -Uflash:w:C:\Users\Owner\AppData\Local\Temp\arduino_build_457862/LockCode.ino.hex:i
avrdude: Version 6.3, compiled on Jan 17 2017 at 12:00:53
Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
Copyright (c) 2007-2014 Joerg Wunsch
System wide configuration file is "C:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf"
Using Port : COM5
Using Programmer : arduino
Overriding Baud Rate : 57600
Эта нижняя строка (из того, что я опубликовал) говорит о том, какая скорость передачи данных вашего устройства по умолчанию. Для себя я изменил Serial.begin(9600);
--> Serial.begin(57600);
и проверил, что в правом нижнем углу моего последовательного терминала Arduino отображается 57600. .
После того, как я запустил это, и это сработало, я смог вернуться к 9600 и получить неискаженные данные. Arduino кажется привередливым...
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- В чем разница между Serial.write и Serial.print? И когда они используются?
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Программы построения последовательных данных
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Очистить существующий массив при получении новой последовательной команды
Вы проверили правильность инициализации последовательного порта и соответствие последовательному терминалу ПК? В setup() должно быть что-то вроде Serial.begin(9600);, @Rajendra
@Rajendra, эта строка есть в приведенном мной примере кода. Кроме того, у меня на самом деле нет проблемы. Это распространенная проблема для начинающих, и я ответил на вопрос ниже., @sachleen