2 / 2 / 0
Регистрация: 19.08.2016
Сообщений: 43
|
||||||||||||||||
1 | ||||||||||||||||
Проблема с чтением из SoftwareSerial22.02.2021, 11:54. Просмотров 381. Ответов 4
Метки softwareserial.find (Все метки)
Добрый день, коллеги!
Занялся сборкой устройства для дистанционного управления обогревателем в гараже. Для реализации использую клон Arduino Nano на 168 микросхеме, связь обеспечивает модуль Neoway M590, далее нагрузкой управляет реле. Данные отправляю на сервер народного мониторинга, откуда отправляю и команду на включение или выключение нагревателя. С контролем температуры реализовать передачу данных на narodmon труда не составило, в интернете полно примеров реализации. А вот с тем, чтобы встретить команду от сервера возникла проблема. Для работы с модулем в него надо в определенной последовательности вбить последовательность строк для подготовки модуля для передачи данных по GPRS. Далее необходимо отправить данные для сервера, это тоже определенная последовательность, содержащая индивидуальный номер прибора, показания с датчиков и два символа завершения передачи ##. После чего с сервера мы получаем ОК, или команду управления вместо ОК. Когда я вручную ввожу данные используя такую конструкцию в скетче:
+TCPRECV:0,Х#ИМЯ_КОМАНДЫ", где X - длина имени команды Однако когда я записываю свои действия следующим образом:
Я пробовал укоротить проводник между модулем и ардуиной до 1см, не помогло. Пробовал вместо "+TCPRECV:0,7,#warm1" писать только первый элемент строки "+", в этом случае срабатывало, однако оно срабатывало даже если команду с народмона я не направлял. Пробовал уменьшать длину команды, пробовал изменять имя команды на числовое значение, не помогло. Я совершенно не понимаю как это работает. Когда я делаю gsm.find, то я ищу в конкретной строке в конкретный момент времени или вообще во всем, что зашло в порт с момента его инициализации? Если у кого есть идеи, почему ардуино может слепо игнорировать мои команды, прошу помочь, у меня идеи закончились.
0
|
|
22.02.2021, 11:54 | |
Проблема с чтением из com порта
Проблема с чтением файла Проблема с чтением из файла! |
|
22.02.2021, 12:01 | 2 |
Знаете что такое Software? Это программа. SoftwareSerial это программный uart.Чтобы прием стабильно работал нужно непрерывно выполнять
if (Serial.available()) и как только условие выполнено сразу же прочитать gsm.read() При этом по желательно отключить все прерывания и не выполнять никакой другой код.
0
|
2 / 2 / 0
Регистрация: 19.08.2016
Сообщений: 43
|
||||||||||||||||
22.02.2021, 12:30 [ТС] | 3 | |||||||||||||||
locm, спасибо. Сейчас попробую. Поставить find в условие if available
Добавлено через 25 минут Реализовал следующим образом:
GSM_AVAILABLE Далее команда присвоения TIME = 5 не выполняется. значение переменной TIME остается 30. То есть порт не занят, но при этом искомой строки в нём нет. Может кто подскажет, как узнать, какая именно строка приходит в порт в текущий момент времени? Я пробовал вставить сюда
0
|
2 / 2 / 0
Регистрация: 19.08.2016
Сообщений: 43
|
|||||||||||||||||||||||||||||||
23.02.2021, 00:01 [ТС] | 5 | ||||||||||||||||||||||||||||||
Понимаю, delay закоменчен. На всякий случай сейчас убрал и вывод Serial.println("sendOK");, чтобы ничего не мешало поймать команду. Но он её не видит все равно. Причем конструкция gsm.find применяется мной в других местах кода, вот например:
Эта часть выполняется корректно, также вот тут:
Мистика какая-то... Добавлено через 1 час 21 минуту Сейчас дополнительно решил зафиксировать как выглядит передача при ручном вводе команд. После выполнения всех процедур по подключению и авторизации в сети я отправляю модему следующие команды: AT+TCPSETUP=0,185.245.187.136,8283 после чего в мониторе порта вижу следующее OK +TCPSETUP:0,OK далее команда: at+tcpsend=0,60, в мониторе появляется символ готовности принять строку: OK +TCPSETUP:0,OK > далее ввожу строку из 60 символов для отправки на народмон, в мониторе вижу следующее: OK +TCPSEND:0,60 +TCPRECV:0,6,#ref1 +TCPCLOSE:0,Link Closed в ручном режиме все ок Добавлено через 3 часа 34 минуты Ох, ребята, это такая жесть, два дня потратил на очевидно простое решение... Сейчас все протестирую до конца, и отпишусь как удалось решить. Добавлено через 3 часа 6 минут Имело дело сразу несколько факторов, которые в целом сильно затрудняли поиск проблемы. Для начала я переписал функцию, для работы с командами програмvного uart напрямую:
После чего я увидел, что программа ожидает от меня команды, как-будто строка не была передана. В результате оказалось, что требовалось после строки передать символ перевода каретки, что я и сделал:
Оказалось, что для 168 микросхемы объем памяти для глобальных переменных увеличился настолько, что она стала работать нестабильно (об этом сообщает Arduino IDE, но я не обращал на это внимания). Решил найти способ уменьшить программу и для начала во всех строках с конструкциями
Код
Скетч использует 7248 байт (50%) памяти устройства. Всего доступно 14336 байт. Глобальные переменные используют 669 байт (65%) динамической памяти, оставляя 355 байт для локальных переменных. Максимум: 1024 байт. Добавлено через 1 час 56 минут Посоветуйте по примененной мною конструкции:
0
|
23.02.2021, 00:01 | |
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь. Проблема с чтением файла Проблема с чтением файла Проблема с чтением из файла Проблема С Чтением Аттача syslog проблема со чтением логов Проблема с чтением двоичных файлов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |