Serial monitor

Serial Port Monitor overview

Serial Port Monitor is a highly-functional and friendly utility that works with RS232/RS422/RS485 ports and allows you to save a lot of your time while developing and testing serial applications and hardware. It offers the full set of advanced port monitoring features, including a built-in terminal, unique data filtering options, convenient data viewing modes, session playback capability, and more.

  • If a COM port you want to monitor is already opened by a third-party application, Serial Port Analyzer will still be able to connect to it and record its activity. It will capture the port’s data and display it to you. Serial Analyzer software will let you select whether to show serial data in the Table, Line, Dump or Terminal mode. Also, you can enable all available visualizers at a time.

  • With the Table view, you get the data in the form of a table consisting of the recorded IRPs. When you select the Line view, you will see more details about each request passing in and out of a monitored COM port. The Dump view will display all incoming and outgoing data in hexadecimal and string formats as a data dump. In the Terminal mode, the monitoring data will be shown as ASCII characters.

  • All captured data, including serial input/output control codes (IOCTLs) with full details, can be recorded to a selected file. Also, you can save your monitoring session and load it next time you need it. Serial Port Monitor software allows reading serial port data in real time, which means you’ll be able to solve any problem immediately after it occurs.

  • Serial Port Sniffer lets you test an unlimited number of COM ports within one RS232 monitoring session. Just select “Start session” in the main menu of the app and get the ability to track the communications of any serial program with several devices at a time. All data will be recorded using the first-in, first-out method, which makes it more convenient for analysis.

  • With RS232 monitor software, you can not only log serial traffic but also emulate sending data to a particular serial port as though it were sent from the monitored app. This enables you to easily check how a device connected to this port reacts to specific data.

  • The Modbus Sniffer makes it possible to perform monitoring and analysis of Modbus communications. It allows intercepting Modbus RTU and Modbus ASCII frames exchanged between Modbus-enabled devices or apps.

Аппаратный модуль TWI

Смотрите следующую схему потока для записи на шину I2C:

Взаимодействие приложения с шиной TWI (I2C) во время типовой передачи

Ссылаясь на таблицу регистров, приведенную выше, операция записи I2C с использованием аппаратного модуля TWI вкратце будет выглядеть следующим образом:

  • Библиотека конфигурирует микросхему ATmega так, что внутренний аппаратный модуль TWI использует свои выводы, которые жестко привязаны к двум аналоговым выводам (4 и 5 на Duemilanove).
  • Библиотека устанавливает значение регистра TWCR для создания состояния .
    • Сначала она проверяет шину I2C, чтобы убедиться, что она свободна. Шина свободна, когда на обеих линиях и SDA, и SCL установлен высокий логический уровень (потому что устройство по умолчанию устанавливает выводы на шине в третье состояние «не подключено». Общий резистор подтягивает сигнал на шине к высокому уровню).
    • Что такое состояние ? Линия тактового сигнала SCL остается в состоянии логической 1, а мастер в это время меняет состояние на линии SDA на логический 0. Это уникальный момент, поскольку во время обычной передачи данных линии SDA изменяет состояние только тогда, когда на линии SCL установлен низкий логический уровень. Момент, когда сигнал на линии данных изменяется на логический 0, а на SCL логическая 1, является сигналом для всех устройств на шине I2C, с которыми мастер собирается начать взаимодействовать.
  • Аппаратный модуль TWI при завершении выполнения действия вызывает прерывание процессора.
  • Библиотека e проверяет состояние по регистру . Предположим, что всё хорошо.
  • Библиотека загружает в регистр адрес ведомого устройства плюс бит «запись». Вместе это значение известно как «SLA+W» («SLave Address plus Write»).
  • Библиотека устанавливает значение регистра для передачи .
  • В случае успеха, библиотека загружает данные в регистр , устанавливает , и данные передаются.
  • Библиотека проверяет состояние по регистру . Предположим, что всё хорошо.
  • Библиотека устанавливает значение регистра для передачи состояния . В состоянии линия SCL освобождается (переходит в высокий логический уровень), и затем линия SDA переходит в состояние логической 1. Обычно линия SDA должна оставаться неизменной, когда на линии SCL установлен высокий логический уровень.

Операция чтения выполняется похожим образом.

Получение строковых данных из микроконтроллера

Теперь мы хотим получить этот же текст в Processing. Запускаем новый проект и напишем код.

Первый шаг — импортировать библиотеку. Идем в Sketch | Import Library | Serial. В скетче появится строка:

Далее объявляем переменные, создаём обязательные функции

Обратите внимание, что в отличии от скетчей Arduino, в скетчах Processing используется функция draw() вместо loop()

Чтобы обеспечить прием данных с последовательного порта, нам нужен объект класса Serial. Так как с Arduino мы отправляем данные типа String, нам надо получить строку и в Processing.

В методе setup() нужно получить доступный последовательный порт. Как правило, это первый доступный порт из списка. После этого мы можем настроить объект Serial, указав порт и скорость передачи данных (желательно, чтобы скорости совпадали).

Осталось снова подключить плату, запустить скетч от Processing и наблюдать поступаемые данные в консоли приложения.

Processing позволяет работать не только с консолью, но и создавать стандартные окна. Перепишем код.

Запустим пример ещё раз и увидим окно с надписью, которое перерисовывается в одном месте.

Таким образом мы научились получать данные от Arduino. Это позволит нам рисовать красивые графики или создавать программы контроля за показаниями датчиков.

Где применяется протокол I2C

Протокол I2C используется для передачи информации только на короткие расстояния. Он обеспечивает достаточно надежную передачу данных из-за наличия в нем сигнала синхронизации. Обычно данный протокол используется для передачи информации от датчиков или других устройств ведущим устройствам. В данном случае несомненным удобством использования протокола I2C является то, что при обмене данными с ведомыми устройствами ведущий микроконтроллер использует минимум линий (контактов). Если вам нужна связь на более далекие расстояния, то вам необходимо присмотреться к протоколу RS232, если же вам нужна более надежная связь чем в протоколе I2C, то вам лучше использовать протокол SPI.

Функция println и отличия от print

Если вы попробовали использовать функцию print(), то уже обратили внимание, что вся информация в мониторе порта выводится в одной строке. Если же мы хотим вывести текст в новых строках, то должны использовать близкого родственника функции – println()

Метод println () класса Serial выполняет ту же функцию, что и print() – он выводит в последовательный порт ASCII-текст.  Аргументы у методов тоже совпадают – мы передаем текст или число с возможным вторым аргументом, определяющим формат. Отличие же println заключается в принудительном добавлении в конце передающейся строки символа новой строки “r” (ASCII код 13). Суффикс ln обозначает сокращенное слово line (строка). Используя println, мы можем быть уверены, что следующая (но не текущая) строка будет выведена с новой строки.

Например, следующие команды выведут три строки текста, каждое предложение в новой строке.

При формировании строки мы также можем использовать следующие специальные символы: “”, “r”, “t” (символ табуляции). Табулирование позволяет печатать на экране что-то типа таблицы значений:

  Serial.print("Column1tt");  Serial.println("Column2");  Serial.print("Cell 11tt");  Serial.println("Cel l2");  Serial.print("Cell 21tt");  Serial.println("Cel 22");  

How to compare several monitoring sessions

Sometimes you may run into a situation where it can be very beneficial to have a method that allows you to monitor the RS485 and RS232 data from multiple serial devices at the same time.
One scenario that definitely falls into this category can occur during testing for a new installation of a number of serial monitoring devices. There seems to be a problem as while monitoring serial ports you discover inconsistencies in the data being produced by the devices.

Having the ability to monitor the serial port communications of all newly installed devices can help identify and resolve the issue in a timely manner. This is just one example of the utility that can be gained by having your team monitor COM port device communication for several devices simultaneously.

Electronic Team’s RS232 Port Analyzer is an excellent serial port monitor for Windows 10 that lets you easily perform a comparison of several previously saved sessions to discern any differences. Lean more how to add serial port in Windows 10.

Here is how to monitor COM port communication between your current monitoring and one that has been saved.

  1. Start or open a monitoring session.
  2. Select the ‘Session’ from the main menu and then ‘Compare Sessions’ in the sub-menu.
  3. Select the specific monitoring files that you want to use.
  4. You now can review the session easily as they are displayed in two adjacent windows, making it easy to identify differences.

Внутри ATmega328

В основе данного подраздела лежит техническое описание на ATmega328 версии Rev. 8271C – 08/10. Приводимые мной страницы могут немного отличаться от текущей версии.

Для полного понимания кода библиотеке , нам необходимо понимать, что ей нужно сделать с микроконтроллером, чтобы его настроить.

Просмотр технического описания на микроконтроллер показывает нам, как работает двухпроводная (Two Wire) система. Стоит отметить:

Микроконтроллер включает в себя аппаратный модуль TWI, который обрабатывает связь через шину I2C. … Интересно, что это означает, что связь не обрабатывается библиотекой исключительно программно, как вы могли бы подумать! Другими словами, библиотека сама в программе не создает битовый поток. Библиотека взаимодействует с аппаратным компонентом, который выполняет тяжелую работу. Смотрите страницу 222 технического описания.
«AVR TWI работает с байтами и основывается на прерываниях…» (раздел 21.6 на странице 224)

Это ключевой момент; это означает, что
вы настраиваете регистры;
вы позволяете TWI модулю осуществлять связь;
вы можете делать в это время что-то еще; ваш микроконтроллер с тактовой частотой 16 МГц не занят управлением последовательной связью на 100 кГц;
TWI модуль вызывает прерывание, когда заканчивает работу, чтобы уведомить процессор об изменениях состояния (включая успешность операций и/или ошибки).

Однако обратите внимание, что библиотека блокирует ввод/вывод. Это означает, что он переходит в цикл ожидания и ждет завершения связи I2C

Ваше приложение не может ничего делать, пока модуль TWI общается по шине I2C. Обратите внимание, что это может быть не то, чего бы вы хотели: если ваша программа критична ко времени, то ваш 16-мегагерцовый процессор, застрявший в цикле ожидания и ждущий 100-килогерцового потока связи, будет не эффективен. Возможно, вам лучше написать собственный код I2C. В исходном коде avr-libc есть пример в ./doc/examples/twitest/twitest.c (смотрите http://www.nongnu.org/avr-libc/). Вы можете найти версию avr-libc, используемую вашей конкретной IDE Arduino, посмотрев файл versions.txt в каталоге установки Arduino IDE. Это будет где-то в Java/hardware/tools/avr. На Mac полный путь будет следующим /Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/versions.txt; путь у вас будет другим, но схожим.

Функция print() библиотеки Serial

Функция print является одной из самых часто встречающихся в скетчах ардуино. Она принимает на вход текст или цифры и затем передает их через открытый последовательный порт в формате ASCII. Примеры:

  • Serial.print(“Hello, ArduinoMaster”) – на экране монитор порта мы увидим надпись Hello, ArduinoMaster
  • Serial.print(12) – число будет автоматически преобразовано и выведено как текст: 12
  • Serial.print(2.9) – это число тоже будет преобразовано в текст: 12.9
  • Serial.print(65) – в данном случае 65 передается как int и будет сконвертировано в строку “65”, которая и будет отправлена в последовательный порт.

Т.к. функция является членом класса Serial, мы должны использовать название класса и символ точки “.” в ее синтаксисе . Класс Serial объявляется в библиотеке Serial, но нам не нужно подключать эту библиотеку отдельно, она является внутренней библиотекой ардуино и подключается автоматически. Функция не возвращает значение, поэтому ее нельзя использовать для форматирования и последующего использования в скетче. Для этих целей больше подойдут методы класса String.

Перед использованием функции необходимо предварительно открыть работу с последовательным портом, используя функцию begin(). Подробную информацию по функции Serial.begin вы можете найти в отдельной статье на нашем сайте.

Естественно, мы можем передавать в качестве параметров для функции print() не константы, а переменные определенных типов. Например, так:

Текст, передаваемый с помощью print() обязательно завершается символом конца строки “”, что является стандартом для  C++ и Ардуино.

Форматирование и конвертация строк

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

Варианты значений констант для форматирования:

  • DEC – обычное число в десятичной системе исчисления
  • BIN – преобразует в двоичный код и выведет строку, содержащую только символы 0 и 1
  • OCT – преобразует в восьмеричную систему исчисления
  • HEX – преобразует в шестнадцатеричную систему
  • Цифра от 0 до 9 – используется, если первый аргумент – вещественное число с плавающей запятой. Форма указывает количество знаков после запятой, которые останутся при выводе. Само число при этом будет округлено.

Примеры:


Serial.println(65, DEC);  // выведет “65”

Serial.println(65, BIN);  // выведет “1000001”

Serial.println(65, OCT);  // выведет 101, т.к. 65 в  8-ной системе исчисления равно 101

Serial.println(65, HEX);  // выведет 41, т.к. 65 в 16-ной системе исчисления равно 41

Serial.println(9.876, 2); // выведет два символа после запятой, предварительно округлив - 9.88

Serial.println(9.876, 0); // выведет число 10

В старых версиях ардуино можно было использовать еще один параметр BYTE. Начиная с версии 1.0 эта константа не поддерживается и компилятор выдаст вам ошибку «Ключевое слово ‘BYTE’ больше не поддерживается». Для вывода ASCII символа по его коду нужно использовать метод write().

Платы и модули для функционала

Существует много плат Arduino, описание которых говорит о различиях в объеме памяти, портах, питании, тактовой частоте и др. Одни предназначены для решения простых задач, другие — для решения более сложных.

К популярным платам относятся следующие виды:

  1. Arduino Uno. Наиболее распространенная плата. Есть большой выбор уроков. Плата допускает замену контроллера. Оснащена 14 цифровыми вводами-выводами (6 ШИМ), 6 аналоговыми входами, флеш-памятью 32 Кб (ATmega328), из которых 0,5 Кб использует загрузчик.
  2. Arduino Mega 2560. Создана на базе микроконтроллера ATmega2560. Флеш-память — 256 Кб, из которых 8 Кб использует загрузчик. Имеет 54 цифровых вводов-выводов (14 ШИМ), 16 аналоговых входов, 8 Кб оперативной памяти. Среди всех плат «Ардуино» у этой самый большой размер.
  3. Arduino Due. Оснащена 54 цифровыми вводами-выводами (12 ШИМ), 12 аналоговыми входами (2 выходами). Создана на базе микроконтроллера AT91SAM3X8E с рабочим напряжением 3,3 В и флеш-памятью 512 Кб.
  4. Arduino Pro Mini 3.3V. Самая миниатюрная плата в семействе Arduino. Напряжение — 3,3 В. Требует использования внешнего программатора. Память данных составляет 2 Кб. Создана на базе микроконтроллера ATmega328P. Количество цифровых выводов — 14 линий (6 из которых — ШИМ), аналоговых — 6.
  5. Arduino Pro Mini 5V. Аналог предыдущей модели с напряжением 5 В.
  6. Arduino Nano V3.0. Создана на базе ATmega328. Сдержит 32 Кб памяти, из которых 2 Кб использует загрузчик. Имеет 14 цифровых вводов-выводов (6 ШИМ), 6 аналоговых входов, встроенный порт USB. Напряжение — 5 В.
  7. Arduino Micro. Разновидность платы c возможностью имитировать различные USB-устройства при подключении к ПК. Оснащена 20 цифровыми вводами-выводами (7 ШИМ), 12 аналоговыми входами.

Кроме того, существуют дополнительные модули и датчики с нужными ответвлениями:

  1. Датчики. Системы, считывающие, отправляющие и обрабатывающие информацию. Расширяют аппаратные функции проекта.
  2. Модули. Дополнения, которые позволяют расширить вычислительные мощности проекта. К ним относят карты памяти, вспомогательные процессы.

Датчики можно разделить на категории:

  1. Устройства получения информации. Датчики и сканеры, позволяющие получить сведения об окружающей среде: давлении, температуре, влажности, расстоянии до объектов. Есть возможность вводить параметры, зависящие от этих показаний. С помощью датчика расстояния можно создавать роботы-пылесосы, которые передвигаются по комнате, избегая препятствий.
  2. Устройства обработки информации. Реализуются отдельно или совместно с предыдущими датчиками. Используются для совершения промежуточных операций.
  3. Устройства вывода информации. Это ЖК-экраны, светодиодные индикаторы, сенсорные экраны, динамики и т. д.

Среди наиболее популярных модулей «Ардуино» можно выделить:

  1. Ультразвуковой дальномер HC-SR04. Датчик, позволяющий с помощью ультразвука измерить расстояние от 2 см до 4 м.
  2. Инфракрасный дальномер Sharp. Измеряет расстояние от 20 см до 1,5 м посредством инфракрасного излучения.
  3. Модуль температуры и влажности DHT11. Измеряет температуру в диапазоне от 0 до +50°C и влажность от 20 до 90%. Используется для теплиц или в качестве комнатного термометра. Часто приобретается для умного дома.
  4. Датчик влажности почвы FC-28. Измеряет влажность почвы или другой среды. Нужен для автоматизированного полива растений.
  5. Bluetooth HC-06. Помогает организовать беспроводную связь с другими устройствами.

Классика жанра: мигающий светодиод

Давайте теперь дополним нашу программу так, чтобы происходило хоть что-то.
На Arduino, к 13-му пину подключён светодиод. Им можно управлять, чем мы и займёмся.

void setup()
{
    pinMode(13, OUTPUT);
}
 
void loop()
{
    digitalWrite(13, HIGH);
    delay(100);
    digitalWrite(13, LOW);
    delay(900);
}

Скомпилируйте, загрузите программу. Вы увидите, что каждую секунду светодиод на плате
помигивает. Разберёмся почему этот код приводит к ежесекундному миганию.

В наши ранее пустые функции мы добавили несколько выражений. Они были размещены между
фигурными скобками функций и . В появилось одно выражение, а в
сразу 4.

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

Теперь давайте поймём в каком порядке исполняются сами блоки, т.е. функции и .
Не задумывайтесь пока что значат конкретные выражения, просто понаблюдайте за порядком.

  • Как только Arduino включается, перепрошивается или нажимается кнопка , «нечто» вызывает функцию . То есть заставляет исполняться выражения в ней.
  • Как только работа завершается, сразу же «нечто» вызывает функцию .
  • Как только работа завершается, сразу же «нечто» вызывает функцию ещё раз и так до бесконечности.

Если пронумеровать выражения по порядку, как они исполняются, получится:

void setup()
{
    pinMode(13, OUTPUT);     ❶
}
 
void loop()
{
    digitalWrite(13, HIGH);  ❷    ❻    ❿
    delay(100);              ❸    ❼    …
    digitalWrite(13, LOW);   ❹    ❽ 
    delay(900);              ❺    ❾ 
}

Ещё раз напомним, что не стоит пытаться воспринимать всю программу, читая сверху вниз.
Сверху вниз читается только содержимое блоков. Мы вообще можем поменять порядок объявлений
и .

void loop()
{
    digitalWrite(13, HIGH);  ❷    ❻    ❿
    delay(100);              ❸    ❼    …
    digitalWrite(13, LOW);   ❹    ❽ 
    delay(900);              ❺    ❾ 
}
 
void setup()
{
    pinMode(13, OUTPUT);     ❶
}

Результат от этого не изменится ни на йоту: после компиляции вы получите абсолютно эквивалентный
бинарный файл.

Step 2: What the Serial Monitor Looks Like

When you click on it, the Serial Monitor will pop up in a new window. Above is what our example Serial Monitor Sketch looks like with the Monitor opened.

Look at the Serial Monitor window.

  • — The small upper box is where you can type in characters (hit or click «Send»)
  • — The larger area (Corner can be dragged to enlarge) is where characters sent From Arduino will be displayed.- At the bottom are two pulldowns:
  • — One sets the «line ending» that will be sent to Arduino when you or click Send
  • — The other sets the Baud Rate for communications. (If this does not match the value set up in your sketch in Setup, characters will be unreadable). Example: Serial.begin(9600); Some sketches or other applications may use a different Baud Rate.

О точках с запятыми

Вы могли заинтересоваться: зачем в конце каждого выражения ставится точка с запятой? Таковы правила C++.
Подобные правила называются синтаксисом языка. По символу компилятор понимает где заканчивается
выражение.

Как уже говорилось, переносы строк для него — пустой звук, поэтому ориентируется он на этот знак препинания.
Это позволяет записывать сразу несколько выражений в одной строке:

void loop()
{
    digitalWrite(5, HIGH); delay(100); digitalWrite(5, LOW); delay(900);
}

Программа корректна и эквивалентна тому, что мы уже видели. Однако писать так — это дурной тон. Код
гораздо сложнее читается. Поэтому если у вас нет 100% веских причин писать в одной строке несколько
выражений, не делайте этого.

Код

Подключаем класс Console (он является наследником Bridge).

1 #include <Console.h>

Создаем строку, в которой будем хранить информацию, присланную от Bridge.

1 String name;

В секции setup() инициализируем Console и Bridge. Ждем подключения консоли, а затем запрашиваем информацию.

1 void setup() {
2   Bridge.begin();
3   Console.begin(); 
4 
5   while (!Console); 
6 
7   Console.println("Hi, what's your name?");  // "Привет, как тебя зовут?"
8 }

В секции loop() проверяем, есть ли какие-нибудь байты в буфере консоли. Если есть, считываем самый старый символ в локальную переменную.

1 void loop() {
2   if (Console.available() > ) {
3     char c = Console.read();

Если этим символом является символ новой строки («\n»), то это самый последний символ пришедшей строки. Выводим на консоль сообщение, запрашиваем еще информации, очищаем строку.

1 if (c == '\n') {
2       Console.print("Hi ");  // "Привет "
3       Console.print(name);
4       Console.println("! Nice to meet you!");  // "! Приятно познакомиться!"
5       Console.println();
6       Console.println("Hi, what's your name?");  // "Привет, как тебя зовут?"
7       name = "";
8     }
9 }

Если в пришедшей строке нет символа новой строки, то добавляем его к концу строки.

1 else {      
2       name += c; 
3     }
4   }
5 }

Весь скетч полностью – ниже:

 1 /*
 2   Считывание текста в консоли
 3 
 4   Считывает данные, идущие от Bridge, при помощи функции Console.read(),
 5   а затем записывает их в строку. 
 6 
 7   Чтобы увидеть консоль, откройте меню Port, впишите имя и IP-адрес Yun, а затем откройте Port Monitor.
 8 
 9  Кроме того, консоль можно увидеть, открыв окно терминала и вписав 
10 ssh root@ yourYunsName.local 'telnet localhost 6571', а затем нажав Enter. 
11  Когда вас попросят о введении пароля, введите его.
12 
13  Создан 13 июня 2013 Анжело Сцилабба (Angelo Scialabba) 
14  модифицирован 16 июня 2013 Томом Иго (Tom Igoe).
15 
16  Этот код не защищен авторским правом.
17 
18  */
19 
20 #include <Console.h>
21 
22 String name;
23 
24 void setup() {
25   // Инициализируем Console и ждем открытия порта:
26   Bridge.begin();
27   Console.begin(); 
28 
29   // Ждем открытия порта консоли:
30   while (!Console); 
31 
32   Console.println("Hi, what's your name?"); // "Привет, как тебя зовут?"
33 } 
34 
35 void loop() {
36   if (Console.available() > ) {
37     char c = Console.read(); // считываем следующий символ
38     // Ищем, нет ли символа новой строки.
39     // Это должен быть последний символ в строке. 
40     if (c == '\n') {
41     // Выводим на консоль текст с присланным именем:
42       Console.print("Hi ");  // "Привет "
43       Console.print(name);
44       Console.println("! Nice to meet you!");  // "! Приятно познакомиться!"
45       Console.println();
46       // Запрашиваем имя еще раз и очищаем старое имя:
47       Console.println("Hi, what's your name?");  // "Привет, как тебя зовут?"
48       name = "";  // очищаем строку с именем
49     } 
50     else {       // если буфер пуст, Cosole.read() возвращает -1
51       name += c; // добавляем к строке с именем символ новой строки 
52     }
53   }

Что такое протокол I2C и как он работает

Термин IIC расшифровывается как “Inter Integrated Circuits” и часто обозначается как I2C или даже как TWI (2-wire interface protocol), но во всех случаях за этими обозначениями скрывается один и тот же протокол. I2C представляет собой протокол синхронной связи – это значит что оба устройства, которые обмениваются информацией с помощью данного протокола должны использовать общий сигнал синхронизации. Поскольку в этом протоколе используются всего 2 линии (провода), то по одной из них должен передаваться сигнал синхронизации, а по другой – полезная информация.

Впервые протокол I2C был предложен фирмой Phillips. Протокол в самом простом случае соединяет с помощью 2-х линий 2 устройства, одно из устройств должно быть ведущим, а другое – ведомым. Связь возможна только между ведущим и ведомым. Преимуществом протокола (интерфейса) I2C является то, что к одному ведущему можно подключить несколько ведомых.

Схема связи с помощью протокола I2C представлена на следующем рисунке.

Назначение линий данного интерфейса:

  • Serial Clock (SCL): по ней передается общий сигнал синхронизации, генерируемый ведущим устройством (master);
  • Serial Data (SDA): по ней осуществляется передача данных между ведущим и ведомым.

В любой момент времени только ведущий может инициировать процесс обмена данными. Поскольку в этом протоколе допускается несколько ведомых, то ведущий должен обращаться к ним, используя различные адреса. То есть только ведомый с заданным (указанным) адресом должен отвечать на сигнал ведущего, а все остальные ведомые в это время должны «хранить молчание». Таким образом, мы можем использовать одну и ту же шину (линию) для обмена данными с несколькими устройствами.

Уровни напряжений для передаваемых сигналов в интерфейсе I2C жестко не определены. В этом плане I2C является достаточно гибким, то есть если устройство запитывается от напряжения 5v, оно для связи с помощью протокола I2C может использовать уровень 5v, а если устройство запитывается от напряжения 3.3v, то оно для связи с помощью протокола I2C может использовать уровень 3v. Но что делать если с помощью данного протокола необходимо связать между собой устройства, работающие от различных питающих напряжений? В этом случае используются преобразователи/переключатели напряжения (voltage shifters).

Существует несколько условий для осуществления передачи данных в протоколе I2C. Инициализация передачи начинается с падения уровня на линии SDA, которое определяется как условие для начала передачи (‘START’ condition) на представленной ниже диаграмме. Как видно из этого рисунка, в то время как на линии SDA происходит падение уровня, в это же самое время на линии SCL ведущий поддерживает напряжение высокого уровня (high).

То есть, как следует из рисунка, падение уровня на линии SDA является аппаратным триггером для условия начала передачи. После этого все устройства на этой шине переключаются в режим прослушивания.

Аналогичным образом, повышение уровня на линии SDA останавливает передачу данных, что на представленной диаграмме обозначено как условие окончания передачи данных (‘STOP’ condition). В это же самое время ведущим на линии SCL поддерживается напряжение высокого уровня (high).

На следующем рисунке представлена структура адреса ведомого в протоколе I2C.

Бит R/W показывает направление передачи следующих за ним байт, если он установлен в HIGH – это значит что будет передавать ведомый (slave), а если он установлен в low – это значит что будет передавать ведущий (master).

Каждый бит передается в своем временном цикле, то есть нужно 8 временных циклов чтобы передать байт информации. После каждого переданного или принятого байта 9-й временной цикл используется для подтверждения/не подтверждения (ACK/NACK) приема информации. Этот бит подтверждения (ACK bit) формируется либо ведомым, либо ведущим в зависимости от ситуации. Для подтверждения приема информации (ACK) на линии SDA ведущим или ведомым устанавливается низкий уровень (low) в 9 временном цикле, в противном случае происходит не подтверждение приема информации (NACK).

На следующем рисунке представлена структура передаваемого сообщения в протоколе I2C.

Пример скетча для print и println

В завершении давайте рассмотрим реальный скетч, в котором мы используем монитор порта Arduino IDE для вывода отладочной информации с платы контроллера.

void setup() {

  // Объявляем работу с последоватлеьным портом в самом начале
  Serial.begin(9600);
  // Теперь мы можем писать сообщения
  Serial.println ("Hello, Arduino Master");
}

void loop() {

  // Выводим таблицу с информацией о текущих значениях портов
  Serial.print("Port #\t\t");
  Serial.println("Value");
  Serial.print("A0\t\t");
  Serial.println(analogRead(A0));
  Serial.print("A1\t\t");
  Serial.println(analogRead(A1));
  Serial.println("--------");
  delay(1000);
}

Нам понадобится

  • Отладочная плата AVR. Предпочтительно Arduino UNO/Piranha UNO или любая другая плата AVR, совместимая с Ethernet шилдом. Если Ваша панель использует большое количество переменных и/или Ваш скетч использует большое количество библиотек, необходимо использовать отладочную плату на базе микроконтроллера с большей статической и динамической памятью, такую как Arduino MEGA или Piranha ULTRA
  • Ethernet шилд W5500 (если Вы используете шилд на базе чипа ENC28J60, необходимо использовать отладочную плату на базе микроконтроллера с большей статической и динамической памятью, такую как Arduino MEGA или Piranha ULTRA, при этом необходимо скачать и установить последнюю версию библиотеки UIPEthernet и изменить в скетче Ethernet.h на UIPEthernet.h).
  • Провод RJ45-RJ45 категории cat5e.
  • Маршрутизатор со свободным гнездом RJ-45 LAN.
  • Подключение к сети Интернет.

Feature list comparison

Check out the main differences in feature packs of free open source and advanced versions

# Options Free Advanced
1 Support for RS232 ports
2 Compatibility with RS422, RS485 ports
3 Reading COM port data and saving it to a file
4 Logging data from any number of serial ports at a time
5 Capturing all data received by a COM port
6 The possibility to add several ports for monitoring in one session
7 Support for all baud rates
8 Search options
9 Filtering of recorded IPRs
10 Availability of several data viewing modes
11 Sniffing COM ports already opened by other apps
12 Command line support
13 Sessions comparison
14 Parsing of Modbus RTU and Modbus ASCII protocols
15 Redirected file can be either split into a bunch of files or can be limited to user-defined size
16 The ability to copy captured data to clipboard

How to analyze serial port traffic using Serial Port Monitor

To begin, download Serial Port Monitor, install it and launch the application. Next, you will want to start a monitoring session which you can do following these steps:

  1. Go to the Main menu in the window displayed by Serial Port Monitor. Select Session -> New session.

    You can use alternative methods to start a session. The keyboard shortcut ‘Ctrl + N’ and the ‘New’ icon on the main toolbar also bring up the ‘New Monitoring session’ screen.

  2. Select which of the four available modes you want to use to display data captured during your monitoring session:
    • ★ Line view – displays the details of requests that are transmitted through a specific serial line
    • ★ Table view – allows you to view recorded IRPs in a table format
    • ★ Terminal view – view all captured data on a console as ASCII text characters
    • ★ Dump view – displays all serial data passes through a line.

      The ‘Select all’ and ‘Select none’ buttons can be used to simplify your selections.
      Your session can ‘Start in new window’ or “Start monitoring now’ by selecting the appropriate options.
      In ‘Capture options’ select the events you want to monitor — Read/Write, Create/Close and Device Control.

  3. Click ‘Start monitoring’ to initiate the monitoring session. The new monitoring window will be presented.
  4. Saving your session can be done by navigating to the ‘Session -> Save session/ Save session As’ Main menu selection. You can also use the main toolbar’s ‘Save’ icon or the ‘Ctrl + S’ keyboard shortcut.

Отправка данных

Мы можем не только получать данные с платы, но и отправлять данные на плату, заставляя выполнять команды с компьютера.

Допустим, мы будем посылать символ «1» из Processing. Когда плата обнаружит присланный символ, включим светодиод на порту 13 (встроенный).

Скетч будет похож на предыдущий. Для примера создадим небольшое окно. При щелчке в области окна будем отсылать «1» и дублировать в консоли для проверки. Если щелчков не будет, то посылается команда «0».

Теперь напишем скетч для Arduino.

Запускаем оба скетча. Щёлкаем внутри окна и замечаем, что светодиод загорается. Можно даже не щёлкать, а удерживать кнопку мыши нажатой — светодиод будет гореть постоянно.