CraftDuino v2.0
  • - это CraftDuino - наш вариант полностью Arduino-совместимой платы.
  • CraftDuino - настоящий конструктор, для очень быстрого прототипирования и реализации идей.
  • Любая возможность автоматизировать что-то с лёгкостью реализуется с CraftDuino!
Просто добавьте CraftDuino!

Программирование 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-портом

Ссылки:
arduino.cc/en/Reference/Serial
http://arduino.cc/en/Reference/HomePage (или же в каталоге ArduinoIDE \reference\HomePage.html )
http://freeduino.ru/arduino/lang.html
  • 0
  • 7 июля 2009, 10:39
  • admin

Комментарии (14)

RSS свернуть / развернуть
комментарий был удален

комментарий был удален

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

aspo

  • 15 июля 2013, 21:51
+
0
ка можно вывести в монитор порта сразу несколько значений в одну строчку?
например с аналоговых входов
avatar

Lakomich

  • 4 февраля 2014, 15:10
+
0
значения можно разделять каким-нибудь символом (пробел, запятая и т.п.)
пример — Практическое программирование Arduino/CraftDuino — Аналоговый ввод – осциллограф
avatar

admin

  • 5 февраля 2014, 05:23
+
0
пробовал Serial.println( val,val1, val2); не компилируется((
avatar

Lakomich

  • 5 февраля 2014, 08:48
+
0
пример — Практическое программирование Arduino/CraftDuino — Аналоговый ввод – осциллограф
4-й блок кода:
Serial.print( "A" );
Serial.print( val );
Serial.print( "B" );
Serial.print( val[1] );
Serial.print( "C" );
Serial.print( val[2] );
Serial.print( "D" );
Serial.print( val[3] );
Serial.print( "E" );
Serial.print( val[4] );
Serial.print( "F" );
Serial.print( val[5] ); 
Serial.print() — вывод без переноса строки
Serial.println() — с переносом строки и возвратом каретки
вам надо погуглить:
Serial.print( val );
Serial.print( " " );
Serial.print( val1 );
Serial.print( " " );
Serial.println( val2 );
avatar

Zoltberg

  • 5 февраля 2014, 09:01
+
0
спасибо
avatar

Lakomich

  • 5 февраля 2014, 19:46
+
0
Прошу прощения за невежество, а как выводить в порт русские буквы? Может, в какой-нить кодировке типа 866? Ибо то, что пишешь в IDE выводится кракозябрами. Пока пишу только латинскими ))
avatar

Arabezar

  • 5 октября 2014, 15:16
+
0
На самом деле — вопрос серьёзный и не такой простой, как кажется :) Дело в том, что Arduino IDE работает в UTF-8 и строчки, которые вы пишите на русском — хранятся именно в этой кодировке.
Однако, монитор показывать их не умеет ;) Как вариант — просто попробуйте другую терминальную программу для работы с последовательным портом.
avatar

admin

  • 5 октября 2014, 15:47
+
0
Спасибо, буду пробовать.
avatar

Arabezar

  • 6 октября 2014, 14:17

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.