@@ArduNotes я в последнее время предпочитаю альтернативную форму записи - and гораздо тяжелее перепутать с bitand, чем & vs &&. Или можно для бинарного использовать старую форму, а для логического новую.
@@ArduNotes Zinkin Mitya Интересно в условии стоит millis .т.е. таймают по условию должен быть миллисекундах, а вывод Serial.print показывает в микросекунда. Как? Как я понимаю минимальная задержка будет 10 миллисекунд.
Класс, игрался со связью по serial между 8266 и ардуино пару лет назад. Спаял делитель так как платы на разное напряжение и... Забросил) самое время достать снова всю эту шляпу и поиграться снова. Спасибо за все тонкости и за асинхронность. Жму волосатую руку.
Ооо, то что надо, спасибо большое! У меня контроллер моноколеса периодически шлет массив с циферками, с ними мне как раз нужно будет работать в ардуине.
Алекс, сделай разбор кода какого-нибудь своего проекта. Видео с светомузыкой на гиперкубе было топовым, очень классно и понятно ты все объяснил. Я потом, используя тот алгоритм, переписал старую твою светомузыку и выглядит это прекрасно. Я это к тому, чтоб ты рассказал про какой-то код на каком-то более конкретном примере
Вооооооооот я уже начинаю разбираться в кодах! А это сулит новые свершения. БлагоДарю тебе Гувер за твои старания, ты и сам от этого получаешь неистовое удовольствие!)
Я в свое время написал для VBA приложений JSON парсер для хранения данных и обмена между приложениями в текстовом формате, получилось достаточно просто и эффективно, но для для ресурсов микроконтроллера лучшее решение применение команд: ключ, значеие.
Алекс, за уроки респект, многим будет полезно) Хочу предложить ещё один вариант, более простой с точки зрения наглядности и простоты реализации, при этом такой же по вычислительной сложности Я у себя на стмках использую структуры, которые побайтово передаю. Можно даже битовые поля юзать для состояний светодиодов и прочих булевых штук При этом можно как делать одну структуру для разных команд - первое поле означает саму команду, второе поле означает значение команды, можно так же несколько полей делать спокойно (ну или хотя бы писать, сколько их, в первом байте) И для команд, имхо, гораздо удобнее запихать всё в enum, тогда читаемость кода возрастает, проще писать и отлаживать, а для проца enum это тот же инт, просто "с названиями" Либо второй вариант со структурами - передавать структуру состояния, в которой задавать все параметры сразу, просто подряд Единственная проблема, которая может возникнуть, это разных способ хранения структур (маловероятно), битовых полей (очень вероятно), если такие используются. У разных платформ (ПК - Ардуина) может быть разный порядок следования битов в битовых полях, тогда будет проблема Но для связи ардуинка-ардуинка, есп-есп или стм-стм, вариант прямо супер рабочий и ультра удобный, советую присмотреться)) Пы.Сы.: да, коммент на двух видосах, потому что здесь он ещё актуальнее))
Присоединяюсь! Например такая задача: массив данных (фрейм буфер) отправлять на процессинг и там отрисовывать, чтоб в маленький экран не вглядываться. Тут нужно будет как то синхронизироваться. Вроде бы получилось, но что делать если буфер содержит те же данные что для синхронизации используются?
Спасибо, очень интересный урок получился. Может быть добавить еще пример, как две ардуинки могут управлять друг-другом, чтобы обмен информацией шел между ними в разном направлении, можно наверное интересный проект сделать.
Чтобы упростить процесс приема пакета - все эти таймауты - можно же использовать структуру TLV ru.m.wikipedia.org/wiki/Tag-length-value Часть пакета tag/type и length имеет фиксированную длину, а длина пэйлоада будет известна из поля length, в итоге мы точно знаем когда надо начинать парсить, а таймаут оставить для определения битости пакетов
Когда то давно изучал c, сейчас пишу только на python, и вдруг натыкаюсь на этот видос, аж мурашки по коже побежали как вспомнил обязательное присвоение типа переменной и указатели, ууфф.
Для пользователя вариант "название пробел аргумент пробел аргумент..." куда приятнее (просто разделители иные). Можно функции мутить int argc, char* argv[] и ещё char answer[] для записи в эту строку ответа. Удобно. Предпочитаю именно этот метод, т.к. лень ещё прогу делать с крутилками и жмакалками Но вот между устройствами только структуры, только хардкор.
Просьба пояснить момент 15:09 в видео. Получается, что теперь мы парсим, только если в буфере что - либо изменилось? А до этого парсили только если serial.avaliable?
Еще хотелось бы видео по сетевым каким то протоколам тот же изернет+интернет и работе с радиопередачей данных вифи/лора/блютуз и другие - т.е. что то в этом направлении.
инторнетный протокол слишком сложный для 8 битного контроллера и жрет много ресурсов есть готовые библиотеки для этого и там тот же принцип как и тут, парсить все равно придется а как передавать данные - зависит от конкретной библиотеки
void loop() { // асинхронное чтение через AsyncStream if (Serial.available()) { char str[30]; int amount = Serial.readBytesUntil(';', str, 30); str[amount] = NULL; int data[10]; //буфер интов int count = 0;//счетчик интов char* offset = str;//указатель для работы while (true) { data[count++] = atoi(offset);//пишем число в буфер offset = strchr(offset,','); //поиск след запятой if (offset) offset++; //если это не null -продолжаем else break; //иначе покидаем цикл } for (int i = 0; i < count; i++) Serial.println(data[i]); } }
esp 8266 - интересный модуль, в теории у него много возможностей но самая известная и пожалуй классическая- естественно деуатентификатор. Поэтому хотелось бы узнать что то ещё чтобы разнообразить работу с данным модулем
@@MrDent-tp4ke деуатентификатор? Это что же такое "естественное", "классическое" и "самое известное", что о нём даже Гугл не слыхивал? Поясните это на понятном языке, пожалуйста.
ВАЖНО! (тем кто как я не понимает ничего в Ардуино и коде подсказка). В строчке if (Serial.available() > 1){ заменить 1 на 0 что бы было if (Serial.available() > 0){ Тогда всё будет работать нормально.
А ещё такой затык. Не хотел работать один из цифровых пинов нормально. Работал только после значения за 200. Но когда поменял пин, всё заработало как надо. Так что имейте ввиду. Может кому то будет полезно.
Спасибо большое за уроки. А нет таких же библиотек для udp? Или может будет урок именно по upd esp32. Нашел пару уроков, но там передают одно состояние кнопки и все. Так какой же это парсинг.
8:47 тут проблема - если массив заполнится полностью на 30 символов, то мы зайдем за его границы. в readBytesUntil надо оставить 30, а в переменной надо сделать char data[30 + 1];
Здравствуйте. Если мне нужно отправить на телефон показатели датчиков, например температуру воздуха, через Bluetooth, какой конструктор лучше использовать для создания приложения в телефоне?
расскажи о средствах обеспечения помехозащищенности) алгоритмы что делать если пакет не пришел до конца, пакет пришел битый (с искажениями) и т.д. о CRC, протоколах подтверждения от устройства об успешном получении пакета и т.д.
Очень полезный урок. Подскажите что лучше использовать чтобы парсить ответы от SIM800. Уперся в то, что.... чем больше добавляют условий и обработку запросов, то строка (at) приходящая от SIM800 уменьшается... while (SIM800.available() > 0) { at += char(SIM800.read()); } if (at.indexOf("ATD" + phon + ";") > -1) { ******* } else if (at.indexOf("+CLIP:") > -1 { ******* }
опробовал вариант Вариант 3 (однобуквенный, без задержки) прекрасно но только с положительными числами при подачи минусового числа выход 0 можно это както исправить уже мозги кипят
очень простые уроки, возьмем строку, это делается так {прошло 3 секунды видео} вот так легко и просто мы получили межгалактический зведолет с возможностью генерации субатомных частиц
Привет. Я хочу сделать голосовую интеллект для телевизора, чтоб использовать место пульта. Как собрать плату для данного задач. Сделайте пожалуйста видеоролик по этой направления. Спасибо заранее
@@ArduNotes почему, я лично реалезовал пару проектов на нем? Согласен что на АВР это не очень эфективно, но тем не менее возможность разделить на потоки различные не ресурсоемкие процедуры на потоки иногда очень удобно
@@Shef-Il согласен, но все-таки обычные ардуинки лучше не использовать для таких проектов. FREERTOS может быть полезен на esp, тем более на 32 он уже "предустановлен".
@@MAD_ALEX не в обиду, но если вы спрашиваете "зачем" и вспоминаете про "милис" вы явно очень начинающий, ведь это тоже самое что спросить"зачем вы летите в Египет, ведь солнце светит и на Урале"
Добрый день. А если у нас есть микроконтроллер, который получает кучу данных с разных датчиков и выполняет какую-то программу, при чем в его прошивку нельзя лезть, она обновляется автоматически, а нам нужно эти данные считать другим микроконтроллером и уже корректировать для отображения? Я бы просто накидал параллельно к этим датчиком выводы, но может есть более правильный метод?
В примере чтения строки с записью нуля в конце - ошибка же :) переполнение стека при получении 30 символов! (ua-cam.com/video/Ul03Vkg9A40/v-deo.html) Нужно или буфер выделять с запасом на 0 в конце, или в метод чтения передавать макс длину на 1 меньше.
Как удостовериться что пакет принят полностью, и закончен по символу терминатора, а не таймауту? у меня когда пакеты идут часто они иногда смешиваются и всё плохо становится
15:13 ошибка, вместо логического "И" там бинарный, странно, что не вылезло при тестировании.
спасибо! Исправлю в примерах
@@ArduNotes я в последнее время предпочитаю альтернативную форму записи - and гораздо тяжелее перепутать с bitand, чем & vs &&. Или можно для бинарного использовать старую форму, а для логического новую.
@@ArduNotes Zinkin Mitya
Интересно в условии стоит millis .т.е. таймают по условию должен быть миллисекундах, а вывод Serial.print показывает в микросекунда. Как? Как я понимаю минимальная задержка будет 10 миллисекунд.
@@MiaminZD Вывод показывает сколько микросекунд исполнялся код на 39-40 строке, а вызываться он будет не чаще, чем раз в 10 миллисекунд
Спасибо огромное! Без этого не работало. Этот комментарий должен быть вверху.
Второе название канала - "ценнейшая находка для ардуинщика".
О, как раз актуально! :)
Ты мои мысли прям читаешь) Перелопатил по этой теме уже все что можно
Высший пилотаж, объяснить сложное просто. Спасибо!😊
Я вот в этом ничего не понимаю, но очень внимательно посмотрел. Думаю нужно несколько раз пересмотреть
Омск опять смотрит! Лайк за видео!
Приветствую Александр.
Ой как просится парсинг на гайвер-контрол тепличный, аж в немоготу ))) Спасибо за добротные уроки ардуинщика!
Класс, игрался со связью по serial между 8266 и ардуино пару лет назад. Спаял делитель так как платы на разное напряжение и... Забросил) самое время достать снова всю эту шляпу и поиграться снова. Спасибо за все тонкости и за асинхронность. Жму волосатую руку.
Ооо, то что надо, спасибо большое! У меня контроллер моноколеса периодически шлет массив с циферками, с ними мне как раз нужно будет работать в ардуине.
Алекс, сделай разбор кода какого-нибудь своего проекта. Видео с светомузыкой на гиперкубе было топовым, очень классно и понятно ты все объяснил. Я потом, используя тот алгоритм, переписал старую твою светомузыку и выглядит это прекрасно. Я это к тому, чтоб ты рассказал про какой-то код на каком-то более конкретном примере
Вооооооооот я уже начинаю разбираться в кодах! А это сулит новые свершения. БлагоДарю тебе Гувер за твои старания, ты и сам от этого получаешь неистовое удовольствие!)
Решено много вопросов в голове. Однозначно лайк за таких видос.
Я в свое время написал для VBA приложений JSON парсер для хранения данных и обмена между приложениями в текстовом формате, получилось достаточно просто и эффективно, но для для ресурсов микроконтроллера лучшее решение применение команд: ключ, значеие.
Спасибо! Именно то, чего не хватало))
Лучший канал по абдуринке!
Абдуринка - это выступления ВВП по ТВ :)
Англоязычный ютюб смотри, там это давно уже все есть. И проекты покруче
@@krutoyinfo ссылку на аналогичный урок пожалуйста
@@krutoyinfo Дайте ссылку плз.
Алекс, за уроки респект, многим будет полезно)
Хочу предложить ещё один вариант, более простой с точки зрения наглядности и простоты реализации, при этом такой же по вычислительной сложности
Я у себя на стмках использую структуры, которые побайтово передаю. Можно даже битовые поля юзать для состояний светодиодов и прочих булевых штук
При этом можно как делать одну структуру для разных команд - первое поле означает саму команду, второе поле означает значение команды, можно так же несколько полей делать спокойно (ну или хотя бы писать, сколько их, в первом байте)
И для команд, имхо, гораздо удобнее запихать всё в enum, тогда читаемость кода возрастает, проще писать и отлаживать, а для проца enum это тот же инт, просто "с названиями"
Либо второй вариант со структурами - передавать структуру состояния, в которой задавать все параметры сразу, просто подряд
Единственная проблема, которая может возникнуть, это разных способ хранения структур (маловероятно), битовых полей (очень вероятно), если такие используются. У разных платформ (ПК - Ардуина) может быть разный порядок следования битов в битовых полях, тогда будет проблема
Но для связи ардуинка-ардуинка, есп-есп или стм-стм, вариант прямо супер рабочий и ультра удобный, советую присмотреться))
Пы.Сы.: да, коммент на двух видосах, потому что здесь он ещё актуальнее))
передача байтовым потоком - тема для отдельного урока
Очень интересно!Хоть и не понятно много чего
Давно хотел научиться передавать команды на ардуино или esp по блютуз и вай фай. Спасибо. Жду следущий урок
Блин, быстрее бы следующее видео, у меня как раз сейчас стоит вопрос передачи данных в приложение на компьютере.
Мне тоже нужно
Присоединяюсь! Например такая задача: массив данных (фрейм буфер) отправлять на процессинг и там отрисовывать, чтоб в маленький экран не вглядываться. Тут нужно будет как то синхронизироваться. Вроде бы получилось, но что делать если буфер содержит те же данные что для синхронизации используются?
У тебя ж com порт есть. Открывай его с компа и читай
Спасибо, очень интересный урок получился. Может быть добавить еще пример, как две ардуинки могут управлять друг-другом, чтобы обмен информацией шел между ними в разном направлении, можно наверное интересный проект сделать.
очень бы хотелось увидеть уроки про переход от ардуин к голым мк. минимальную обвязку чипа, подключение к компу и т.д.
огромный гайд выйдет через пару недель
@@ArduNotes когда
Спасибо большое за ценный урок! Очень важная информация!
Алекс, спасибо за урок, буду благодарен если разберешь общение ардуино с сервером
Ой, на 8:50 - потенциальная запись за пределы массива.
(если придёт пакет в 30 байт, то мы запишем NULL в 31й элемент массива)
Высший класс! только начал изучать с++
Я 4 года ждал это видео
Урок ценный но уже тяжел для понимания начинающим.
Благодарю, доступно, подробно, а главное интересно.
*Л. а. й. к.*
Сколько небольших производств заработало благодаря Гайверу, самому в этом всём разобраться очень сложно)
Лайк за Терминатора )
Чтобы упростить процесс приема пакета - все эти таймауты - можно же использовать структуру TLV
ru.m.wikipedia.org/wiki/Tag-length-value
Часть пакета tag/type и length имеет фиксированную длину, а длина пэйлоада будет известна из поля length, в итоге мы точно знаем когда надо начинать парсить, а таймаут оставить для определения битости пакетов
Как то, года 3 назад. Просил такой видос, дождался)))
Такая же херня
кренеть, вот теперь начнётся жара...
Когда то давно изучал c, сейчас пишу только на python, и вдруг натыкаюсь на этот видос, аж мурашки по коже побежали как вспомнил обязательное присвоение типа переменной и указатели, ууфф.
Зато скорость роботы кода выше в разы
когда нибудь программисты совсем деградируют)
в десятки и сотни
Круто и простопонятно, ещё ещё требуют наши мозги
Спасибо! То, что надо!
Крутяк!
Ой спасибо, братик, какраз к дипломной работе подоспел!!!!
В 0:12 после рабочего дня это было так жоска, будто я снова на первой субботней паре по квантам)))
Но все равно спасибо, тема важная.
Ничего не понял, но очень познавательно.
Для пользователя вариант "название пробел аргумент пробел аргумент..." куда приятнее (просто разделители иные). Можно функции мутить int argc, char* argv[] и ещё char answer[] для записи в эту строку ответа. Удобно. Предпочитаю именно этот метод, т.к. лень ещё прогу делать с крутилками и жмакалками
Но вот между устройствами только структуры, только хардкор.
между устройствами да, структуры) в другом уроке будем разбирать
@@ArduNotes , в догонку к методу:
Можно несколько вариантов для ключа использовать
case 'r':
Print("big r")
case 'R':
Код на r
Break
Вот конечно еще бы вы медленнее все рассказывали. Но всё равно вы очень крутой спасибо вам огромное.
kruto raskazal, vsio ponetna
Вот бы ещё по uart мульти-точке урок. Чтобы решение коллизий попинать
Спасибо за видео и советы Поучительный материал
аааа круто, скорей бы новый урок
Спасибо, Alex🤝
Спасибо, Алекс!
Пасибо за уроки, чуваки
очень полезный видос! Спасибо!
Расскажи как паркинг можно сделать на прерываниях на примере разбора данных от GPS. Это было бы здорово.
Изумительно! Спасибо большое! :)
Добрый день, подскажите будет обзор на параллельную работу ардуино, (по двум проводам соединяются от 2 и более), аналогия с ARINC 629.
Просьба пояснить момент 15:09 в видео. Получается, что теперь мы парсим, только если в буфере что - либо изменилось? А до этого парсили только если serial.avaliable?
Неопределённое поведение в уроке. Найс! (Сарказм.)
Мощщщно! =)
Еще хотелось бы видео по сетевым каким то протоколам тот же изернет+интернет и работе с радиопередачей данных вифи/лора/блютуз и другие - т.е. что то в этом направлении.
Это требует много времени и стоит денег
инторнетный протокол слишком сложный для 8 битного контроллера и жрет много ресурсов
есть готовые библиотеки для этого и там тот же принцип как и тут, парсить все равно придется
а как передавать данные - зависит от конкретной библиотеки
void loop() {
// асинхронное чтение через AsyncStream
if (Serial.available()) {
char str[30];
int amount = Serial.readBytesUntil(';', str, 30);
str[amount] = NULL;
int data[10]; //буфер интов
int count = 0;//счетчик интов
char* offset = str;//указатель для работы
while (true) {
data[count++] = atoi(offset);//пишем число в буфер
offset = strchr(offset,','); //поиск след запятой
if (offset) offset++; //если это не null -продолжаем
else break; //иначе покидаем цикл
}
for (int i = 0; i < count; i++) Serial.println(data[i]);
}
}
а уроки с esp и сетью будут?)
да
esp 8266 - интересный модуль, в теории у него много возможностей но самая известная и пожалуй классическая- естественно деуатентификатор. Поэтому хотелось бы узнать что то ещё чтобы разнообразить работу с данным модулем
А ESP 32 будут?
@@MrDent-tp4ke деуатентификатор? Это что же такое "естественное", "классическое" и "самое известное", что о нём даже Гугл не слыхивал?
Поясните это на понятном языке, пожалуйста.
Шикарный канал, почему рекламмы нет
у нас только JLCPCB на рекламе, остальное не подходит по тематике =)
ВАЖНО! (тем кто как я не понимает ничего в Ардуино и коде подсказка).
В строчке if (Serial.available() > 1){
заменить 1 на 0 что бы было if (Serial.available() > 0){
Тогда всё будет работать нормально.
А ещё такой затык. Не хотел работать один из цифровых пинов нормально. Работал только после значения за 200. Но когда поменял пин, всё заработало как надо. Так что имейте ввиду. Может кому то будет полезно.
Супер тема !!!
Спасибо большое за уроки. А нет таких же библиотек для udp? Или может будет урок именно по upd esp32. Нашел пару уроков, но там передают одно состояние кнопки и все. Так какой же это парсинг.
Респект!
Хорошее видео. Лайк.
8:47 тут проблема - если массив заполнится полностью на 30 символов, то мы зайдем за его границы. в readBytesUntil надо оставить 30, а в переменной надо сделать char data[30 + 1];
Json мне нравится)
а ёлочка?
нет блин xml
Годнота!
Здравствуйте Алексей можно пожалуйста отдельный урок по esp8266, заранее спасибо)))
Его зовут Александр))
Здравствуйте. Если мне нужно отправить на телефон показатели датчиков, например температуру воздуха, через Bluetooth, какой конструктор лучше использовать для создания приложения в телефоне?
расскажи о средствах обеспечения помехозащищенности) алгоритмы что делать если пакет не пришел до конца, пакет пришел битый (с искажениями) и т.д. о CRC, протоколах подтверждения от устройства об успешном получении пакета и т.д.
Класс!
Очень полезный урок.
Подскажите что лучше использовать чтобы парсить ответы от SIM800.
Уперся в то, что.... чем больше добавляют условий и обработку запросов, то строка (at) приходящая от SIM800 уменьшается...
while (SIM800.available() > 0) {
at += char(SIM800.read());
}
if (at.indexOf("ATD" + phon + ";") > -1)
{
*******
} else if (at.indexOf("+CLIP:") > -1
{
*******
}
Александр, тема древняя, но все же хотя б мельком покажи как связать espшку и голосовое управление. отвечаю, люди высоко оценят 👍
опробовал вариант Вариант 3 (однобуквенный, без задержки) прекрасно но только с положительными числами при подачи минусового числа выход 0 можно это както исправить уже мозги кипят
А нельзя ли json читать и отправлять ардуиной?🤔
очень простые уроки, возьмем строку, это делается так {прошло 3 секунды видео} вот так легко и просто мы получили межгалактический зведолет с возможностью генерации субатомных частиц
Актуально, спасибо.
А есть подробный урок про организацию ethernet связи?
нету
жесть
@@ArduNotes а будет?
Привет.
Я хочу сделать голосовую интеллект для телевизора, чтоб использовать место пульта.
Как собрать плату для данного задач. Сделайте пожалуйста видеоролик по этой направления.
Спасибо заранее
Интересно, почему про sscanf никто не говорит? Очень удобная стандартная функция.
SPI это тоже протокол передачи данных?
Теоретически можем использовать, что б метеостанция скидивала график смени всех датчиков?
Подкину идею, счётчик ёмкости аккумов с логгированием на ПК, графики, ограничение по току, напряжению 🙂
Тоже ждешь финальную серию руки терминатора?
А я использую json формат, передаю данные через lora, вроде тоже неплохо работает.
добрый вечер! Парсим N чисел выводит вместо терминатора 0 например 1,2; выводит 1 2 0 если нет знака ; терминатора то 1 2 Как убрать 0 ?
Ждём урока по FreeRTOS!!!!!!!
не имеет смысла на AVR
@@ArduNotes почему, я лично реалезовал пару проектов на нем? Согласен что на АВР это не очень эфективно, но тем не менее возможность разделить на потоки различные не ресурсоемкие процедуры на потоки иногда очень удобно
@@Shef-Il согласен, но все-таки обычные ардуинки лучше не использовать для таких проектов. FREERTOS может быть полезен на esp, тем более на 32 он уже "предустановлен".
@@Shef-Il зачем, если есть миллис и на крайний случай прерывания таймера
@@MAD_ALEX не в обиду, но если вы спрашиваете "зачем" и вспоминаете про "милис" вы явно очень начинающий, ведь это тоже самое что спросить"зачем вы летите в Египет, ведь солнце светит и на Урале"
Привет.
Я хочу сделать голосовую интеллект для телевизора, чтоб использовать место пульта.
Как собрать плату для данного задач. Спасибо заранее
В библиотеке Gyveroled в файле ExtFont для esp8266 надо include заменить на просто иначе не компилируется
странно, у людей компилилось. Мб у тебя яверсия ядра старая?
Да, у всех esp свои файлы работы с памятью и т.д. Это нужно учитывать и подключать нужные библиотеки с помощью макросов.
Отличное видео, давай тольно на СИ...
А оно на чем, на бейсике или питоне?..
Респект
А готовые протоколы типа протобуф или жсон есть?
case 2 после обрыва передачи продолжает выдавать шим по последним данным,как обнулить если данные не приходят?
Подскажите как применить харт протокол к ардуино
Добрый день. А если у нас есть микроконтроллер, который получает кучу данных с разных датчиков и выполняет какую-то программу, при чем в его прошивку нельзя лезть, она обновляется автоматически, а нам нужно эти данные считать другим микроконтроллером и уже корректировать для отображения? Я бы просто накидал параллельно к этим датчиком выводы, но может есть более правильный метод?
В примере чтения строки с записью нуля в конце - ошибка же :) переполнение стека при получении 30 символов! (ua-cam.com/video/Ul03Vkg9A40/v-deo.html) Нужно или буфер выделять с запасом на 0 в конце, или в метод чтения передавать макс длину на 1 меньше.
Как удостовериться что пакет принят полностью, и закончен по символу терминатора, а не таймауту? у меня когда пакеты идут часто они иногда смешиваются и всё плохо становится
Сделай web для теплицы!