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

SIM900. Работа с Usart

08.05.2013, 19:13. Просмотров 19679. Ответов 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
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
15.05.2013, 01:49  [ТС] 41
Вот, немного подумал как сделать функцию повзрослей, в итоге получилась такая штука, может кому пригодится, если есть ошибки - просьба поправить:
C
1
2
3
4
5
6
7
8
9
10
11
void USART_GetString(unsigned char * dataArr,int* posInBufEnd)
{
    if (rxCount > 0){                     //если приемный буфер не пустой
        *posInBufEnd=rxBufTail;             //тут передаем обратно конец строки
        for (int i =rxBufHead;i<rxBufTail;i++)  /*идем по буферу от головы к хвосту*/
        {
            dataArr[i-rxBufHead]=usartRxBuf[i]; /*с начала нашего массива со строкой записываем нужные значения*/
        }
    USART_FlushRxBuf();                     /*очищаем буфер после прочтения*/ 
    }                            
}
0
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
16.05.2013, 04:15  [ТС] 42
И снова проблема, после почти победы
После регистрации в сети и некоторых настроек, пробуем отправить смс.
Есть желание в целях ускорения процесса не заморачиваться пока с PDU, реализовать все в текстовом виде.
Но вот незадача, после отправки "AT+CMGS=\"+7921*******\"\r" выдет в ответ ошибку 765 invalid input value
Блин, это как же так, неправильно? Смотрю даташит, есть вариант после запятой использовать какой то тип адреса, но что это - ума не приложу, в даташите он <toda>
Еще быть может не тот центр сообщений, но его блин не записать, та же ошибка, а при чтении выплевывается очень длинное число, наверное коды цифр номера.
При переводе в PDU режим я дальше первой команды с длиной не заходил, непонятно пока, даже с той статьей что в начале темы.
0
10205 / 6587 / 493
Регистрация: 28.12.2010
Сообщений: 21,165
Записей в блоге: 1
16.05.2013, 07:38 43
AT+CMGS="+7921*******"+#13#10
TEXT+#26
0
1779 / 1109 / 109
Регистрация: 04.01.2010
Сообщений: 3,892
16.05.2013, 10:29 44
zoomerland, где-то проблемы с форматом данных. Для представления номера адресата есть два режима, команда AT+CMGF. Скорее всего у вас выставлен хексовый режим. Как вариант - сбросьте модем в настройки по умолчанию.
1
10205 / 6587 / 493
Регистрация: 28.12.2010
Сообщений: 21,165
Записей в блоге: 1
16.05.2013, 10:38 45
AT+CMGF само собой, а вот слешами обрамлять номер точно не надо ...и вообще, TC, там же в даташите с.193.
0
Voland_
16.05.2013, 10:40
  #46

Не по теме:

Цитата Сообщение от raxp Посмотреть сообщение
слешами обрамлять номер точно не надо
это Сишный формат строки. /n, /r, /" /000 и др. должны быть с слешами, чтобы компилер правильно формировал спец.символы в строке.

0
10205 / 6587 / 493
Регистрация: 28.12.2010
Сообщений: 21,165
Записей в блоге: 1
16.05.2013, 10:48 47
...я говорил не за переводы строк и кареток, про спецсимволы это понятно.
0
1779 / 1109 / 109
Регистрация: 04.01.2010
Сообщений: 3,892
16.05.2013, 11:01 48
raxp, ну дак окромя них, кавычка одинарная и двойная и слеш тоже должны записываться со слешем: \", \', \\.
то есть ТС не обрамляет слешами номер, он просто кавычки выводит.
1
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
16.05.2013, 19:44  [ТС] 49
Да, так и есть:
\" это кавычка
\r это символ возврата каретки, 13 в таблице ascii
\n это перенос на новую сторку, 10 в таблице ascii
Вот так все целостно
C
1
strcat(sos,"AT+CMGS=\"+7921*******\"\r");
На это я хотя бы не должен получать ошибки, а на самом деле получить <, после чего уже слать текст, все по даташиту. В режиме эха приходит номер в кавычках с \r в конце... и ошибкой...


Цитата Сообщение от raxp Посмотреть сообщение
AT+CMGS="+7921*******"+#13#10
TEXT+#26
Jшибка уже после +#13

Цитата Сообщение от Voland_ Посмотреть сообщение
Скорее всего у вас выставлен хексовый режим.
Нет, это не так, в PDU режиме(AT+CMGF=1) как раз ответ есть в виде <, естественно при отправке просто числа без кавычек, к примеру так:
C
1
strcat(sos,"AT+CMGS=54\r");
А вот при AT+CMGF=2 как раз проблемы, всегда ошибка.


Цитата Сообщение от raxp Посмотреть сообщение
а вот слешами обрамлять номер точно не надо
Но ведь в даташите написано, что при AT+CMGF=2 string should be included in quotation marks, у меня на странице 105.


Цитата Сообщение от raxp Посмотреть сообщение
там же в даташите с.193
у меня там AT+CIPSCONT, видимо разные редакции даташита.

Може кто знает что это за штука, вдруг этот параметр поможет?
SIM900. Работа с Usart
0
10205 / 6587 / 493
Регистрация: 28.12.2010
Сообщений: 21,165
Записей в блоге: 1
16.05.2013, 21:24 50
Jшибка уже после +#13
вы бы были хотя бы внимательнее, это приведено в терминах Паскаля/Delphi, а потому синтаксис нужно привести в си-шный вид.

Но ведь в даташите написано, что при AT+CMGF=2 strin
а оно у вас его поддерживает? Открываем справку на AT команды, текстовый формат 1, для PDU режима =0. AT+CMGF=0

Открываем статью, вот как отправляю в PDU формате из МК:
Код
szSTART = "AT+CMGS=54\x0d";
sz2 = "079183609310000001000C91835050321412000836041D043504420020043F043804420430043D0438044F0020043A043E043D04420440043E043B043B043504400430002000470053004D\x1a";

UART_outstr_P(szSTART);		
DiagOut(2,250);	// ожидание 1 с
UART_outstr_P(psz);			
DiagOut(5,250);	// ожидание 5/2 с

...
void UART_outstr(char* psz)
{
	unsigned char i = 0;
	while(i < 13)
	{
		char c = psz[i];
		outp(UDR, c);
		loop_until_bit_is_set(UCSRA, UDRE);
		i++;
	}
}
1
1779 / 1109 / 109
Регистрация: 04.01.2010
Сообщений: 3,892
16.05.2013, 22:25 51
zoomerland, вы все правильно делаете. Не должно быть проблем. Проверить нужно следующее:
- AT+CMGF=0 - это текстовый режим, согласно ДШ по АТ-командам на SIM900.
- AT+COPS? - вернет вам оператора, к которому вы реально подключены.

Убедитесь, что вы в сети, можете отправлять СМС, и находитесь в нужно режиме.
Еще один вариант - запуститься через USB-UART с какой-нить рабочей программой отправки СМС и увидеть что она делает с вашим момедом через программу portmon.

Добавлено через 7 минут
raxp, не горячитесь,
Цитата Сообщение от zoomerland Посмотреть сообщение
ет, это не так, в PDU режиме(AT+CMGF=1)
странно, у меня в ДШ на сим900:
If text mode (+CMGF=1)
предвидя коллизию скажу - у меня редакция ДШ 1.06.
1
10205 / 6587 / 493
Регистрация: 28.12.2010
Сообщений: 21,165
Записей в блоге: 1
16.05.2013, 22:44 52
...пусть пошлет AT+CMGF?
сразу узнаем.
1
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
17.05.2013, 00:25  [ТС] 53
Цитата Сообщение от raxp Посмотреть сообщение
вы бы были хотя бы внимательнее, это приведено в терминах Паскаля/Delphi, а потому синтаксис нужно привести в си-шный вид.
Тут я просто выразился вашим языком, имея ввиду ошибку после \r, каюсь что запутал, буду точнее.


Цитата Сообщение от raxp Посмотреть сообщение
а оно у вас его поддерживает? Открываем справку на AT команды, текстовый формат 1, для PDU режима =0. AT+CMGF=0
Вот тут я всех опять запутал, конечно же AT+CMGF=0 это PDU, AT+CMGF=1 это текст.


Цитата Сообщение от raxp Посмотреть сообщение
...пусть пошлет AT+CMGF?
сразу узнаем.
Тут вот как я реализовал:
C
1
2
3
4
5
6
            if (strstr(usartRecieveBuf,"AT+CMGF=1\r\r\nOK\r\n"))
            {
                memset(sos,0,25);
                strcat(sos,"AT+CMGS=\"+7921*****\"\r");
                USART_SendStr(&sos);
            }
А CMGF я настраиваю после регистрации в сети:
C
1
2
3
4
5
6
            if (strstr(usartRecieveBuf,"AT+CREG?\r\r\n+CREG: 0,1"))
            {
                memset(sos,0,25);
                strcat(sos,"AT+CMGF=1\r");
                USART_SendStr(&sos);                
            }

Цитата Сообщение от Voland_ Посмотреть сообщение
- AT+COPS? - вернет вам оператора, к которому вы реально подключены.
Вот эту команду еще не пробовал, хотя наверное после AT+CREG? не имеет смысла.

Спасибо всем за ответы, буду еще ковырять, проверять и перепроверять...

Добавлено через 3 минуты
Или может ну его, сесть сразу за PDU, русские буквы, красота... По идее алгоритм не сложный, главное не запутаться.
0
10205 / 6587 / 493
Регистрация: 28.12.2010
Сообщений: 21,165
Записей в блоге: 1
17.05.2013, 08:31 54
Не сложный + задел на будущее будет.
1
1779 / 1109 / 109
Регистрация: 04.01.2010
Сообщений: 3,892
17.05.2013, 11:12 55
zoomerland, русские буквы доступны и без PDU, шаманьте с кодировками. Примеры в сети есть.
PDU интересен тем, когда вы захотите отправлять оповещения и др. специфичные команды. Но они могут быть специфичными уже для отдельных операторов.
2) повторюсь, у меня в описании на SIM900 AT+CMGF=0 для текстового режима. Поэтому, я не пойму почему вы с
raxp, утверждаете обратное. Дайте ссылку на прув. У меня ДШ версии 1.06. Мало того, я это использовал и отправлял СМСки без каких-либо проблем.
1
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
17.05.2013, 14:04  [ТС] 56
Цитата Сообщение от Voland_ Посмотреть сообщение
Дайте ссылку на прув. У меня ДШ версии 1.06.
Вот, не врем:
SIM900. Работа с Usart

Правда у меня версия 1.03, неужели изменили?
Сейчас посмотрю по новее ДШ.

К сожалению не поработать до вечера с симкой, прям руки чешутся до этого дела добраться.


Цитата Сообщение от Voland_ Посмотреть сообщение
PDU интересен тем, когда вы захотите отправлять оповещения и др. специфичные команды
Именно для управления и оповещений мне смс и нужно. А в чем преимущества PDU перед текстом? Тем что удобнее парсить ответ?
0
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
17.05.2013, 14:05  [ТС] 57
Цитата Сообщение от raxp Посмотреть сообщение
Не сложный + задел на будущее будет.
ОК, так и поступлю
0
1779 / 1109 / 109
Регистрация: 04.01.2010
Сообщений: 3,892
17.05.2013, 14:20 58
Цитата Сообщение от zoomerland Посмотреть сообщение
А в чем преимущества PDU перед текстом? Тем что удобнее парсить ответ?
ну, кроме развернутых сервисных функций, вы получаете возможность слать полноценные данные, без шифровки их в текст.

Цитата Сообщение от zoomerland Посмотреть сообщение
Вот, не врем:
да оно-то так. но на странице описания AT+CMGS все наоборот. И кому верить? Они сами запутались .
0
10205 / 6587 / 493
Регистрация: 28.12.2010
Сообщений: 21,165
Записей в блоге: 1
17.05.2013, 16:26 59
...ревизия даташита еще не все, есть еще ревизия терминала.
0
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
17.05.2013, 22:54  [ТС] 60
Странно, но в PDU я смог отправить смс
Стоит заметить что у меня на 0 - PDU, точно. А вот с 1 режимом - никак, ну хрен с ним, обойдемся

Цитата Сообщение от raxp Посмотреть сообщение
...ревизия даташита еще не все, есть еще ревизия терминала.
Это вы что имеете ввиду?


Цитата Сообщение от Voland_ Посмотреть сообщение
да оно-то так. но на странице описания AT+CMGS все наоборот
А это же вроде и есть та страница, или есть еще?
Если у вас работает наоборот, выходит что и так и так бывает.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.05.2013, 22:54

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

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

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

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

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


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

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

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