Arduino Serial: Последовательные данные

Тип связи

Тип связи будет определять сложность отдельных частей проекта. Односторонняя связь, как правило, проще в реализации, но вам нужно учитывать направление: отправляется с Arduino или отправляется на Arduino. Arduino не имеет функций обработки данных высокого уровня, поэтому если у вас сложные шаблоны данных, вам нужно будет создать код для их разбора.

Двусторонняя связь означает, что вам нужно отправлять и получать данные с обеих сторон. Будет ли связь синхронной или асинхронной? Это повлияет на ваш код и на то, какие функции вы можете использовать; например, Software Serial на Arduino не может одновременно получать и отправлять данные.

Тип данных

Подумайте о том, какую информацию вам нужно передавать, и можете ли вы упростить используемый формат данных. Например, если вы просто хотите включать и выключать свет, вы можете сделать это с помощью очень простых кодов или команд, таких как один символ (или даже один бит 8-битного символа). Если вы создаёте метеостанцию, вам может потребоваться учитывать скорость ветра и температуру, которые могут требовать значений с плавающей точкой. Если у вас много разных значений, вам нужен способ сообщить Arduino, какое из них какое при их получении.

Вам также нужно учитывать, как быстро вам нужно отправлять/получать данные. Если скорость не важна, нет реальных ограничений на сложность данных, и вы можете использовать человекочитаемые данные, такие как XML или что-то вроде «Temperature=24.75,humidity=34.5%». Если данные поступают очень быстро, они должны быть максимально простыми.

Как всегда, я выступаю за то, чтобы всё было как можно проще, и я всегда стараюсь упростить данные, или, точнее, формат данных, которые использую. Для сложных данных, где скорость не является главной задачей, я использую форматированные наборы данных и, если возможно, данные фиксированной длины. То, насколько вы форматируете данные, может зависеть от того, что это за данные.

При отправке данных на Arduino я почти всегда придерживаюсь одних и тех же методов: я использую данные фиксированной длины и ASCII для чисел. При отправке данных на высокоуровневые языки, такие как App Inventor или Visual Basic, это менее важно, но форматированные данные упрощают работу.

Данные фиксированной длины

Чтобы привести пример того, что я имею в виду, вот несколько примеров. Если у меня есть 3 слайдера в App Inventor для управления RGB-светодиодом, подключённым к Arduino, я знаю, что у меня 3 значения (красный, зелёный и синий), и каждое значение может быть от 0 до 255.

Используя ASCII, где числовые значения преобразуются в буквенно-цифровые (строковые) значения, я буду использовать 3 символа для каждого значения: 0 становится «000», 100 становится «100», а 255 становится «255». Затем я могу заключить данные в начальный и конечный маркеры, так что фактические данные становятся «[100000255]». Затем на стороне Arduino, по мере получения данных, я добавляю их в буфер; когда в буфере есть и начальный маркер, и конечный маркер, я знаю, что у меня есть все данные. Это делает данные легко читаемыми, но означает, что передача медленнее, чем нужно.

Когда скорость важна, я могу сократить данные до «[» byte1 byte2 byte3 «]», где byte1, byte2 и byte3 — фактические числовые значения. Я всё равно буду использовать начальный и конечный маркеры.

Объём данных

Вам также нужно учитывать, сколько данных вы хотите отправлять и как часто. Существует большая разница между отправкой температуры раз в минуту и потоковой передачей музыки. Если вы хотите отправлять много данных очень часто, вам также нужно учитывать задержку (latency) и то, как быстро Arduino может получать и обрабатывать данные.

Например, использование Software Serial на Arduino имеет ограничение по скорости надёжного приёма и отправки данных. Hardware Serial намного лучше, но также имеет ограничения.

Критически важные данные

Если данные критически важны и вам нужно знать, что вы получили всё, вам нужен способ проверки. Существует много разных способов сделать это, но, как всегда, я люблю всё упрощать. В нескольких случаях, когда я хотел знать наверняка, что получил всё, я использовал базовое значение контрольной суммы и счётчик количества раз отправки данных, добавляя счётчик к данным. Это означает, что если я получаю блок данных и контрольная сумма неверна, я знаю, что данные повреждены, и могу запросить повторную отправку. Если каждый блок данных пронумерован: блок1, блок2, блок3, у меня есть простой способ проверить, что я получил каждый блок, и если один отсутствует, его можно повторно отправить.

Следующие несколько статей проходят через методы отправки последовательных данных от одного Arduino к другому. Во всех примерах я использую физические провода для подключения плат Arduino, но провода можно заменить любым беспроводным модулем, который использует UART, например модулями Bluetooth. И хотя я привожу примеры Arduino-Arduino, те же техники можно использовать при получении последовательных данных с любого устройства.