Форум программистов, компьютерный форум, киберфорум
Радио: приемники, передатчики, антенны
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.75/96: Рейтинг темы: голосов - 96, средняя оценка - 4.75
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
1

SIM900. Работа с Usart

08.05.2013, 19:13. Просмотров 19673. Ответов 62
Метки нет (Все метки)

День добрый всем. В рамках моего проекта, увы очень долгого, дошла очередь до общения ATMega16A с SIM900 по UART. Долго я не мог наладить работу на прерываниях, узнав через неделю усилй и плясок с бубном что оказывается файл iom16a.h содержит кучу ошибок, и обновив АВР Студию прерывания заработали, но это так, просто поделиться
Так вот, для UART я использую кольцевой буфер с по статье этого сайта. Суть в том, что чтобы не терять данные и не заставлять МК простаивать в ожидании очистки UDR, они по приходу/отправке складываются в буфер нужного размера, остается их от туда забрать/положить когда нужно. Так вот, при отправке(сейчас стоит рассмотреть только ее, хотя и с получением не все гладко), используется данная функция:
Кликните здесь для просмотра всего текста

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//помещает символ в буфер, инициирует начало передачи
void USART_PutChar(unsigned char sym)
{
  //если модуль usart свободен и это первый символ
  //пишем его прямо в регистр UDR
  if(((UCSRA & (1<<UDRE)) != 0) && (txCount == 0)) UDR = sym;
  else {
    if (txCount < SIZE_BUF){    //если в буфере еще есть место
      usartTxBuf[txBufTail] = sym; //помещаем в него символ
      txCount++;                   //инкрементируем счетчик символов
      txBufTail++;                 //и индекс хвоста буфера
      if (txBufTail == SIZE_BUF) txBufTail = 0;
    }
  }
}

Если положить символ в буфер, то вызовется прерывание по завершению отдачи, которое стимулирует дальнейшую отправку из буфера:
Кликните здесь для просмотра всего текста

C
1
2
3
4
5
6
7
8
9
10
//обработчик прерывания по завершению передачи 
ISR(USART_TXC_vect)
{
  if (txCount > 0){              //если буфер не пустой
    UDR = usartTxBuf[txBufHead]; //записываем в UDR символ из буфера
    txCount--;                   //уменьшаем счетчик символов
    txBufHead++;                 //инкрементируем индекс головы буфера
    if (txBufHead == SIZE_BUF) txBufHead = 0;
  } 
}

Все ОК, эта конструкция работает в протеусе, НО, если мы хотим отправит строку:
Кликните здесь для просмотра всего текста

C
1
2
3
4
5
6
7
8
9
//функция посылающая строку по usart`у
void USART_SendStr(char * data)
{
  unsigned char sym;
  while(*data){
    sym = *data++;
    USART_PutChar(sym);
  }
}

То просто ничего не происходит, тут я если честно не силен с ссылками, просто не понимаю что не так.
Ок, берем топопр :
Кликните здесь для просмотра всего текста

C
1
2
3
4
5
6
7
8
9
10
// функция посылающая строку по usart`у 2
void USART_SendStr2(unsigned char s)
{
    register char c;
 
    while ( (c = s++) ) {
        USART_PutChar(c);
    }
 
}

И тут самое смешное: если отправить 1 символ - присылает русские буквы и символы что есть(все), если 2 символа - английские, если больше, то вообще крякозябры

Единственное место где я могу проверить на железе - модуль, но вот он пока не отвечает на мои запросы , только при включении шлет 4 символа с кодом 255, и при выключении NORMAL POWER DOWN, или как то так, у меня дисплей 8 символов, не влезает все
Поделитесь мыслями?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.05.2013, 19:13
Ответы с готовыми решениями:

Sim900 vs SIM900 GSM/GPRS MINIMUM SYSTEM MODULE
Каково ваше мнение, стоит ли переплачивать за модуль 100% стоимости(MINIMUM SYSTEM MODULE примерно...

ARDUINO R3 + SIM900 = web client
Вот на таком железе (так нужно, ибо уже приобретено) ...

Работа с смс сообщениями с помощью SIM900
Есть задача сделать устройство, которое будет принимать смс сообщение и обрабатывать его...

Работа с USART PIC16F877A
Написал прогу для приёма одного байта...в mplab Ide 8.46 работает...а в mplab x IDE 2.2 не работает...

62
10205 / 6587 / 493
Регистрация: 28.12.2010
Сообщений: 21,165
Записей в блоге: 1
08.05.2013, 19:24 2

Не по теме:

...для работы с кириллицей вам придется использовать PDU-формат отправки сообщений.

PDU это просто? Система оповещения GSM



но вот он пока не отвечает на мои запросы
даже на простые AT-команды что-ли? Питания хватает? Подключили верно?
1
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
08.05.2013, 19:28  [ТС] 3
Да мне не нужна кирилица, мне хочется отправить сторку по UART, латинскими буквами, а эти две функции что я показал не работают как надо, не могу понять почему.
Там не совсем русские буквы шлет, это я в аффекте написал)
SIM900. Работа с Usart
0
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
08.05.2013, 19:32  [ТС] 4
Подключил верно, ибо модуль при выключении шлет таки "NORLMAL POWER DOWN", при отправке посимвольно(USART_PutChar),не строкой мне выдет то что я отправлял, что странно.
А вы как команду заканичваете? \n или <CR>?
0
10205 / 6587 / 493
Регистрация: 28.12.2010
Сообщений: 21,165
Записей в блоге: 1
08.05.2013, 19:34 5
...скоры на ответ, пост еще редактировался ...а между прочим по ссылке тоже пример работы из МК с терминалом, только под AVR-студию.
1
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
08.05.2013, 19:44  [ТС] 6
Да, за ссылку спасибо, уже смотрю

Добавлено через 7 минут
Прикольно, опсиали временные задержки моргания светодиода, а вот о sendcom ни строчки
Я наверное запутал вас. У меня 2 проблемы с отправкой:
1. Не отправить строку: либо не отправляет, либо отправляет чушь.
2. Модуль не отвечает на команды, ну, тут я думаю либо со временем между отправкой символов связано все(что решится отправкой строки), либо неправильным знаком переноса строки в конце.
0
10205 / 6587 / 493
Регистрация: 28.12.2010
Сообщений: 21,165
Записей в блоге: 1
08.05.2013, 19:52 7
а вот о sendcom ни строчки
вы не туда смотрите, это верхний уровень, из Delphi. Смотрите нижний уровень, для МК.

Модуль не отвечает на команды
не отвечает вообще или только из вашей программы под МК? В смысле вы пробовали с ПК с гипертерминала его опрашивать?
1
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
08.05.2013, 20:11  [ТС] 8
Цитата Сообщение от raxp Посмотреть сообщение
не отвечает вообще или только из вашей программы под МК? В смысле вы пробовали с ПК с гипертерминала его опрашивать?
Увы, такой возможности нет, отсутствует ком порт на ПК. Вот и играюсь с протеусом, да МК+LCD+модуль.
0
10205 / 6587 / 493
Регистрация: 28.12.2010
Сообщений: 21,165
Записей в блоге: 1
08.05.2013, 20:17 9
отсутствует ком порт на ПК
у меня тоже. USB/RS-232 (UART) конвертор для этого.
1
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
08.05.2013, 20:21  [ТС] 10
Цитата Сообщение от raxp Посмотреть сообщение
у меня тоже. USB/RS-232 (UART) конвертор для этого.
Вообще у меня паралленльный usb программатор, он в АВР студии определяется каак stk500, может с его помощью можно реализовать теминал с МК из авр студии к примеру?
0
10205 / 6587 / 493
Регистрация: 28.12.2010
Сообщений: 21,165
Записей в блоге: 1
08.05.2013, 20:28 11
...если вывести оттуда с FTDI-ки RX/TX (uart) для МК на соответствующие ноги, то скорее да.
1
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
08.05.2013, 22:40  [ТС] 12
Почитаю инструкцию,посмотрю схемку, может и получится.
Ну если не про sim900, не видите явных ошибок в функции USART_SendStr?

Добавлено через 1 час 36 минут
Мой программатор - интересная штуковина, но вот без совета не понять годен ли он.
На нем имеются выводы RxDebug и TxDebug, в инструкции написано что мол есть 2 режима работы(переключаются джамперами) - USB-HID и без него. Без него вроде как для AVRStudio, с ним для avrdude. Так вот, этот дебуг режим включается только при использовании avrdude(команда avrdebug), если делать дебуг из студии - пишет про ошибку считывания вольтажа, терминал молчит если просто все подключить и включить. А нет ли в avrdude встроенного терминала?
0
1779 / 1109 / 109
Регистрация: 04.01.2010
Сообщений: 3,888
08.05.2013, 22:59 13
Цитата Сообщение от zoomerland Посмотреть сообщение
void USART_SendStr2(unsigned char s)
нужно
C
1
void USART_SendStr2(unsigned char *s)
и потом
C
1
 while ( (c = *s++) ) {
во-вторых, почитайте за SIM900. У него по умолчанию стоит автободрейт, который настраивается первым отправленным модулю символом.
в-третьих, четко надо делать инициализацию UART'а на вменяемой скорости и включать прерывания (#asm("sei"); где-нить перед применением есть?). Не видя весь код сложно что-то еще сказать. Возможно, проблем больше. Например, обычно в обработчике флага TXE обычно отключают это прерывание, когда буфер заканчивается, а в putchar'е наоборот - его включают.
1
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
08.05.2013, 23:31  [ТС] 14
Цитата Сообщение от Voland_ Посмотреть сообщение
нужно
C
1
void USART_SendStr2(unsigned char *s)
и потом
C
1
 while ( (c = *s++) ) {
во-вторых, почитайте за SIM900. У него по умолчанию стоит автободрейт, который настраивается первым отправленным модулю символом.
в-третьих, четко надо делать инициализацию UART'а на вменяемой скорости и включать прерывания (#asm("sei"); где-нить перед применением есть?). Не видя весь код сложно что-то еще сказать. Возможно, проблем больше. Например, обычно в обработчике флага TXE обычно отключают это прерывание, когда буфер заканчивается, а в putchar'е наоборот - его включают.
Автор библиотеки пишет:

Я долго думал, нужно ли в этом проект запрещать прерывания при работе с буферами в основной программе или нет и пришел к выводу, что не нужно. Единственная функция с которой могут возникнуть проблемы - функция очистки приемного буфера. Там уж никак не обойтись без запрещения прерываний. В остальных случаях порядок работы с переменными подобран таким образом, что прерывания не вызовут ошибок.
Вот проект(justDiod.rar) под студию6, главная программа - просто набор тестов для ЮАРТА, выводит на ЛСД то что пришло, да посылает все время набор символов.
Что интересно, по одному символы в протеусе приходят.
0
140 / 118 / 21
Регистрация: 14.02.2013
Сообщений: 816
10.05.2013, 13:19 15
Попробуйте заставить общаться МК и SIM900 по USART в синхронном режиме.
МК пусть выступает в роли синхронного ведущего устройства, а SIM900 в роли синхронного ведомого устройства.
И насчёт готовых функций для работы с модулем UART не пользуйтесь ими. Не так уж и сложно настроить регистры и биты МК для правильной работы UART по даташиту.

Добавлено через 23 минуты
Для МК PIC.
Ещё для настройки UART существует генератор частоты обмена BRG.
BRG используется дл яработы USART всинхронном ведущем и асинхронном режимах. BRG представляет собой
отдельный 8-разрядный генератор скорост иобмена в бодах, период которого определяется значением в регистре
SPBRG. В асинхронном режиме бит BRGH (TXSTA<2>) тоже влияет на скорость обмена (в синхронном режиме бит
BRGH игнорируется). В таблице 18-1 указаны формулы для вычисления скорости обмена в бодах при различных
режимах работ модуля USART (относительно внутреннего тактового сигнала микроконтроллера).
Учитывая требуемую скорость FOSC, выбирается самое близкое целое значение для записи в регистр SPBRG
(от 0 до 255), рассчитанное по формулам приведенным в таблице18-1. Затем рассчитывается ошибка скорости
обмена.
1
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
10.05.2013, 14:52  [ТС] 16
За 2 дня умерло 2 переходника usb-com, первый признаю, неправильно подключил, ну а второй умер сам по себе но я успел принять несколько результатов. МК уверенно принимает по UART данные, отправляет символ, а вот со строкой не успел проверить Ну да ладно, все одно можно слать команды посимвольно, ведь так? sim900 же понимает конец команды через символ переноса строки? Я вот только не могу понять какой "\n" или "<CR>"?
ПС. Библиотека вся изучена, она же простенькая, но мне понравился кольцевой буфер, единственная проблема выходит с отправкой строки, хотя быть может и ее нет, не проверить.
0
10205 / 6587 / 493
Регистрация: 28.12.2010
Сообщений: 21,165
Записей в блоге: 1
10.05.2013, 14:57 17
За 2 дня умерло 2 переходника usb-com, первый признаю, неправильно подключил, ну а второй умер сам по себе
само по себе так не происходит. Опторазвязка на большинстве USB/COM-конверторов отсутствует. Как запитан модуль, есть ли заземление на ПК, соединены ли земля модуля и ПК?
1
140 / 118 / 21
Регистрация: 14.02.2013
Сообщений: 816
10.05.2013, 15:31 18
Разница между передаче одного символа или целой строки в том, что строка она делится на те же самые байты и передаётся. Там главное между байт должен быть временный интервал.
Можно передавать команды и посимвольно.
1
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
10.05.2013, 15:48  [ТС] 19
Цитата Сообщение от raxp Посмотреть сообщение
само по себе так не происходит. Опторазвязка на большинстве USB/COM-конверторов отсутствует. Как запитан модуль, есть ли заземление на ПК, соединены ли земля модуля и ПК?
Сделал так: купил удлиннитель com, воткнул его, в переходник, другую часть отрезал, прозвонил все провода, расставил по номерам. Далее скрутил вместе 1,4,6, а так же 7,8. 9 оставил болтаться в воздухе, 5 соединил с землей МК. Есть еще белый - корпус, его не трогал.
Сам МК питается через 7805, единственное без фильтров, от ИБП 12 Вольт. Естественно что при этом земля com порта соединена с минусом ИБП. При включении в сеть думаю коротыш убил порт через землю, наверное так

Добавлено через 1 минуту
Цитата Сообщение от VladimirU Посмотреть сообщение
Разница между передаче одного символа или целой строки в том, что строка она делится на те же самые байты и передаётся. Там главное между байт должен быть временный интервал.
Можно передавать команды и посимвольно.
А как давать понять что команда передана?
Посимвольно все же только для теста сгодится, надо понять что со ссылками в sendStr.

Добавлено через 7 минут
Цитата Сообщение от raxp Посмотреть сообщение
само по себе так не происходит
А еще я понял что меня зря не насторожило название USB-RS232, хотя это же USB-COM
SIM900. Работа с Usart
0
10205 / 6587 / 493
Регистрация: 28.12.2010
Сообщений: 21,165
Записей в блоге: 1
10.05.2013, 15:54 20
меня зря не насторожило название USB-RS232, хотя это же USB-COM
а с чего оно должно было насторожить?

воткнул его, в переходник, другую часть отрезал
в какой переходник вы воткнули? Какую часть отрезали?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.05.2013, 15:54

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Работа с портами и USART в МК51
ребят, подскажите пожалуйста, если не трудно, преподаватель задал вот такую задачу Исходные...

"параллельная" работа SPI и USART
Доброе время суток !!! в МК есть два массива. В первый массив записываются данные из USORT, в...

Работа с USART ATMega128 (ASM)
Добрый вечер! Возникла небольшое недопонимание по программе. Программа вроде бы простая,да...

xmega: usart - какой глубины буфер в USART?
Взялся тут &quot;запилить&quot; на xmego32a4 мультиплексор двух rs232 в один rs485. Все как бы получилось и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.