29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
1

SIM900. Работа с Usart

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

Author24 — интернет-сервис помощи студентам
День добрый всем. В рамках моего проекта, увы очень долгого, дошла очередь до общения 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 примерно...

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

Работа USART в дуплексе
В мануале на МК написано что USART работает в режиме дуплекс, т.е. одновременно может принимать и...

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

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

62
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
10.05.2013, 16:35  [ТС] 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от raxp Посмотреть сообщение
а с чего оно должно было насторожить?
Ну, я подумал что тут опечатка, хотя уже понял что все ОК.

Цитата Сообщение от raxp Посмотреть сообщение
в какой переходник вы воткнули? Какую часть отрезали?
Ну, я помимо этого USB-232 переходника купил com удлинитель, единственный магазин 9 мая Юлмарт, а там чисто com штекер не продается, но зато был удлинитель, его я и разрезал пополам
Я уверен что все из-за земли общей. Почему то мой переменный ИБП начал давать искру на викле при включении в сетевой фильтр.
0
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
10.05.2013, 17:04 22
Цитата Сообщение от VladimirU Посмотреть сообщение
Там главное между байт должен быть временный интервал.
не выдумывайте. В УАРТе есть старт-стоп биты, определяющие начало и окончания байта. между стопом и стартом может не быть никаких задержек.
0
179 / 164 / 30
Регистрация: 14.02.2013
Сообщений: 1,464
10.05.2013, 17:48 23
Цитата Сообщение от Voland_ Посмотреть сообщение
не выдумывайте. В УАРТе есть старт-стоп биты, определяющие начало и окончания байта. между стопом и стартом может не быть никаких задержек.
У меня не работало без временных интервалов между байтами.
0
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
10.05.2013, 23:36  [ТС] 24
Ура! Свершилось, а дело то было в том как я команду завершал, не тем символом.
Пока правда только посимвольно
На команду "AT\r" прислал ОК))))

Цитата Сообщение от VladimirU Посмотреть сообщение
У меня не работало без временных интервалов между байтами.
У вас съедалась часть данных?

Добавлено через 4 часа 37 минут
И все же если вернуться к теме.
Так как используется указатель, то он должен куда то указывать. ОК, теперь я делаю так:
C
1
2
char sos='AT+CFUN?\r';//забиваем адрес и память для переменной
USART_SendStr(&sos);//когда надо вызвать отправку строки - добавляем &, чтобы указать на адрес.
И чудо, отправка есть(тест через протеус), да вот цепляет только последний символ - перенос строки.

Добавлено через 34 минуты
raxp, кстати, вот что написал один человек на сайте:
Тем, кто собирается покупать этот переходник. Установлен чип CH340DS1. На переходнике отсутствует преобразователь уровня RS232. Так что это USB-to-Serial (UART), но никак не RS232. Кому нужен RS232 - НЕ ПОКУПАТЬ!!!
Что это означает? Что у меня все правильно сгорело?
0
10231 / 6609 / 498
Регистрация: 28.12.2010
Сообщений: 21,156
Записей в блоге: 1
11.05.2013, 14:21 25
...имхо, так и не понял, что к чему вы подключали, какой именно конвертор и к какому именно удлинителю. Нарисуйте схему с указанием всех наименований.
0
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
11.05.2013, 14:49  [ТС] 26
Согласен, надо было сразу нарисовать, а то все воду лью
Вот:
SIM900. Работа с Usart
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
10231 / 6609 / 498
Регистрация: 28.12.2010
Сообщений: 21,156
Записей в блоге: 1
11.05.2013, 15:02 28
- кабель COM-удлинителя пассивный?
- какой длины кабель удлинителя?
- модель конвертора USB/RS-232?
0
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
11.05.2013, 15:15  [ТС] 29
Цитата Сообщение от raxp Посмотреть сообщение
- кабель COM-удлинителя пассивный?
- какой длины кабель удлинителя?
- модель конвертора USB/RS-232?
- обычный удлинитель, просто провод, наверное пассивный
- длина 1,8 метра
-
Кабель-переходник USB - RS232
Производитель VCOM
Модель VUS7050
Длина, м 1.2
Кабель-переходник для подключения устройств с интерфейсом RS-232 к USB-порту компьютера. В комплект входит программное обеспечение.
Кабель соответствует стандарту USB 1.1&2.0,
Скорость передачи данных – до 1 Мбит/с
Разъёмы – USB AM [папа] (для USB-порта компьютера),
9-контактный DB9M [папа] (для подключаемого устройства)
Поддержка режима автоматического соединения с устройством
Поддержка удалённой активации из "спящего режима" и управления питанием
Не вызывает конфликтов по прерываниям с другими устройствами
Как то так. Вот думаю, такой переходник все одно нужен для тестирования, брать ли его еще раз, научившись правильно использовать, или взять другой, быть может даже в другом магазине?
0
10231 / 6609 / 498
Регистрация: 28.12.2010
Сообщений: 21,156
Записей в блоге: 1
11.05.2013, 16:09 30
брать ли его еще раз
а что со старым произошло?

Для подключения к ардуине нужно уровни RS-232 преобразовать к TTL (есть модели без встроенного преобразователя, а в вашем клоне как?).
0
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
11.05.2013, 16:22  [ТС] 31
Ну, первый переходник(не удлинитель, с ним все ОК) видимо сгорел из-за того что я неправильно расставил номера проводов, зеркально перепутал, не догадался на самом штекере глянуть. После подключения вместе с устройством перестал определяться минут через 5, но я активно ковырял, тыкал туда сюда, не мог понять почему ничего не приходит от МК, так что сам виноват.
Второй же я подключил правильно, начал считывать, и когда перепрошил МК для отправки строки, то при включении устройства com порт пропал из диспетчера устройств и больше там не появлялся В итоге - 2 новых дохлых usb-rs232, супер
Но без этой штуки я точно не могу знать что отправляю от МК, если принять я могу на ЛСД дисплей, то отправить только на ГСМ модуль, стойте, а можно мне на МК соединить Rx и Tx, смогу я сам себе посылать данные?

Добавлено через 4 минуты
Цитата Сообщение от raxp Посмотреть сообщение
Для подключения к ардуине нужно уровни RS-232 преобразовать к TTL.
У меня нет ардуины, не очень понимаю зачем эта штука. Обычная мега16а, естественно пускал через max232.
0
10231 / 6609 / 498
Регистрация: 28.12.2010
Сообщений: 21,156
Записей в блоге: 1
11.05.2013, 16:55 32
...тьфу, перепутал с другой темой. Конечно, же. Но и в этом случае, в GSM-модуле UART с уровнями TTL, их нельзя напрямую тыкать в данный кабель RS-232/USB.

естественно пускал через max232.
и где это отображено на вашей схеме подключения выше?
0
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
11.05.2013, 17:17  [ТС] 33
Но ведь если бы я неправильно подключил max232, то не получил бы результатов на компьютере, просто лень было рисовать.
SIM900. Работа с Usart
  • Конденсаторы 22uF.
  • => ведет к Rx и Tx МК и COM порта

На тему посыла строки:
Пробую дебуг в симуляторе, что интересно, если рассматривать злополучную USART_SendStr,
Кликните здесь для просмотра всего текста

C
1
2
3
4
5
6
7
8
void USART_SendStr(unsigned char * data)
{
  unsigned char sym;
  while(*data){
    sym = *data++;
    USART_PutChar(sym);
  }
}

, то в симуляторе значение ключевой приходящей data =13, хотя у меня там аж вагон написан, или это адрес?
0
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
11.05.2013, 17:29  [ТС] 34
Разобрался я со строкой, нужно не просто переменную иметь с адресом, но еще и ее размер знать, а значит задать, хотелось конечно unsigned использовать, придется иметь запас переменных char разной длины, ну, никуда не денешься.
0
10231 / 6609 / 498
Регистрация: 28.12.2010
Сообщений: 21,156
Записей в блоге: 1
11.05.2013, 17:59 35
...у меня тоже идет побайтная отправка из строки перебором, отличий от примера выше немного. Если уж у вас никак строка не идет, может проще поступите? Подключите к проекту тады stdio.h и отправляйте строку через putsf(). Больше места займет прошивка.
1
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
11.05.2013, 19:28  [ТС] 36
Пошла строка, пошла родная В принципе, гляну как будет работать с фиксированным максимальным размером, мне главное чтобы прерывания по таймеру часовому не сбивались, время должно идти четко.
Наконец пообщался с модулем, пишет что настоящий, антенну только куплю и можно использовать)
Может и получится смс с кириллицей сделать, по вашей ссылке, почитаю внимательно.
А с приемом? Вы как парсите ответы? По символам ждете нужного?
0
10231 / 6609 / 498
Регистрация: 28.12.2010
Сообщений: 21,156
Записей в блоге: 1
11.05.2013, 21:57 37
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
char* pBuf = UART_Recv(&nRecv);
 
...
 
 
// прерывание происходит по приходу байта
SIGNAL(SIG_USART0_RX)  //SIG_USART0_UDRE    
{   
    arRx[posRx] = UDR;       
    posRx++;
    if(posRx >= SIZERX)
        posRx--;
}
 
char* UART_Recv(char* pnRecv)
{
    *pnRecv = posRx;
    return arRx;
}
 
void UART_ClearRxBuf(void)
{
    cli();
    memset(arRx, 0, SIZERX);
    posRx = 0;
    sei();
}
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
10231 / 6609 / 498
Регистрация: 28.12.2010
Сообщений: 21,156
Записей в блоге: 1
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()

Когда надо прочитать, вы выдираете из буфера все что есть, потом его затираете, так?
да, зато мне не надо искать конец строки.

у ЛСД нет видимо поддержки \r и \n, пишет вместо них кракозябры
контроллер LCD может и не поддерживать автоперенос, у большинства моделей знакоместо, по крайней мере строка, имеет абсолютные значения. Что касаемо отображения, то еще кодовая страница может быть, надо смотреть даташит.
1
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
12.05.2013, 19:59  [ТС] 40
1,2 - спасибо

Цитата Сообщение от raxp Посмотреть сообщение
да, зато мне не надо искать конец строки.
С кольцевым буфером тоже. У него есть 3 переменые: голова, хвост и счетчик символов. Выходит что идем от головы к хвосту(немного криво наверное написано, поправьте если там ошибки):
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
unsigned char USART_GetString(void)
{
    
    
    if (rxCount > 0){                     //если приемный буфер не пустой
        char sym[rxCount];
        for (int i =rxBufHead;i<rxBufTail;i++)//обходим только то что приняли
        {
            sym[i-rxBufHead]=usartRxBuf[i];
        }
    return sym;
    USART_FlushRxBuf();                        
    }                            
return 0;
}

Прерывание, помимо записи инкрементирует индекс хвоста и счетчик принятых символов
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
//прерывание по завершению приема
ISR(USART_RXC_vect) 
{
  if (rxCount < SIZE_BUF){                //если в буфере еще есть место                     
      usartRxBuf[rxBufTail] = UDR;        //считать символ из UDR в буфер
      rxBufTail++;                             //увеличить индекс хвоста приемного буфера 
      if (rxBufTail == SIZE_BUF) rxBufTail = 0;  
      rxCount++;                                 //увеличить счетчик принятых символов
    }
    
}

А при очистке просто меняем значения трех переменных
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
//"очищает" приемный буфер
void USART_FlushRxBuf(void)
{
  unsigned char saveSreg = SREG;
  cli();
  rxBufTail = 0;
  rxBufHead = 0;
  rxCount = 0;
  SREG = saveSreg;
}


Замечу, это не мое изобретение, просто очень мне понравилось

Спасибо за совет с даташитом, сам не сообразил

Добавлено через 18 минут
Посмотрел, все ОК, приходят 13 и 10 сиволы по Ascii, как и предполагалось, спасибо.
0
12.05.2013, 19:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.05.2013, 19:59
Помогаю со студенческими работами здесь

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

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

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

Программирование STM32. Работа с USART и NVIC
Добрый день, у меня такая проблема, есть плата STM32F3Discovery на Cortex-M4, так вот пишу вот...

[Решено]Непонятная работа USART в STM32F105
Привет всем. Столкнулся со странной проблемой с UART на STM32F105RCT6. Приём работает вроде...

передача данных с 2 портов can и 1 usart в usart
Доброго времени суток форумчане! Пытаюсь написать код для stm32f4disko с помощью которого можно...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru