29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
|
|||||||||||||||||||||
1 | |||||||||||||||||||||
SIM900. Работа с Usart08.05.2013, 19:13. Показов 24924. Ответов 62
Метки нет (Все метки)
День добрый всем. В рамках моего проекта, увы очень долгого, дошла очередь до общения ATMega16A с SIM900 по UART. Долго я не мог наладить работу на прерываниях, узнав через неделю усилй и плясок с бубном что оказывается файл iom16a.h содержит кучу ошибок, и обновив АВР Студию прерывания заработали, но это так, просто поделиться
Так вот, для UART я использую кольцевой буфер с по статье этого сайта. Суть в том, что чтобы не терять данные и не заставлять МК простаивать в ожидании очистки UDR, они по приходу/отправке складываются в буфер нужного размера, остается их от туда забрать/положить когда нужно. Так вот, при отправке(сейчас стоит рассмотреть только ее, хотя и с получением не все гладко), используется данная функция: Кликните здесь для просмотра всего текста
Если положить символ в буфер, то вызовется прерывание по завершению отдачи, которое стимулирует дальнейшую отправку из буфера: Кликните здесь для просмотра всего текста
Все ОК, эта конструкция работает в протеусе, НО, если мы хотим отправит строку: Кликните здесь для просмотра всего текста
То просто ничего не происходит, тут я если честно не силен с ссылками, просто не понимаю что не так. Ок, берем топопр : Кликните здесь для просмотра всего текста
И тут самое смешное: если отправить 1 символ - присылает русские буквы и символы что есть(все), если 2 символа - английские, если больше, то вообще крякозябры Единственное место где я могу проверить на железе - модуль, но вот он пока не отвечает на мои запросы , только при включении шлет 4 символа с кодом 255, и при выключении NORMAL POWER DOWN, или как то так, у меня дисплей 8 символов, не влезает все Поделитесь мыслями?
0
|
08.05.2013, 19:13 | |
Ответы с готовыми решениями:
62
Sim900 vs SIM900 GSM/GPRS MINIMUM SYSTEM MODULE Работа с смс сообщениями с помощью SIM900 Работа USART в дуплексе Работа с USART PIC16F877A Работа с USART ATMega128 (ASM) |
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
|
|
10.05.2013, 16:35 [ТС] | 21 |
Ну, я подумал что тут опечатка, хотя уже понял что все ОК.
Ну, я помимо этого USB-232 переходника купил com удлинитель, единственный магазин 9 мая Юлмарт, а там чисто com штекер не продается, но зато был удлинитель, его я и разрезал пополам Я уверен что все из-за земли общей. Почему то мой переменный ИБП начал давать искру на викле при включении в сетевой фильтр.
0
|
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
|
|
10.05.2013, 17:04 | 22 |
не выдумывайте. В УАРТе есть старт-стоп биты, определяющие начало и окончания байта. между стопом и стартом может не быть никаких задержек.
0
|
179 / 164 / 30
Регистрация: 14.02.2013
Сообщений: 1,464
|
|
10.05.2013, 17:48 | 23 |
0
|
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
|
||||||
10.05.2013, 23:36 [ТС] | 24 | |||||
Ура! Свершилось, а дело то было в том как я команду завершал, не тем символом.
Пока правда только посимвольно На команду "AT\r" прислал ОК)))) У вас съедалась часть данных? Добавлено через 4 часа 37 минут И все же если вернуться к теме. Так как используется указатель, то он должен куда то указывать. ОК, теперь я делаю так:
Добавлено через 34 минуты raxp, кстати, вот что написал один человек на сайте:
0
|
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
|
|
11.05.2013, 14:49 [ТС] | 26 |
0
|
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
|
|
11.05.2013, 14:58 [ТС] | 27 |
Посмотрел я datasheet на эту CH340DS1(PCI based dual UART and printer port chip), что то мне подсказывает что вообще не стоило землю подключать..
0
|
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
|
|
11.05.2013, 15:15 [ТС] | 29 |
- обычный удлинитель, просто провод, наверное пассивный
- длина 1,8 метра -
0
|
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
|
|
11.05.2013, 16:22 [ТС] | 31 |
Ну, первый переходник(не удлинитель, с ним все ОК) видимо сгорел из-за того что я неправильно расставил номера проводов, зеркально перепутал, не догадался на самом штекере глянуть. После подключения вместе с устройством перестал определяться минут через 5, но я активно ковырял, тыкал туда сюда, не мог понять почему ничего не приходит от МК, так что сам виноват.
Второй же я подключил правильно, начал считывать, и когда перепрошил МК для отправки строки, то при включении устройства com порт пропал из диспетчера устройств и больше там не появлялся В итоге - 2 новых дохлых usb-rs232, супер Но без этой штуки я точно не могу знать что отправляю от МК, если принять я могу на ЛСД дисплей, то отправить только на ГСМ модуль, стойте, а можно мне на МК соединить Rx и Tx, смогу я сам себе посылать данные? Добавлено через 4 минуты У меня нет ардуины, не очень понимаю зачем эта штука. Обычная мега16а, естественно пускал через max232.
0
|
11.05.2013, 16:55 | 32 |
...тьфу, перепутал с другой темой. Конечно, же. Но и в этом случае, в GSM-модуле UART с уровнями TTL, их нельзя напрямую тыкать в данный кабель RS-232/USB.
0
|
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
|
||||||
11.05.2013, 17:17 [ТС] | 33 | |||||
Но ведь если бы я неправильно подключил max232, то не получил бы результатов на компьютере, просто лень было рисовать.
На тему посыла строки: Пробую дебуг в симуляторе, что интересно, если рассматривать злополучную USART_SendStr, Кликните здесь для просмотра всего текста
, то в симуляторе значение ключевой приходящей data =13, хотя у меня там аж вагон написан, или это адрес?
0
|
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
|
|
11.05.2013, 17:29 [ТС] | 34 |
Разобрался я со строкой, нужно не просто переменную иметь с адресом, но еще и ее размер знать, а значит задать, хотелось конечно unsigned использовать, придется иметь запас переменных char разной длины, ну, никуда не денешься.
0
|
11.05.2013, 17:59 | 35 |
...у меня тоже идет побайтная отправка из строки перебором, отличий от примера выше немного. Если уж у вас никак строка не идет, может проще поступите? Подключите к проекту тады stdio.h и отправляйте строку через putsf(). Больше места займет прошивка.
1
|
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
|
|
11.05.2013, 19:28 [ТС] | 36 |
Пошла строка, пошла родная В принципе, гляну как будет работать с фиксированным максимальным размером, мне главное чтобы прерывания по таймеру часовому не сбивались, время должно идти четко.
Наконец пообщался с модулем, пишет что настоящий, антенну только куплю и можно использовать) Может и получится смс с кириллицей сделать, по вашей ссылке, почитаю внимательно. А с приемом? Вы как парсите ответы? По символам ждете нужного?
0
|
11.05.2013, 21:57 | 37 | |||||
1
|
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
|
|
12.05.2013, 16:09 [ТС] | 38 |
Возникло несколько вопросов по коду. Если не сложно, разъясните?
1. Когда вы объявляете к примеру char* UART_Recv(char* pnRecv), вот тот char* что подчеркнут, зачем там звездочка? Функция вернет адрес массива? 2. Когда вы выводите буфер, как вы определяете в нем начало слова? На конец указывает pnRecv, так? Но ведь вы возвращете все одно целый массив return arRx;. Я к тому что мне интересно что вы получаете в массиве. Суть как я понял такая, по прерыванию вы пишите в буфер символ, увеличивая указатель позиции для записи, чтобы знать куда писать следующий. Когда надо прочитать, вы выдираете из буфера все что есть, потом его затираете, так? А при использовании кольцевого буфера затирать массив не пришлось бы Все же непонятно еще кое что, у ЛСД нет видимо поддержки \r и \n, пишет вместо них кракозябры, вы по этим символам определяете начало\конец строки в ответе? К примеру приходит θζNORMAL POWER DOWNƩ∫ вот такое, кракозябры конечно не идентичные,но по логике это наверное \r\n.
0
|
12.05.2013, 17:47 | 39 |
1- указатель на адрес первого элемента, вот тут хорошо расписано https://www.cyberforum.ru/blogs/18334/blog97.html
2- по соответствующему символу в ответе на запрос AT, к примеру на опрос первой ячейки получил ответ "+CPBR: 1,"+380505933357",145,"Number1 "\x0dOK", перебираю символы строки (массива) на предмет совпадения на 'B', далее ищу плюсик и номер телефона при его известном количестве цифр, в общем что-то вроде аналога функции POS(), POSEX()
1
|
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
|
||||||||||||||||
12.05.2013, 19:59 [ТС] | 40 | |||||||||||||||
1,2 - спасибо
С кольцевым буфером тоже. У него есть 3 переменые: голова, хвост и счетчик символов. Выходит что идем от головы к хвосту(немного криво наверное написано, поправьте если там ошибки): Кликните здесь для просмотра всего текста
Прерывание, помимо записи инкрементирует индекс хвоста и счетчик принятых символов Кликните здесь для просмотра всего текста
А при очистке просто меняем значения трех переменных Кликните здесь для просмотра всего текста
Замечу, это не мое изобретение, просто очень мне понравилось Спасибо за совет с даташитом, сам не сообразил Добавлено через 18 минут Посмотрел, все ОК, приходят 13 и 10 сиволы по Ascii, как и предполагалось, спасибо.
0
|
12.05.2013, 19:59 | |
12.05.2013, 19:59 | |
Помогаю со студенческими работами здесь
40
Работа с портами и USART в МК51 "параллельная" работа SPI и USART xmega: usart - какой глубины буфер в USART? Программирование STM32. Работа с USART и NVIC [Решено]Непонятная работа USART в STM32F105 передача данных с 2 портов can и 1 usart в usart Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |