Можно ли использовать arduino как usb ethernet конвертер

Используем Arduino как USB -> UART преобразователь

Использование Arduino как USB-UART преобразователь:

На платах Arduino c USB портом (у некоторых плат нет USB порта) уже есть USB-UART преобразователь на базе чипа CH340 или FTDI, или ATmega, или др. Шина USB этих чипов подключена к порту USB, а шина UART к аппаратным выводам TX и RX контроллера платы Arduino.

Всё что нужно сделать для работы платы Arduino в качестве USB-UART преобразователя, это отключить её контроллер от шины UART или заставить его не реагировать на сигналы проходящие по этой шине. Сделать это можно соединив вывод RESET с выводом GND платы Arduino.

Теперь плату Arduino можно подключить к USB порту компьютера, а внешние устройства к выводам TX и RX платы Arduino (обычно это выводы 0 и 1). Обратите внимание на то, что выводы устройств подключаются к плате, не TX к RX, RX к TX, а TX к TX, RX к RX (так как вывод TX чипа преобразователя на плате Arduino подключён к выводу RX самой платы, а вывод RX чипа подключён к выводу TX платы).

Для управления подключённым устройством нужно установить на компьютер программу терминал. Одним из таких терминалов является свободно распространяемая программа Termite с поддержкой Русского языка.

Альтернативный метод:

В качестве альтернативного метода можно воспользоваться двумя шинами UART Arduino: аппаратной и программной. Аппаратная шина используется для подключения Arduino к USB порту компьютера, а программная шина UART используется для подключения модулей к плате Arduino.

Вы просто загружаете скетч, подключаете Arduino к USB порту компьютера, а устройство к выводам указанным в скетче (в примере: вывод D2 это RX — подключается к выводу TX устройства, вывод D3 это TX — подключается к выводу RX устройства).

#include <SoftwareSerial.h> // Подключаем библиотеку SoftwareSerial для общения с модулем по программной шине UART SoftwareSerial softSerial(2,3); // Создаём объект softSerial указывая выводы RX, TX (можно указывать любые выводы Arduino UNO) // В данном случае вывод TX модуля подключается к выводу 2 Arduino, а вывод RX модуля к выводу 3 Arduino. // Инициируем работу шин UART с указанием скоростей обеих шин: // void setup(){ // softSerial.begin(38400); // Инициируем передачу данных по программной шине UART на скорости 38400 (между модулем и Arduino) Serial.begin(9600); // Инициируем передачу данных по аппаратной шине UART на скорости 9600 (между Arduino и компьютером) } // // // Выполняем ретрансляцию: // Всё что пришло с модуля — отправляем компьютеру, а всё что пришло с компьютера — отправляем модулю void loop(){ // if(softSerial.available()){ Serial.write(softSerial.read());} // Передаём данные из программной шины UART в аппаратную (от модуля через Arduino к компьютеру) if( Serial.available()){softSerial.write( Serial.read());} // Передаём данные из аппаратной шины UART в программную (от компьютера через Arduino к модулю ) }

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

Управление подключёнными устройствами осуществляется через монитор последовательного порта Arduino IDE (для передачи AT-команд не забудьте установить пункт — добавлять символы NL & CR в нижнем правом углу монитора последовательного порта).

Источник

Преобразователь UART в Ethernet на Arduino

Весьма полезная вещь — преобразователь UART в Ethernet. С его помощью можно было бы управлять устройствами, которые оснащены универсальным последовательным асинхронным интерфейсом UART, по локальной сети. Давайте как раз и займёмся созданием такого устройства.

1Существующие аналоги преобразователя UART в Ethernet

Аналогичные устройства создаются различными фирмами. Так, например, серверы последовательных портов выпускает фирма MOXA. Выглядят такие устройства так:

Преобразователь интерфейсов MOXA NPort 5250A Преобразователь интерфейсов MOXA NPort 5250A

Или вот так:

Преобразователь интерфейсов MOXA NPort 5650I-8-DT Преобразователь интерфейсов MOXA NPort 5650I-8-DT

У данного производителя имеются и другие вариации, которые отличаются количеством портов, поддерживаемыми интерфейсами (RS-232, RS-485, RS-422 и другие), способом подключения (Ethernet, USB и другие) и так далее. Также эти устройства имеют удобный веб-интерфейс для настройки, поддерживают удалённое управление с использованием стандартного языка SCPI и другие «навороты». Как правило, такие устройства применяются в промышленности, а значит, их стоимость для обычного пользователя заоблачная.

Нам же для создания аналогичного устройства (хоть и не столь навороченного), понадобится:

  • Arduino UNO или иная совместимая плата;
  • Ethernet-шилд;
  • преобразователь с 12В в 5В UART с разъёмом DB9;
  • соединительные провода;
  • персональный компьютер со средой разработки Arduino IDE.

2Схема соединений и скетч преобразователя UART в Ethernet

Если мы воспользуемся готовым Ethernet шилдом, то подключений будет минимум. Прежде всего необходимо установить Ethernet шилд. Он устанавливается сверху на плату Arduino как «мезонинная» плата.

Шилд — в мире Arduino-разработки это печатная плата с разъёмами и микросхемами, обладающая какой-либо готовой функциональностью. Например, Ethernet-шилд позволяет подключать Arduino к локальной сети посредством кабеля c коннектором RJ-45; SD-шилд позволяет подключать к Arduino SD или mini/micro SD карты, и т.д. Шилды очень просто подключаются к Arduino, а также обеспечивают лёгкое подключение к ним самим (при необходимости).

К Arduino можно подключать устройства с UART, которые работают на напряжении 5 В, т.к. цифровые выводы Arduino работают именно с таким напряжением (максимум допустимо подавать 5.5 В). Стандартный порт компьютера и другие устройства с UART работают на напряжении 12 В, и подключать их к нашему устройству напрямую нельзя. Необходимо использовать преобразователь 12-вольтового UART в 5-вольтовый на микросхеме MAX3232. Предлагаемый модуль выполнен на небольшой платке, имеет стандартный разъём DB9 и удобные отверстия для крепления, которые соосны с отверстиями в плате Arduino UNO и Ethernet шилда.

Преобразователь Ethernet в UART на Arduino UNO Преобразователь Ethernet в UART на Arduino UNO

Для фиксации преобразователя можно воспользоваться винтами с гайками, как на фотографии. Линию RX модуля преобразователя достаточно подключить к линии TX Arduino, TX — к RX, питание модуля к 5 В Arduino, землю модуля — к земле Arduino.

Читайте также:  Можно ли использовать объективы от dx камер на fx камерах

Преобразователь Ethernet в UART на Arduino UNO Преобразователь Ethernet в UART на Arduino UNO

Если предполагается работа с устройствами, которые используют 5-вольтовый UART, то модуль преобразования напряжения не нужен. Если нужно подключаться к компьютеру, который не имеет порта, можно использовать 5-вольтовый преобразователь USB в UART.

Преобразователь Ethernet в UART подключён к ПК через USB-UART преобразователь Преобразователь Ethernet в UART подключён к ПК через USB-UART преобразователь

Так как в Arduino имеется только один аппаратный порт, а хотелось бы выводить также диагностические сообщения, то будем использовать для вывода сообщений аппаратный порт на цифровых выводах 0 и 1, а для работы с преобразователем используем программный последовательный порт на аналоговых выводах A8 и A9. В «боевой» прошивке, когда убедимся, что всё работает как надо, я бы отключил диагностический вывод и переключил работу с модулем преобразователя с программного на аппаратный UART Arduino.

Теперь напишем такой скетч для нашего устройства.

Скетч преобразователя UART в Ethernet (разворачивается) #include <SPI.h> // это нужно для работы Ethernet-шилда #include <Ethernet.h> #include <SoftwareSerial.h> byte mac[] = { 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF }; // укажите желаемый MAC IPAddress ip(192, 168, 0, 155); // укажите желаемый IP const int port = 7777; // укажите желаемый порт EthernetServer server(port); SoftwareSerial uart(8, 9); // сюда подключаем внешний UART (8 — RX, 9 — TX) String tcpData; //строки для временного хранения сообщений String uartData; void setup() { Serial.begin(9600); uart.begin(9600); Serial.ln(«UART started»); Ethernet.begin(mac, ip); server.begin(); Serial.(«Server started at «); IPAddress lip = Ethernet.localIP(); for (byte thisByte = 0; thisByte < 4; thisByte++) { Serial.(lip[thisByte], DEC); Serial.(«.»); } Serial.ln(«:» + (String)port); } void loop() { EthernetClient client = server.available(); // ожидаем подключения if (client) { // принимаем запрос на подключение TCP клиента while (client.connected()) { // пока клиент подключён // ЕСЛИ ПРИШЛИ ДАННЫЕ ПО UART: if (uart.available() > 0) { char c = uart.read(); if (c != ‘n’) { uartData.concat(c); // добавляем прочитанный символ к временной строке } else { Serial.ln(«UART data received: » + uartData); client.ln(uartData); // отправляем принятую строку TCP клиенту uartData = «»; // обнуляем временную строку } } // ЕСЛИ ПРИШЛИ ДАННЫЕ ПО TCP: if (client.available()) { char c = client.read(); if (c != ‘n’) { tcpData.concat(c); } else { Serial.ln(«TCP data received: » + tcpData); uart.ln(tcpData); // отправляем принятые данные в UART tcpData = «»; } } } client.stop(); // закрываем соединение } }

Загрузим этот скетч в Arduino. Соединим сетевым кабелем разъём Ethernet-шилда и маршрутизатор (роутер) или коммутатор (свитч). Коннектор DB9 преобразователя соединим с портом компьютера. Подключимся монитором среды Arduino IDE к последовательному порту Arduino. Если всё хорошо, то появится сообщение, что сервер запущен.

Преобразователь Ethernet-UART на Arduino подключён к порту компьютера и локальной сети Преобразователь Ethernet-UART на Arduino подключён к порту компьютера и локальной сети

Подключимся какой-либо терминалкой к нашему серверу на Arduino, а другой терминалкой — к порту компьютера, к которому подключён преобразователь. Отправим через терминалку команду по сети. Она должна появиться в мониторе последовательного порта Arduino. Если отправим команду из монитора — она появится в терминалке порта. Преобразователь работает!

Источник

ОБОРУДОВАНИЕ ТЕХНОЛОГИИ РАЗРАБОТКИ

Обмен данными платы Арпдуино с компьютером

В уроке подключим локальный контроллер на базе Ардуино к компьютеру. Для связи будем использовать стандартный последовательный интерфейс UART.

Предыдущий урок Список уроков Следующий урок

Это самый простой вариант подключения платы Ардуино к компьютеру. Ничего не добавляем к плате. Подключаем к ней трех проводной кабель или используем стандартный USB кабель.

Коротко об интерфейсе UART.

Это самый распространенный последовательный интерфейс современных микроконтроллеров. Я достаточно подробно описывал его в уроке 12. Сейчас только подчеркну особенности соединения UART устройств между собой.

Для обмена данными в UART есть 2 сигнала:

  • RX — вход, через который происходит прием данных:
  • TX — выход, через который данные передаются.

Оба сигнала дискретные, имеют логические уровни CMOS, т.е.:

  • уровень логического 0 около 0 В;
  • уровень логической 1 около 5 В.

Активный уровень сигналов — низкий. В режиме ожидания сигналы находятся в высоком уровне.

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

Для работы с UART интерфейсом в системе Ардуино есть встроенный класс Serial. Использование функций Serial значительно облегчает разработку приложений для последовательного порта. Класс считывает данные с контроллера UART и записывает их в программный буфер. Это происходит по прерыванию от контроллера, незаметно для основной программы. Передача данных также происходит под управлением класса Serial. Для этого достаточно загрузить данные в программный буфер функцией Serial.write(). Класс Serial подробно описан в уроке 12.

Интерфейс UART радиальный, т.е. по линиям связи одного интерфейса подключаются только 2 устройства. Выход TX одного устройства подключается к входу RX второго. Сигнал TX второго UART устройства соединяется с входом RX первого.

Схема подключение устройств через UART

У нас UART устройством может быть плата Ардуино или преобразователь интерфейсов USB-UART, подключенный к компьютеру.

Схема локального контроллера.

Разработаем схему локального контроллера, которую будем использовать и в последующих уроках. Только придется изменять схему интерфейса связи. В этом варианте используется стандартный интерфейс UART.

Я решил подключить к контроллеру:

  • датчик температуры DS18B20;
  • переменный резистор, с помощью которого на аналоговом входе можно задавать напряжение;
  • кнопку — датчик дискретного сигнала;
  • светодиод — дискретное исполнительное устройство.

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

Для локального контроллера я использовал плату Arduino Nano. Вот моя схема.

Принципиальная схема локального контроллера

Собранный локальный контроллер выглядит так.

Локальный контроллер на Arduiuno Nano

Локальный контроллер на Arduiuno Nano

Вы можете использовать другие типы плат, другие датчики.

Линии связи с конвертером USB-UART подключаются непосредственно к сигналам TX и RX платы Ардуино. Могут быть два физических варианта реализации связи с компьютером:

  • Использовать конвертер интерфейсов USB-UART, например модуль CH340. В этом случае модуль подключается к USB порту компьютера, а провода связи (3 провода) тянутся к локальному контроллеру.
  • Использовать USB-UART преобразователь, встроенный в плату Ардуино. Соединение сигналов конвертера интерфейсов и микроконтроллера происходит на плате. Логически этот вариант не отличается от предыдущего, а выглядит это как подключение платы Ардуино к компьютеру через USB порт.
Читайте также:  Можно ли использовать туалетную бумагу в биотуалет

Протокол обмена данными через UART.

Минимальная единица информации, которой можно обмениваться по UART это байт. Мы передаем байты, а нам надо передавать числа, команды, текст. То как интерпретировать последовательность байтов при обмене данными определяет протокол.

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

Протоколы бывают числовыми и текстовыми.

Числа, данные в текстовом протоколе передаются как коды символов. Например, число «132» в текстовом протоколе передается как 3 байта 0x31, 0x33 и 0x32. Это коды символов «1», «3» и «2». В числовом протоколе это же число передается одним байтом со значением 132.

Очевидно главное преимущество числовых протоколов перед текстовыми. Для передачи одинакового количества информации им требуется значительно меньше передаваемых данных.

Достоинство текстовых протоколов — возможность использования для контроля и отладки стандартных средств и программ — текстовых терминалов. В качестве примера можно привести монитор последовательного порта Arduino IDE. Данные в нем выводятся в человеческом, понятном виде.

Резюмируя о текстовых и числовых протоколах применительно к интерфейсам передачи данных:

  • Числовые протоколы требуют передачи по линии связи намного меньше данных, чем текстовые протоколы для того же количества информации.
  • При числовых протоколах обработка данных обмена требует значительно меньше ресурсов микроконтроллера. Это связано с тем, что нет необходимости преобразовывать текстовые строки в двоичные числа и наоборот. А это крайне ресурсоемкие операции.
  • При текстовых протоколах для контроля и отладки можно использовать стандартные текстовые терминалы. Числовые протоколы можно отлаживать только специальными программами. Это достоинство текстовых протоколов несколько принижается при использовании в протоколах контрольных кодов. Посчитать их вручную сложная, практически невыполнимая задача.

Я категоричный сторонник числовых протоколов. Особенно при использовании микроконтроллеров невысокой производительности. Текстовые протоколы просто сожрут все ресурсы дешевых плат Ардуино.

Итак, я выбрал числовой протокол обмена данными.

Разработка протокола обмена данными локального контроллера.

В последующих уроках мы будем использовать стандартный протокол ModBus. Реализуем на нем и обмен данными системы описанной выше. Но в этом уроке я собираюсь применить нестандартный протокол. Я хочу продемонстрировать, что:

  • разрабатывать свои протоколы совсем несложно;
  • специализированные протоколы часто на много эффективнее стандартных;
  • протокол можно оптимизировать под свою конкретную задачу.

В общем виде любой протокол обмена выглядит так:

Команда: Адрес -> Код операции -> Данные -> Контрольный код ->

Ответ: <- Данные <- Контрольный код

Ведущее устройство, то, что инициирует обмен, посылает команду. В общем случае команда должна содержать информацию:

  • Адрес — адрес устройства, с которым происходит обмен. У нас интерфейс радиальный. Устройство может быть только одно, но при использовании шинных интерфейсов в сети может быть несколько контроллеров.
  • Код операции — информация о том, что надо сделать.
  • Данные — собственно информация обмена.
  • Контрольный код — код позволяющий обнаружить ошибки данных при передаче.

В ответ устройство посылает: запрошенную информацию и контрольный код.

Все эти составляющие определяют свойства и качества протокола. Выбирая их можно оптимизировать протокол под свои требования по следующим критериям:

  • Минимум данных передаваемых по каналу связи, а значит высокая скорость передачи данных.
  • Минимальные требования к ресурсам контроллеров, т.е. простота обработки данных.
  • Высокая надежность передачи данных, требуется повторная передача ошибочных данных.
  • Высокая достоверность данных, т.е. высокая вероятность обнаружения ошибок передачи. Это требование к контрольному коду.

Я собираюсь оптимизировать протокол по критериям: минимум данных обмена и минимум ресурсов микроконтроллера. Т.е. я собираюсь реализовать самый простой протокол обмена.

Какие данные нам надо передавать:

  • температура;
  • напряжение;
  • состояние кнопки.

Получать необходимо состояние светодиода.

Я выбрал такой формат команды.

Номер байтаФормат числаНазначение
byteКод операции + адрес контроллера (0x10)
1byteСостояние светодиода (младший бит)
2byteКонтрольный код ( байт 0 ^ байт 1 ^ 0xe5)

Код операции я решил совместить в одном байте с адресом. Старшие 4 бита — код операции, младшие — адрес. В принципе у нас всегда только одно устройство и одна команда. Можно вообще отказаться от этого байта. Но я оставил его, чтобы показать такой вариант протокола.

Контрольный код я рассчитываю очень простым способом — делаю операцию «исключающее или» с двумя байтами и кодом 0xe5. Последнее необходимо, чтобы определить часто встречающуюся ошибочную ситуацию, когда все байты равны нулю.

Несмотря на простоту реализации, для данных состоящих из двух байтов это надежный контрольный код.

Ответ в моем протоколе выглядит так.

Номер байтаФормат числаНазначение
0 … 3floatТемпература
4 … 7floatНапряжение
8byteСостояние кнопки (младший бит)
9byteРезерв
10, 11intКонтрольная сумма (сумма байтов 0 … 9 ^ 0xa1e3)

Данных здесь больше. Контрольный код представляет собой сумму 10 байтов с последующим «исключающим или». Реализуется расчет такого контрольного кода достаточно просто.

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

Разработка резидентной программы локального контроллера.

Принципиальный вопрос — я собираюсь реализовать обмен данными с центральным контроллером параллельным процессом.

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

Основная программа и модуль управления обменом по сети работают совершенно независимо друг от друга. У них есть только область общих данных. Программа может что-то измерять, регулировать и т.п. Те данные, к которым нужен доступ из сети программа хранит в области памяти, доступной модулю управления обменом по сети. Данные из сети основная программа берет из другой области памяти, области принятых из сети данных.

Читайте также:  Можно ли использовать метилурациловые свечи во время месячных

Будем строить программу по такому принципу.

Для начала я реализовал обработку всех датчиков. Я сделал это простым способом в цикле loop(). Заметьте, что программа при отработке паузы 0,9 секунд для ожидания измерения датчика DS18B20 не зависает. Но если применить для этого функцию delay() все будет работать.

Временно добавил блок вывода информации на компьютер для проверки.

// локальный контроллер

// радиальный интерфейс UART

#include <Msr2.h>

#include <OneWire.h>

#include <Button.h>

OneWire sensTmp (3); // датчик подключен к выводу 3

Button button1(2, 30); // кнопка подключена к выводу 2

float temperature; // температура

float voltage; // напряжение

byte bufSensTmp[9]; // буфер данных датчика температуры

int Count; // счетчик времени

void setup() {

Msr2::set(1, rInterrupt); // прерывания по таймеру 1 мс

Msr2::start(); // разрешаем прерывание по таймеру

Serial.begin(9600); // скорость 9600

}

void loop() {

//——————————- измерение температуры

if (Count < 50) {

Count= 50;

sensTmp.reset(); // сброс шины

sensTmp.write(0xCC, 1); // пропуск ROM

sensTmp.write(0x44, 1); // инициализация измерения

}

// задержка 0,9 сек

if(Count > 950) {

Count= 0;

sensTmp.reset(); // сброс шины

sensTmp.write(0xCC, 1); // пропуск ROM

sensTmp.write(0xBE, 1); // команда чтения памяти датчика

sensTmp.read_bytes(bufSensTmp, 9); // чтение памяти датчика, 9 байтов

if ( OneWire::crc8(bufSensTmp, 8) == bufSensTmp[8] ) { // проверка CRC

// данные правильные

temperature= (float)((int)bufSensTmp[0] | (((int)bufSensTmp[1]) << 8)) * 0.0625 + 0.03125;

}

else temperature= -200.; // ошибка измерения температуры

}

//——————————- измерение напряжения

voltage= (float)(analogRead(A0)) * 5. / 1024.;

//—————————— проверка измерений

Serial.(«T= «);

Serial.(temperature);

Serial.(» U= «);

Serial.(voltage);

if (button1.flagPress == true) Serial.ln(» PRESS»);

else Serial.ln(» FREE»);

}

//————————————— обработчик прерывания 1 мс

void rInterrupt() {

Count++;

button1.scane(); // вызов метода обработки состояния кнопки

}

Можно загрузить скетч по ссылке:

Зарегистрируйтесь и оплатите. Всего 40 руб. в месяц за доступ ко всем ресурсам сайта!

Проверил, все работает. Правильно измеряет температуру и напряжение, реагирует на нажатие кнопки.

Проверка работы локального контроллера

Дальше я удалил блок вывода данных на компьютер и сделал перегрузку измеренных данных в массив dataSerialBuf. Данные из этого массива будут передаваться на центральный контроллер. Это и есть общая область данных для основной программы и модуля управления обменом по сети.

//—————————— перегрузка результатов измерений в буфер

noInterrupts;

* (float *)dataSerialBuf = temperature;

* (float *)(dataSerialBuf+4) = voltage;

if (button1.flagPress == true) dataSerialBuf[8]= 1;

else dataSerialBuf[8]= 0;

dataSerialBuf[9]= 0;

interrupts;

}

Обратите внимание на то, что при перезагрузке я запрещаю прерывания. Прерывание может произойти в любой момент. Если основная программа загрузит в массив младший байт, например, температуры, а старший байт не успеет. То будут переданы неправильные данные: младший байт от нового значения температуры, старший — от старого.

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

Осталось сделать доступ к массиву dataSerialBuf из сети.

Естественно модуль управления обменом по сети расположен в обработчике прерывания по таймеру. Вот его скетч.

//——————— обмен данными

OutCount++;

n= Serial.available(); // число принятых байтов

if (n == 0) OutCount= 0; // данных нет

else if (n == 3) {

// принята команда, 3 байта

// чтение команды в буфер

byte buf[3];

buf[0]= Serial.read();

buf[1]= Serial.read();

buf[2]= Serial.read();

// проверка

if ( (buf[0] == 0x10) && ((buf[0] ^ buf[1] ^ 0xe5) == buf[2]) ) {

// правильно

if ( (buf[1] & 1) == 0) digitalWrite(5, LOW); // управление светодиодом

else digitalWrite(5, HIGH);

// ответ

uned int sum= 0; // контрольная сумма

for (int i=0; i<10; i++) {

Serial.write(dataSerialBuf[i]);

sum += dataSerialBuf[i];

}

// контрольная сумма ответа

sum ^= 0xa1e3;

Serial.write( * ((byte *)(& sum)));

Serial.write( * (((byte *)(& sum)) + 1));

}

else {

// неправильно, сброс порта

OutCount= 0;

while (true) { if (Serial.read() == 0xffff) break;}

}

}

else if (n > 3) {

// принято больше данных, неправильно, сброс порта

OutCount= 0;

while (true) { if (Serial.read() == 0xffff) break;}

}

else {

// не все байты приняты, проверка тайм-аута

if (OutCount > _OUT) {

// сброс порта

OutCount= 0;

while (true) { if (Serial.read() == 0xffff) break;}

}

}

Модуль управления обменом вызывается с периодом 1 мс.

  • Проверяется, есть ли данные в буфере последовательного порта.
  • Если данных нет, то сбрасывается счетчик тайм-аута приема данных.
  • Если данные есть, то ожидается прием 3 байтов команды. Одновременно отсчитывается время тайм-аута приема. Оно задано псевдо оператором:

#define _OUT 6 // время таймаута приема команды (мс)

  • Если прием байтов растянулся на время более 6 мс, то определяется ошибка приема команды. Все сбрасывается, буфер последовательного порта очищается.
  • Если приняты 3 байта команды, то проверяется контрольная сумма и формируется ответ.

Полностью скетч резидентной программы локального контроллера можете загрузить по ссылке:

Зарегистрируйтесь и оплатите. Всего 40 руб. в месяц за доступ ко всем ресурсам сайта!

Проверить работу локального контроллера можно только подключив его к компьютеру со специальной программой верхнего уровня. Не поверите, но у меня контроллер заработал сразу. Я не сделал ни одной ошибки. Наверное, благодаря тому, что очень простой протокол.

Программа верхнего уровня.

Локальный контроллер обменивается данными не с компьютером, а с программой на компьютере.

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

Программа мониторинга состояния локального контроллера

Загрузить программу можно по этой ссылке:

Зарегистрируйтесь и оплатите. Всего 40 руб. в месяц за доступ ко всем ресурсам сайта!

Необходимо разархивировать файл, выбрать COM порт. Все как в программах верхнего уровня из предыдущих уроков.

У меня все работает идеально. Ни одной ошибки обмена.

В следующем уроке будем управлять этим локальным контроллером не от компьютера, а от другой платы Ардуино.

Предыдущий урок Список уроков Следующий урок

Автор публикации

209

Комментарии: 1732Публикации: 177Регистрация: 13-12-2015

Источник