- Фантастика и фэнтези
- Ироническое фэнтези
- Стимпанк
- Детективная фантастика
- Киберпанк
- Попаданцы
- LitRPG
- Космоопера
- Технофэнтези
- Городская фантастика
- Русское фэнтези
- Юмористическая фантастика
- Космическая фантастика
- Боевое фэнтези
- Эпическая фантастика
- Зарубежная фантастика
- Книги магов
- Мистика
- Разная фантастика
- Разное фэнтези
- Любовное фэнтези
- Романтическая фантастика
- Городское фентези
- Историческая фантастика
- Историческое фэнтези
- Социально-философская фантастика
- Сказочная фантастика
- Иностранное фэнтези
- Романтическое фэнтези
- Ироническая фантастика
- Ужасы и Мистика
- Постапокалипсис
- Героическая фантастика
- Фэнтези
- Научная Фантастика
- Социально-психологическая
- Альтернативная история
- Боевая фантастика
- Разная литература
- Пословицы, поговорки
- Шахматы
- Визуальные искусства
- Фанфик
- Авто и ПДД
- Военное
- Отраслевые издания
- Гиды, путеводители
- Зарубежная образовательная литература
- Военная история
- Цитаты из афоризмов
- Современная литература
- Великолепные истории
- Начинающие авторы
- Современная зарубежная литература
- Боевые искусства
- Изобразительное искусство, фотография
- Кино
- Литература 19 века
- Недвижимость
- Музыка, музыканты
- Готические новеллы
- Истории из жизни
- Культура и искусство
- Спецслужбы
- Зарубежная прикладная литература
- Музыка, танцы
- Подростковая литература
- Прочее
- Военная техника, оружие
- Газеты и журналы
- Периодические издания
- Домоводство, Дом и семья
- Любовные романы
- Экономическая литература
- Научные и научно-популярные книги
- О животных
- Биохимия
- Культурология
- Юриспруденция
- Политика
- Психотерапия
- Языкознание
- Научпоп
- Медицина
- Психология, личное
- Радиотехника
- Филология
- Педагогика
- Образовательная литература
- Деловая литература
- Физика
- Науки: разное
- Химия
- Воспитание детей, педагогика
- Детская психология
- Зарубежная публицистика
- Биология
- Архитектура
- Зарубежная психология
- Науки о космосе
- Социология
- Математика
- География
- Беременность, ожидание детей
- Литературоведение
- Транспорт, военная техника
- Обществознание
- Зоология
- География
- Альтернативная медицина
- Иностранные языки
- Ветеринария
- Рефераты
- Астрология
- Биофизика
- Экология
- История Европы
- Учебники
- Шпаргалки
- Государство и право
- Ботаника
- Религиоведение
- История
- Техническая литература
- Прочая научная литература
- Психология
- Детективы и Триллеры
- Справочная литература
- Проза
- Новелла
- Юмор
- Проза
- Историческая проза
- Русская современная проза
- Советская классическая проза
- Повести
- Очерки
- Эссе
- Рассказы
- Зарубежная современная проза
- Сентиментальная проза
- Зарубежная классика
- Афоризмы
- Эпистолярная проза
- Феерия
- Семейный роман/Семейная сага
- Разное
- Антисоветская литература
- Магический реализм
- Русская классическая проза
- Современная проза
- О войне
- Контркультура
- Классическая проза
- Поэзия, Драматургия
- Детская литература
- Детская фантастика
- Детские остросюжетные
- Детские стихи
- Детские приключения
- Внеклассное чтение
- Учебная литература
- Зарубежные детские книги
- Бизнес
- Загадки
- Книги для подростков
- Школьные учебники
- Детский фольклор
- Книги для дошкольников
- Детские детективы
- Детская познавательная и развивающая литература
- Буквари
- Прочая детская литература
- Сказка
- Детская проза
- Детская образовательная литература
- Юмор
- Документальные книги
- Бизнес
- Внешнеэкономическая деятельность
- Тайм-менеджмент
- Кадровый менеджмент
- О бизнесе популярно
- Управление, подбор персонала
- Бизнес
- Менеджмент и кадры
- Продажи
- Экономика
- Ценные бумаги и инвестиции
- Малый бизнес
- Делопроизводство, офис
- Корпоративная культура, бизнес
- Банковское дело
- Финансы
- Зарубежная деловая литература
- Ораторское искусство / риторика
- Личные финансы
- Интернет-бизнес
- Поиск работы
- Государственное и муниципальное управление
- Бухучет и аудит
- Работа с клиентами
- Менеджмент
- Краткое содержание
- Личная эффективность
- Переговоры
- Приключения
- Старинная литература
- Религия и духовность
- Компьютеры и Интернет
- Блог
Читаем без скачивания Программируем Arduino. Основы работы со скетчами - Монк Саймон
Шрифт:
Интервал:
Закладка:
Функция loop может проверить наличие входящих данных с помощью функции Serial.available. Она возвращает число байтов, доступных для чтения. Если в буфере нет ни одного байта, она вернет 0. В языке C это равносильно значению false, поэтому часто можно видеть такой код, проверяющий доступность данных:
void loop()
{
if (Serial.available())
{
// прочитать и обработать следующий байт
}
}
Команда read не имеет параметров и просто читает следующий доступный байт из буфера. Функция readBytes читает доступные байты в буфер, организованный внутри скетча. Она принимает два аргумента: буфер (это должна быть ссылка на массив байтов) и максимальное число байтов для чтения. Эта команда может пригодиться в проектах для пересылки в плату Arduino строк переменной длины. Но вообще лучше избегать этого и стараться осуществлять обмен максимально простыми данными фиксированного размера.
Также могут пригодиться функции parseInt и parseFloat, позволяющие сохранять строки, пересылаемые в плату Arduino, как числа в переменных типа int и float соответственно.
void loop()
{
if (Serial.available())
{
int x = parseInt();
}
}
Обе функции читают символы, пока не достигнут конца строки или не встретят пробел или другой нецифровой символ, и затем преобразуют прочитанную последовательность цифр в числовое значение.
Перед использованием функций, таких как parseInt и parseFloat, убедитесь, что понимаете, зачем вы это делаете. Мне приходилось видеть код, написанный другими, который преобразовывал значение int в массив символов и посылал его второй плате Arduino, которая преобразовывала массив обратно в значение int. Такое решение нельзя назвать удачным по следующим причинам.
• В этом нет необходимости. Двоичные данные передаются через последовательный интерфейс ничуть не хуже. Достаточно просто передать старший и младший байты значения int и затем собрать их обратно в значение int на стороне получателя.
• Преобразование чисел в строки и обратно выполняется медленно.
• Вместо шести символов (включая завершающий нулевой символ) по линии связи можно передать всего два байта, составляющие значение int.
Если устройство, с которым вы взаимодействуете, вам неподконтрольно и протоколом предполагается передача чисел в виде строк или полей данных переменной длины, то применение этих функций вполне оправданно. Но, если реализация протокола полностью находится в ваших руках, облегчите себе жизнь и откажитесь от ненужных сложностей, связанных с преобразованием типов и передачей сообщений в разных форматах.
Примеры, приведенные в разделе «Примеры использования последовательного интерфейса» далее в этой главе, можно использовать в качестве шаблонов при разработке своего кода, осуществляющего обмен данными.
Поддержка последовательного интерфейса включает массу функций, многие из которых вам никогда не понадобятся. Мы охватили здесь только самые необходимые. Информацию об остальных ищите в документации с описанием последовательного интерфейса Arduino по адресу http://arduino.cc/en/Reference/Serial8.
Библиотека SoftwareSerial
Иногда, особенно при использовании модели Arduino Uno, единственного последовательного порта оказывается недостаточно. Библиотека SoftwareSerial позволяет использовать для последовательных взаимодействий практически любую пару контактов, хотя и с некоторыми ограничениями.
• С помощью SoftwareSerial невозможно принимать данные одновременно по нескольким портам.
• Если скетч использует таймеры или внешние прерывания, могут возникать проблемы.
Функции в библиотеке имеют те же имена, что и команды Serial, но продуманы лучше. Библиотека SoftwareSerial поддерживает последовательные взаимодействия с устройствами, использующими инвертированные сигналы, такими как дальномеры MaxSonar. Кроме того, создание объектов SoftwareSerial для соединений выполняется более ясным способом, чем стандартный подход с использованием номеров после слова Serial.
В табл. 10.2 перечислены контакты на платах Uno и Leonardo, которые может использовать библиотека SoftwareSerial. Если вы работаете с платой, имеющей четыре аппаратных последовательных порта, библиотека SoftwareSerial едва ли вам понадобится. Номера контактов без префикса A соответствуют цифровым входам/выходам.
Таблица 10.2. Контакты, доступные библиотеке SoftwareSerial
Модель
Контакты для линии Rx
Контакты для линии Tx
Uno
Любые, кроме 0 и 1
Любые, кроме 0 и 1
Leonardo
Любые, кроме 0 и 1
8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI)
При создании объекта SoftwareSerial нужно передать два параметра с номерами контактов для линий Rx и Tx. Чтобы запустить взаимодействия, нужно вызвать функцию begin и передать ей скорость в бодах:
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
void setup()
{
mySerial.begin(9600);
mySerial.println("Hello, world?");
}
Полное описание библиотеки SoftwareSerial можно найти по адресу http://arduino.cc/en/Reference/SoftwareSerial9.
Примеры использования последовательного интерфейса
В этом разделе демонстрируется несколько примеров использования УАПП и библиотеки SoftwareSerial.
Передача из компьютера в Arduino через USB
В первом примере демонстрируется применение монитора последовательного порта для передачи команд в плату Arduino. Раз в секунду Arduino будет посылать значение, прочитанное с аналогового входа A0, и одновременно ждать получения односимвольных команд g (go — вперед) и s (stop — стоп), управляющих передачей прочитанных значений. На рис. 10.3 изображено окно монитора последовательного порта с данными, полученными во время работы скетча.

Рис. 10.3. Окно монитора последовательного порта с данными, полученными от платы Arduino
В данном случае из-за того, что вывод производится непосредственно в окно монитора последовательного порта, данные, прочитанные с аналогового входа, передаются не в двоичном, а в текстовом виде.
Далее приводится скетч для этого примера:
// sketch_10_01_PC_to_Arduino
const int readingPin = A0;
boolean sendReadings = true;
void setup()
{
Serial.begin(9600);
}
void loop()
{
if (Serial.available())
{
char ch = Serial.read();
if (ch == 'g')
{
sendReadings = true;
}
else if (ch == 's')
{
sendReadings = false;
}
}
if (sendReadings)
{
int reading = analogRead(readingPin);
Serial.println(reading);
delay(1000);
}
}
Функция loop проверяет получение данных и, если они имеются, читает их по одному байту как символы. После полученный байт сравнивается с командами 's' и 'g', и переменной sendReadings присваивается соответствующее значение.
Затем по значению переменной sendReadings определяется необходимость чтения аналогового входа и вывода результатов. Если флаг sendReadings имеет значение true, перед отправкой следующего значения выполняется задержка на одну секунду.
Использование функции delay означает, что значение sendReadings сможет измениться только в следующей итерации функции loop. В данном скетче это не является проблемой, но в других ситуациях может потребоваться использовать другое решение, не блокирующее работу функции loop. Подробнее о подобных решениях рассказывается в главе 14.
Передача из Arduino в Arduino
Второй пример иллюстрирует передачу данных из одной платы Arduino Uno в другую. В данном случае одна плата Arduino передает значение, прочитанное с входа A1, другой плате, которая затем по этому значению определяет частоту мигания встроенного светодиода L.