• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Вопрос Общение ЕСП и Ардуино по UART

AlxKh

New member
Смотрю разные скетчи для общения между двумя ардуино или между ардуино и есп - везде вижу побайтное общение.
А почему когда мы выдаем в монитор порта, мы пишем построчно?
например :
Serial.print("Prohod is: ");
Serial.print(Prohod);
работают разные библиотеки?
 
Последнее редактирование:

nikolz

Well-known member
Смотрю разные скетчи для общения между двумя ардуино или между ардуино и есп - везде виду побайтное общение.
А почему когда мы выдаем в монитор порта, мы пишем построчно?
например :
Serial.print("Prohod is: ");
Serial.print(Prohod);
работают разные библиотеки?
потому что для обмена информацией в драйверах UART используется кодировка ASCIIZ
Вы можете сами организовать бинарный обмен.
Например, я использую свой протокол для получения двоичных данных с АЦП ESP через COM порт(USB) на компе
 

AlxKh

New member
потому что для обмена информацией в драйверах UART используется кодировка ASCIIZ
Вы можете сами организовать бинарный обмен.
Например, я использую свой протокол для получения двоичных данных с АЦП ESP через COM порт(USB) на компе
Спасибо!
То, что используется ASCII это понятно. Больше интересовало можно ли передать одной командой не один байт, а строку. И даже если можно, то чтоб принять её, нужно будет принимать побайтно ?
 

nikolz

Well-known member
Спасибо!
То, что используется ASCII это понятно. Больше интересовало можно ли передать одной командой не один байт, а строку. И даже если можно, то чтоб принять её, нужно будет принимать побайтно ?
Вы и передаете одной командой строку
 

AlxKh

New member
Вы и передаете одной командой строку
Я понимаю что передаю одной командой строку, - правильно ли я делаю? ) ...и по второй части вопроса - принимать побайтно - тоже не уяснил еще!
 
Последнее редактирование:

nikolz

Well-known member
Я понимаю что передаю одной командой строку, - правильно ли я делаю? ) ...и по второй части вопроса - принимать побайтно - тоже не уяснил еще!
немного уточним
uart или com порт передает побайтно хотя на самом деле побитно, но синхронизация побайтно поэтому единица информации - 1 байт
но обмен по UART в ESP и дурине реализован в формате строки не ASCII а ASCIIZ т е конец строки это байт =0
в результате этого нельзя передать последовательность произвольных байт так как нулевое значение будет восприниматься как конец строки
 

AlxKh

New member
немного уточним
uart или com порт передает побайтно хотя на самом деле побитно, но синхронизация побайтно поэтому единица информации - 1 байт
но обмен по UART в ESP и дурине реализован в формате строки не ASCII а ASCIIZ т е конец строки это байт =0
в результате этого нельзя передать последовательность произвольных байт так как нулевое значение будет восприниматься как конец строки
То что в конце строки нуль, как раз хорошо как ограничитель строки! ...где-то бы грамотный код посмотреть для примера...
 

leon013

New member
Приветствую всех. Не знаю в какой теме спросить, поэтому задам вопрос здесь. Это самая близкая тема к моему вопросу.
С ESP дело не имел, поэтому простите за глупые вопросы.
Исходные данные. ESP будет использоваться как показометр (пока что). На нем поднят небольшой сервер с одной страницей, на которой и будут отображаться некие переменные. От браузера приходят xml запросы , в ответ ESP шлет ответ. Пока что запросы сделал через 1 сек.
Теперь задача - принять, пока все крутится в основном цикле, с десяток переменных по UART. Число байт нормировано , принимать будем байты в шестнадцатиричной системе. Когда данные будут передаваться ESP не знает.
Те как оно все будет выглядеть здесь просто не представляю, по прерыванию или проверке приемного буфера или еще как...
Сам пишу на СИ, для PICов. там все прозрачно, есть прерывание по приему ОДНОГО байт и наша задача его просто забрать их буфера приема, пока принимается другой байт.
Если не трудно ткните носом куда читать.
ESP у меня плата lua v3.
Какой UART использовать, конечно правильнее "железный", но на нем висит порт arduino ide ?
 

CodeNameHawk

Moderator
Команда форума
Проще открыть новую тему.
есть прерывание по приему ОДНОГО байт и наша задача его просто забрать их буфера приема, пока принимается другой байт.
В ардуино принимаются байт(ы) автоматом, в цикле проверяете получен ли байт Serial.available, в остальном как и на других процах.
Я применяю JSON для разборки данных по переменным.
Алгоритм такой, читаем байт из сериал, ищем начало посылки ( в JSON это символ { ), читаем, с ожиданием, посылку до закрывающего знака.
Если закрывающего знака не дождались в отведенное время или получили знак начала посылки, полученные данные отбрасываем и по новой.

Какой UART использовать, конечно правильнее "железный", но на нем висит порт arduino ide ?
Вы планируете все время держать подключенным arduino ide?
 

leon013

New member
Нет конечно, не буду держать полключение к ардуино. Я правильно понимаю что это единственный "железный" UART для этого молуля?
С веб программированием я ввобще не знаком, то что удалось написать пару веб страниц, так это по образу и подобию с готовых страниц.
Хотел что бы работал веб сокет на странице, но этоо доя меня сверх задача))) поэтому все преобразования переменных сделал на СИ перед отправкой на страницу с сервера.
Для меня, пока что, задача такая - принять ,хоть побайтно (хотя как я понимаю в есп буфер приема большой) или лучше все байты . Очистить буфер приема и собрать из байтов переменные.
Те отследить событие приема или одного байта или всех - это отдельная какая функция есть, потом побаитно щабрать все из буфера - как это сделать? И очистить его- как жто сделать?
 

CodeNameHawk

Moderator
Команда форума
Те отследить событие приема или одного байта или всех - это отдельная какая функция есть, потом побаитно щабрать все из буфера - как это сделать? И очистить его- как жто сделать?
Составляете на бумаге алгоритм, если идей ноль посмотрите на "кольцевой буфер", ну и книги по программированию.
 

leon013

New member
if (Serial.available()>10) {} Вопрос - это работать будет так - если принято больше 10 БАЙТ , то делать будем то , что в фигурных скобках. Я правильно понял ?
Serial.read(); - это функция читает один байт из буфера приема , если да то какой ?
Или for (i=0; i<9; i++){
inputBytes = Serial.read();
}

квадратные скобки c переменной i что то не ставятся после inputBytes
Это будет так, что из буфера приема считаем в массив 10 байт, начиная с первого?
 
Последнее редактирование:

leon013

New member
да вообще то все непонятно....
Функция Serial.available() вызывается прерыванием? как я понимаю, что нет и отрабатывает она только когда до нее "очередь дойдет". Все примеры упираются в прием одного байта
if (Serial.available()>0) и командой чтения забираем этот байт
incomingByte = Serial.read();
Вопрос нафига тогда буфер приема в 64 байта ??
И это полбеды - если функция не вызывается прерыванием, то пока до нее дойдет очередь в программе мы примем не один байт, и что с ними тогда в этом случае делать?
Serial.available() дает возможность отслеживать количество принимаемых байт, и у меня тогда один вопрос - если это так, то как мне из забрать в отдельный массив ВСЕ РАЗОМ из буфера приема. В цикле ? Это не строчная переменная, и будут передаваться не символы. Будут передаваться байты от двухбайтных чисел. Потом уже их легко собрать в нормадбные переменные int.
 

=AK=

New member
Функция Serial.available() вызывается прерыванием?
Где напишите, там и вызовется. Напишите ее в ISR - будет вызвана там. Напишите в основной петле - будет вызвана в основной петле. Напишите где-то в функции - там и вызовется.

Все примеры упираются в прием одного байта
if (Serial.available()>0) и командой чтения забираем этот байт
incomingByte = Serial.read();
Вопрос нафига тогда буфер приема в 64 байта ??
Промежутки между вызовами Serial.available() могут быть какие угодно, они зависят только от вас. Пока вы не выгребаете принятые данные из буфера при помощи Serial.read(), они накапливаются в буфере. Если вы напишите свою прогу так, что данные из буфера вы выгребать будете раз в час, то буфер приема в 64 байта может оказатьься недостаточным, если за это время придет больше 64 байт.

И это полбеды - если функция не вызывается прерыванием, то пока до нее дойдет очередь в программе мы примем не один байт, и что с ними тогда в этом случае делать?
Обрабатывать. Или выкидывать. Или еще чего. Холера вас знает, что вы собираетесь делать с принятыми данными, я не телепат. Может, вы каждый байт собираетесь рапечатывать на принтере, вешать на стенку и молиться на него. Мне это покажется странным, но ничуть не более странным, чем вопросы, которые вы задаете.
 
Последнее редактирование:

leon013

New member
Ну вобщем если кому то надо для решения примерной задачи вот код приема 16 баит по "железному" UART с записью в отдельный массив
unsigned char arr_uart[16];
int i;
HTTP.handleClient();// Это запущен сервер со страницей для отображения параметров
delay(1);
if (Serial.available() > 15){
for (i = 1; i < 17;i++){
arr_uart = Serial.read();
}
Это "эхо" для отладки
for (i = 1; i < 17;i++){
Serial.write(arr_uart);
}
Все красиво встало на свои места в массиве и вывелось отратно только именно так
 

leon013

New member
А кто у нас модератор?))
Ужас это когда движек сайта не поддерживает отображение квадратных скобок, и то что в них!
 

Сергей_Ф

Moderator
Команда форума
@leon013 при чем тут движок сайта и квадратные скобки? Движок имеет широкие возможности форматирования и оформления сообщений, в том числе и вставки кода. Даже без форматирования можно обойти тег и написать
Test[ i ] = 1;
или заменить i на j
Test[j] = 1;
Либо воспользоваться тегами
Код:
[code][ /code]
Код:
Test[i] = 1;
Читайте http://esp8266.ru/forum/help/bb-codes
 
Сверху Снизу