Программирование Arduino — Последовательная передача данных


1. Программирование Arduino — введение
2. Структура программы, константы
3. Цифровой ввод/вывод
4. Аналоговый ввод/вывод
5. Дополнительные функции ввода/вывода
6. Работа со временем
7. Математические функции
8. Псевдослучайные числа

9. Последовательная передача данных

Arduino/Freeduino имеет встроенный контроллер для последовательной передачи данных, который может использоваться как для связи между Arduino/Freeduino устройствами, так и для связи с компьютером. На компьютере соответствующее соединение представлено либо обычным COM-портом (в случае Arduino Single-Sided Serial Board), либо USB COM-портом, который появляется в системе после установки необходимого драйвера.

Связь происходит по цифровым портам 0 и 1, и поэтому Вы не сможете использовать их для цифрового ввода/вывода если используете функции последовательной передачи данных.

Serial.begin(long);

Вызов:

Serial.begin(скорость_передачи); 

Описание:
Устанавливает скорость передачи информации COM порта битах в секунду для последовательной передачи данных. Для того чтобы поддерживать связь с компьютером, используйте одну из этих нормированных скоростей: 300, 1200, 2400, 4800, 9600, 14400, 19200, 38400, 57600, или 115200. Также Вы можете определить другие скорости при связи с другим микроконтроллером по портам 0 и 1.

Параметры:
скорость_передачи: скорость потока данных в битах в секунду.

Пример:

  Serial.begin(9600); //устанавливаем скорость 9600 бит/сек

Serial.available(void);

Вызов:

count = Serial.available(); 

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

Возвращаемое значение:
Возвращает значение типа uint8_t (typedef uint8_t byte;) – количество байт, доступных для чтения, в последовательном буфере, или 0, если ничего не доступно.

Пример:

  if (Serial.available() > 0) { // Если в буфере есть данные
    // здесь должен быть прием и обработка данных
  }

Serial.read(void);

Вызов:

char = Serial.read(); 

Описание:
Считывает следующий байт из буфера последовательного порта.

Возвращаемое значение:
Первый доступный байт входящих данных с последовательного порта, или -1 если нет входящих данных.

Пример:

  incomingByte = Serial.read(); // читаем байт

Serial.write(uint8_t c)

Вызов:

Serial.write(val);
Serial.write(str);
Serial.write(buf, len);

Описание:
Записывает данные в последовательный порт. Данные посылаются как байт или последовательность байт; для отправки символьной информации следует использовать функцию print().

Параметры:
val: переменная для передачи, как единственный байт
str: строка для передачи, как последовательность байт
buf: массив для передачи, как последовательность байт
len: длина массива

Serial.flush(void)

Вызов:
Serial.flush();

Описание:
Очищает входной буфер последовательного порта. Находящиеся в буфере данные теряются, и дальнейшие вызовы Serial.read() или Serial.available() будут иметь смысл для данных, полученных после вызова Serial.flush().

Пример:

  Serial.flush(); // Очищаем буфер – начинаем прием данных «с чистого листа»

Serial.print()

Функции print наследуются классом HardwareSerial от класса Print (\hardware\cores\arduino\ Print.h)

Описание:
Вывод данных на последовательный порт.

Параметры:
Функция имеет несколько форм вызова в зависимости от типа и формата выводимых данных.

Примеры:

Serial.print(b, DEC); выводит ASCII-строку — десятичное представление числа b.

int b = 79;
Serial.print(b, DEC); //выдаст в порт строку «79»

Serial.print(b, HEX) выводит ASCII-строку — шестнадцатиричное представление числа b.

int b = 79;
Serial.print(b, HEX); //выдаст в порт строку «4F»

Serial.print(b, OCT) выводит ASCII-строку — восьмеричное представление числа b.

int b = 79;
Serial.print(b, OCT); //выдаст в порт строку «117»

Serial.print(b, BIN) выводит ASCII-строку — двоичное представление числа b.

int b = 79;
Serial.print(b, BIN); //выдаст в порт строку «1001111»

Serial.print(b, BYTE) выводит младший байт числа b.

int b = 79;
Serial.print(b, BYTE); //выведет число 79 (один байт). В мониторе
//последовательного порта получим символ «O» - его
//код равен 79

Serial.print(str) если str – строка или массив символов, побайтно передает str на COM-порт.

char bytes[3] = {79, 80, 81};    //массив из 5 байт со значениями 79,80,81
Serial.print("Here our bytes:"); //выводит строку «Here our bytes:»
Serial.print(bytes);             //выводит 3 символа с кодами 79,80,81 – 
                                 //это символы «OPQ»

Serial.print(b) если b имеет тип byte или char, выводит в порт само число b.

char b = 79;
Serial.print(b); //выдаст в порт символ «O»

Serial.print(b) если b имеет целый тип, выводит в порт десятичное представление числа b.

int b = 79;
Serial.print(b); //выдаст в порт строку «79»

Serial.println()

Описание:
Функция Serial.println аналогична функции Serial.print, и имеет такие же варианты вызова. Единственное отличие заключается в том, что после данных дополнительно выводятся два символа – символ возврата каретки (ASCII 13, или ‘\r‘) и символ новой линии (ASCII 10, или ‘\n‘).
Как нетрудно догадаться, это реализовано простым добавлением вызова функции:

void Print::println(void)
{
  print('\r');
  print('\n');  
}

Например, функция вывода символа:

void Print::println(char c)
{
  print( c );
  println();  
}

Пример 1 и пример 2 выведут в порт одно и то же:

Пример 1:

  int b = 79;
  Serial.print(b, DEC); //выдаст в порт строку «79»
  Serial.print("\r\n"); //выведет символы "\r\n" – перевод строки
  Serial.print(b, HEX); //выдаст в порт строку «4F»
  Serial.print("\r\n"); //выведет символы "\r\n" – перевод строки

Пример 2:

  int b = 79;
  Serial.println(b, DEC); //выдаст в порт строку «79\r\n»
  Serial.println(b, HEX); //выдаст в порт строку «4F\r\n»

В мониторе последовательного порта получим:

79
4F

читать далее: 10. Прерывания

Дополнительно:
общение с Arduino — программирование работы с COM-портом

Ссылки
http://arduino.cc/en/Reference/Serial
http://arduino.cc/en/Reference/HomePage (или же в каталоге ArduinoIDE \reference\HomePage.html )
http://freeduino.ru/arduino/lang.html


11 комментариев на «“Программирование Arduino — Последовательная передача данных”»

  1. Столько, сколько, влезет на установленный в плате МК
    (в интересующий вас вид памяти):

    ATmega8:
    — 8 Кбайт программируемой памяти (FLASH)
    — 1 Кбайт ОЗУ(RAM)
    — 512 байт энергонезависимой памяти (EEPROM)

    ATmega168:
    — 16 Кб FLASH
    — 1 Кб RAM
    — 512 байт EEPROM

    ATmega328:
    — 32 Кб FLASH
    — 2 Кб RAM
    — 512 байт EEPROM

    • можно, и читать, и писать(с записью не столь прозрачно, но можно).

  2. Не подскажите каким образом узнать какую скорость выбирать для передачи данных в последовательный порт. За каким принцыпом это делается?

  3. Прошу прощения за невежество, а как выводить в порт русские буквы? Может, в какой-нить кодировке типа 866? Ибо то, что пишешь в IDE выводится кракозябрами. Пока пишу только латинскими ))

    • На самом деле — вопрос серьёзный и не такой простой, как кажется 🙂 Дело в том, что Arduino IDE работает в UTF-8 и строчки, которые вы пишите на русском — хранятся именно в этой кодировке.
      Однако, монитор показывать их не умеет 😉 Как вариант — просто попробуйте другую терминальную программу для работы с последовательным портом.

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Arduino Bluetooth CraftDuino DIY Google IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение