реклама на сайте
подробности

 
 
> rx_buffer, как взять данные по определенному адресу
digis14
сообщение Mar 5 2007, 16:37
Сообщение #1





Группа: Новичок
Сообщений: 8
Регистрация: 30-09-06
Пользователь №: 20 838



посылаю в uart запрос на получение номера из телефона
приходит так AT+CPBR=1+CPBR: 1,"+79xxxxxxxxx",145,""OK
и помещается в буфер,причем помещается в буфер через раз непонятно почему
работаю с cvavr и proteus
вопрос
как мне проверить что есть плюс в номере, а также длинну и поместить сам номер в переменную ,или
поместить в eeprom чтоб я его мог в нужное время отправить обратно

Сообщение отредактировал digis14 - Mar 5 2007, 16:37
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
digis14
сообщение Mar 5 2007, 19:42
Сообщение #2





Группа: Новичок
Сообщений: 8
Регистрация: 30-09-06
Пользователь №: 20 838



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


char *mystring = (char*)&rxbuf[0]


вот например
указатель на строку это *mystring
(char*)&rxbuf[0] у меня наверное будет так (char*)&rx_buffer[0]
и я не понимаю где будет адрес первого элемента буфера
Go to the top of the page
 
+Quote Post
Faradey
сообщение Mar 5 2007, 20:12
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 127
Регистрация: 31-05-06
Из: Belarus, Minsk
Пользователь №: 17 638



вот так тоже можно:

Код
      unsigned char USART0_Rx_buf[128]; //- пусть это ваш буфер приемник
      unsigned char Rx_write; //-это индекс записи - куда будет записываться след. байт
      unsigned char Nomer[13]; //-сюда номер запишем
      #define  CALL_MODEM    "+CPBR: \0"    // -ответ модема
      
      if(Rx_write>13 && strstr((char const*)&USART0_Rx_buf,CALL_MODEM))
      {//ПОСТУПИЛ ЗВОНОК
        unsigned char i=1;
        while(USART0_Rx_buf[Rx_write-i]!='+')
            i--;//находим позицию плюса
            
        unsigned char j=0;
        for(;j<13;j++)//записываем номер
            Nomer[j] = USART0_Rx_buf[i+j];
      }


--------------------
Завтра пойму, что нужно было сделать вчера...
Go to the top of the page
 
+Quote Post
Demeny
сообщение Mar 6 2007, 11:30
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 648
Регистрация: 11-02-06
Из: Санкт-Петербург
Пользователь №: 14 237



Цитата(Faradey @ Mar 5 2007, 20:12) *
вот так тоже можно:
Код
      unsigned char USART0_Rx_buf[128]; //- пусть это ваш буфер приемник
      unsigned char Rx_write; //-это индекс записи - куда будет записываться след. байт
      unsigned char Nomer[13]; //-сюда номер запишем
      #define  CALL_MODEM    "+CPBR: \0"    // -ответ модема
      
      if(Rx_write>13 && strstr((char const*)&USART0_Rx_buf,CALL_MODEM))
      {//ПОСТУПИЛ ЗВОНОК
        unsigned char i=1;
        while(USART0_Rx_buf[Rx_write-i]!='+')
            i--;//находим позицию плюса
            
        unsigned char j=0;
        for(;j<13;j++)//записываем номер
            Nomer[j] = USART0_Rx_buf[i+j];
      }

Это неправильная программа !!!
1) В цикле поиска "+" сначала i=1, а затем его начинаем минусовать. Где логика? Должно быть увеличение i , т. е. i++. Но это не самая принципиальная ошибка.
2) Если "плюса" в строке вообще не будет по какой-то причине - Вы получите бесконечный цикл, да ещё и с выходом за диапазон объявленного массива !!!
3) USART0_Rx_buf - это уже указатель, а Вы ещё берёте от него адрес & в функции сравнения строк - это откровенная ошибка.
4) Чтобы гарантированно использовать функции работы со строками, необходимо быть уверенным, что они оканчиваются на ноль.
5) В приведенном автором примере "плюсов" в строке несколько - не факт что самый правый начинает номер...
6) В номере может оказаться не ровно 12 цифр.
Давайте перепишем программку без ошибок. Чтобы начинать анализ, необходимо прежде всего получить от модема "ОК"....
Код
#include <string.h>
unsigned char rx_buffer[RX_BUFFER_SIZE]; //- пусть это ваш буфер приемник
unsigned char rx_wr_index; //-это индекс записи - куда будет записываться след. байт
unsigned char nomer[32]; //-сюда номер запишем (с запасом по длине)
#define CALL_MODEM "+CPBR: \0" // -ответ модема
if((rx_buffer[rx_wr_index-2]=='O') && (rx_buffer[rx_wr_index-1]=='K')) // получили ОК
{
//здесь нужно запретить прерывания по приему байта, если прием байта осуществляется по прерыванию.
   rx_buffer[rx_wr_index]='\0'; //для надежности сделаем строку "null-terminated"
   if((rx_wr_index>13) && strstr((const char*)rx_buffer, CALL_MODEM))
   {//ПОСТУПИЛ ЗВОНОК
     unsigned char i,j,k;
     unsigned char flag_found = 0; //флаг устанавливается, если найден валидный номер
     for(i=rx_wr_index-1;(i>=0)&&(!flag_found);i--) //ищем плюс по строке, начиная с конца
     {
       if(rx_buffer[i]=='+')
       {
         for(j=1;j<=4;j++)//проверка - есть ли хотя бы 4 цифры после "+"
         {
           if((rx_buffer[i+j])<'0') || (rx_buffer[i+j])>'9'))
              break;
          }
          if(j>4) //цикл определил как минимум 4 цифры после "+", значит, мы нашли номер
          {
            flag_found = 1;//конец главного цикла поиска
            nomer[0] = '+';
            for(k=1;k<31;k++) //выпариваем весь номер, но не более 30 символов
            {
                if ((rx_buffer[i+k)>='0') && (rx_buffer[i+k])<='9'))
                   nomer[k] = rx_buffer[i+k];
                else
                    break;
             }
             nomer[k]='\0';
            }
         }
      }
//здесь нужно разрешить прерывания по приему байта, если они принимаются по прерыванию
}


--------------------
Сделано в Китае. Упаковано в России.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- digis14   rx_buffer   Mar 5 2007, 16:37
- - _Bill   Цитата(digis14 @ Mar 5 2007, 16:37) посыл...   Mar 5 2007, 16:44
- - SasaVitebsk   Вопрос совершенно непонятен. 1) Длину можно посчит...   Mar 5 2007, 16:55
|- - digis14   Цитата(SasaVitebsk @ Mar 5 2007, 16:55) В...   Mar 5 2007, 17:23
- - beer_warrior   Работать с массивом как с операндом позволяет указ...   Mar 5 2007, 17:48
|- - Faradey   я бы на вашем месте смотрел с права на лево... ска...   Mar 5 2007, 19:29
- - digis14   переписал так unsigned char rx_buffer[RX_BUF...   Mar 5 2007, 20:59
- - digis14   RE: rx_buffer   Mar 6 2007, 12:32
|- - Demeny   Цитата(digis14 @ Mar 6 2007, 12:32) да ну...   Mar 6 2007, 14:48
- - digis14   разобраться бы что это char* pBuf = UART_Recv(...   Mar 6 2007, 21:00
|- - Demeny   Цитата(digis14 @ Mar 6 2007, 21:00) ошибк...   Mar 7 2007, 09:50
- - digis14   вот так вот сделал Код#include <90s2313.h...   Mar 7 2007, 14:01
- - digis14   новый вариант и причем работает Код/**************...   Mar 7 2007, 22:12


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 3rd July 2025 - 01:15
Рейтинг@Mail.ru


Страница сгенерированна за 0.01416 секунд с 7
ELECTRONIX ©2004-2016