Работа с ком портом
- Войдите на сайт для отправки комментариев
Пт, 23/09/2016 - 18:08
Пишу скетч для связи с адсл модемом по uart, ардуино должен выполнить авторизацию на модеме войти в определенный пункт меню и вывести на экран информацию, вместо экрана использую монитор ком порта,
const int buttonPin = 2; // номер входа, подключенный к кнопке const int ledPin = 13; // номер выхода светодиода char* AT_command_string0 = "admin"; //логин и пароль char* AT_command_string1 = "9"; char* AT_command_string2 = "2";// команда // переменные int buttonState = 0; // переменная для хранения состояния кнопки void setup() { //Скорость порта Serial.begin (115200); // инициализируем пин, подключенный к светодиоду, как выход pinMode(ledPin, OUTPUT); // инициализируем пин, подключенный к кнопке, как вход pinMode(buttonPin, INPUT); } void loop(){ // считываем значения с входа кнопки buttonState = digitalRead(buttonPin); // проверяем нажата ли кнопка // если нажата, то buttonState будет HIGH: if (buttonState == HIGH) { digitalWrite(ledPin, HIGH); //зажигаем пин Serial.write(0x0A); // переход на новую строку (в некоторых модемах можно не выполнять) delay(2000); // ждем 2 сек. Serial.write(AT_command_string0);// отправляем логин Serial.write(0x0A); // переход на новую строку delay(1000); // ждем секунду Serial.write(AT_command_string0);// отправляем пароль Serial.write(0x0A); // переход на новую строку delay(1000); // ждем секунду Serial.write(AT_command_string1); // отправляем команду Serial.write(0x0A); delay(1000); Serial.flush(); Serial.write(AT_command_string2); // отправляем команду Serial.write(0x0A); delay(1000); // переход на новую строку char s; // переменная временного хранения данных if (Serial.available()) // если в буфере есть что-то { delay(100); //ждем 1 млс while (Serial.available() > 0) // выводим информацию, пока буфер не будет пустой { s=Serial.read(); // получение данных (посимвольно) Serial.println(s); // вывод полученных данных (посимвольно) } } } }
проблема в том что нужно запихать в ардуино и обработать примерно такой объем данных
Serial.availableForWrite() // возвращает размер свободного места в буфере сериала.
т.е. пихаешь в компорт по условию if (Serial.availableForWrite() == 128) {}, т.е. когда всё предыдущее отправлено и буфер свободен полностью.
Можно объяснить подробней чем это поможет? Правильно ли я представляю обмен данными модема и ардуино: Модем посылает в буфер обмена информацию о соединении но так как этой информации больше чем 128 байт то часть её просто теряется, так? Размер буфера последовательного порта для всех плат одинаковый? нельзя ли его как нибудь увеличить?
Ну так по приходу информации в буфер порта, ардуино начинает чтение и забирает данные из буфера куда-нибудь в массив, тем самым освобождая место в буфере.
Можно объяснить подробней чем это поможет? Правильно ли я представляю обмен данными модема и ардуино: Модем посылает в буфер обмена информацию о соединении но так как этой информации больше чем 128 байт то часть её просто теряется, так? Размер буфера последовательного порта для всех плат одинаковый? нельзя ли его как нибудь увеличить?
это поможет, если у тебя есть возможность настроить сериал модема.
но, очевидно, что увеличение буфера обмена тебя не спасёт - здесь явно не хватает сигнала сериала дуино сериалу модема
https://ru.wikipedia.org/wiki/%D0%9D%D1%83%D0%BB%D1%8C-%D0%BC%D0%BE%D0%B...
Можно обработать построчно. Не разбирался как это устроено в Serial, но алгоритм такой. Принимаем данные кусочно и складываем в свой буфер нужного размера. Если встретился символ перевода строки ('\r\n' или просто 'n'), то обрабатываем строку в своём буфере и перемещаем указатель буфера на начало - принимаем следующую строку и т.д.
Пока мы обрабатываем строку, ISR usart'а складывает данные в свой внутренний буфер (по идее должно быть так). Как только мы обработали строку в своём буфере, "обнуляем" его и запоняем принятыми данными.
Таким образом можно построчно распарсить вывод модема, сохранить данные во внутренних структурах и затем только их вывести.
Доброе время суток. Пытаюсь сделать аналогичную приблуду. Пошерстив гугл и данный форум начал с самого простого. Написал скетч который при подключении модема к линии зажигает светодиод на 13 пине и при отключении линии соответсвтенно гасит
Все работает нормально.
Дальше добавил в скетч кнопку при нажатии которой происходит авторизация и отправка команды на запрос данных. Если в полученных данных есть интересующие меня строки то на соответствующих пинах должны загореться светодиоды
И вот здесь уже засада - ничего не работает. Светодиоды не загораются, вывод в Serial либо пустой, либо какие-то вырванные куски строк.
Написал третий код, в котором весь ответ модема собираю в одну строку и топором под названием substring отсекаю все лишнее и оставляю нужные мне куски информации, которую дальше думаю уже можно будет причесать и вывести на экран.
Но хотелось бы разобраться почему работает третий код (в bufer получается собрать и вывести полный ответ от модема) и не работает построчный вывод во втором коде?
Из этого всего нужно выбрать и вывести на экран 5 параметров, но буфер последовательного порта ограничен 128 байтами, можно ли как нибудь впихнуть такой объем данных в ардуино для обработки?
Приветствую! Получилось сделать адсл-тестер на ардуино? Скетчем поделитесь?
У меня модем Интеркросс 5633Е, там такая же последовательность (admin/admin/9/2). Но у меня не получается авторизоваться через ардуино, точнее в монитор порта после нажатия кнопки летят непонятные символы.