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 — Последовательная передача данных”»
Столько, сколько, влезет на установленный в плате МК
(в интересующий вас вид памяти):
ATmega8:
— 8 Кбайт программируемой памяти (FLASH)
— 1 Кбайт ОЗУ(RAM)
— 512 байт энергонезависимой памяти (EEPROM)
ATmega168:
— 16 Кб FLASH
— 1 Кб RAM
— 512 байт EEPROM
ATmega328:
— 32 Кб FLASH
— 2 Кб RAM
— 512 байт EEPROM
можно, и читать, и писать(с записью не столь прозрачно, но можно).
Не подскажите каким образом узнать какую скорость выбирать для передачи данных в последовательный порт. За каким принцыпом это делается?
ка можно вывести в монитор порта сразу несколько значений в одну строчку?
например с аналоговых входов
значения можно разделять каким-нибудь символом (пробел, запятая и т.п.)Практическое программирование Arduino/CraftDuino — Аналоговый ввод – осциллограф
пример —
пробовал Serial.println( val,val1, val2); не компилируется((
пример —Практическое программирование Arduino/CraftDuino — Аналоговый ввод – осциллограф
4-й блок кода:
Serial.print() — вывод без переноса строки
Serial.println() — с переносом строки и возвратом каретки
вам надо
погуглить:спасибо
Прошу прощения за невежество, а как выводить в порт русские буквы? Может, в какой-нить кодировке типа 866? Ибо то, что пишешь в IDE выводится кракозябрами. Пока пишу только латинскими ))
На самом деле — вопрос серьёзный и не такой простой, как кажется 🙂 Дело в том, что Arduino IDE работает в UTF-8 и строчки, которые вы пишите на русском — хранятся именно в этой кодировке.
Однако, монитор показывать их не умеет 😉 Как вариант — просто попробуйте другую терминальную программу для работы с последовательным портом.
Спасибо, буду пробовать.