Например TDA7294

Форум РадиоКот • Просмотр темы - Разбор строки, пришедшей от модема.
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Сб апр 20, 2024 19:37:07

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Разбор строки, пришедшей от модема.
СообщениеДобавлено: Сб янв 28, 2017 20:17:51 
Открыл глаза

Зарегистрирован: Вс авг 02, 2015 18:02:38
Сообщений: 68
Рейтинг сообщения: 0
Привет. Мк stm32ret6b модем siemens c35i, прога - Keil5. принял строку от модема. Запихнул в буфер Buffer[], выглядит так:
Изображение
Формат заранее известен. Он такой как на картинке. Но надо учесть вдруг данные могут по дороге частично растеряться, хотя это вряд ли. Это я к тому, что я явно указывал начало копирования Buffer[20]. Вобщем нужно быстро и изящно выдернуть всё что между кавычек. И учесть, что например потерю символов (сдвиг индексов массива) и если есть там +7, то + отрезать.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Разбор строки, пришедшей от модема.
СообщениеДобавлено: Сб янв 28, 2017 20:30:34 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
не понимаю, как человек, способный на ARM принять строку из модема, может задавать такие вопросы?! :shock:

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

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Разбор строки, пришедшей от модема.
СообщениеДобавлено: Сб янв 28, 2017 20:45:54 
Открыл глаза

Зарегистрирован: Вс авг 02, 2015 18:02:38
Сообщений: 68
Рейтинг сообщения: 0
наверное потому что просто не сталкивался с необходимостью дербанить строки


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Разбор строки, пришедшей от модема.
СообщениеДобавлено: Сб янв 28, 2017 22:04:59 
Поставщик валерьянки для Кота

Карма: 16
Рейтинг сообщений: 329
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Сообщений: 2222
Откуда: Tashkent
Рейтинг сообщения: 0
Начнём?

Код:
typedef struct
{
   char *str;
   char len;
} STR_RESULT;

STR_RESULT find_your_str( char *str, char len )
{
   STR_RESULT result={0,0};
   uint8_t i=0;

   while( i<len )
   {
      if( str[i++] == '"' )
      {
         result.str = str+i-1; // start
         break;
      };
   };

   while( i<len )
   {
      if( str[i] == '+' )
      {
         result.str++;
      };

      if( str[i++] == '"' )
      {
         result.len = i; // stop
         break;
      };
   };

   return result;
}


Ну или посмотреть что там в string.h предлагают.


Вернуться наверх
 
Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Разбор строки, пришедшей от модема.
СообщениеДобавлено: Сб янв 28, 2017 23:36:04 
Открыл глаза

Зарегистрирован: Вс авг 02, 2015 18:02:38
Сообщений: 68
Рейтинг сообщения: 0
в стрингах ничего особо-то и не предлагают. Ну я попробовал вот так:

Код:
void GSM_COMM_GET_SMS_SERVICE(){
            char pattern_number[1] = "\"";
            char *link_pattern_number = pattern_number;
            char *number = strstr(Buffer_Receive, link_pattern_number);
            //Указатель number указывает на первый символ ".
            //Если далее записать вот так:
            LCD_Send_String(1, number);
            //То на экран выведется всё что после первых кавычек.
}

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


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Разбор строки, пришедшей от модема.
СообщениеДобавлено: Вс янв 29, 2017 00:55:28 
Поставщик валерьянки для Кота

Карма: 16
Рейтинг сообщений: 329
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Сообщений: 2222
Откуда: Tashkent
Рейтинг сообщения: 0
Думается мне как-то так:
Код:
char *start=NULL, *stop=NULL;
int idx, len;
char *number = strstr(Buffer_Receive, link_pattern_number);
if( number != NULL )
{
   number++;
   start=number;
   stop = strstr(++number, link_pattern_number);
   if( stop != NULL )
   {
      stop--;
      idx = start-Buffer_Receive;// индекс для входа в строку   
      len = stop-start;//длина строки в кавычках
      /* здесь что-то сделать со строкой */
   }
   
}


Добавлено after 3 minutes 13 seconds:
supercelt писал(а):
Код:
            char pattern_number[1] = "\"";
}


И как определить конец строки?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Разбор строки, пришедшей от модема.
СообщениеДобавлено: Вс янв 29, 2017 00:59:17 
Друг Кота
Аватар пользователя

Карма: 107
Рейтинг сообщений: 1031
Зарегистрирован: Пт дек 17, 2010 15:07:50
Сообщений: 12366
Откуда: Крымский Федеральный Округ
Рейтинг сообщения: 0
В самом примитивном случае. Просто защищая себя от потери пары байт вначале строки:
Код:
char Result[11]; int start = 0;
for(int i = 0; i < 21; i++) { if(Buffer[i] == 34) { start = i; break; } }
for(int j = 0; j < 11; j++) Result[j] = Buffer[j + start];

Три магических числа.
11 -- знаков в мобильном номере
34 -- ASCII код знака "
21 -- до этого момента однозначно должен был появиться знак " :write:

_________________
Изображение
И ты врёшь!!! © Vladisman
Изображение


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Разбор строки, пришедшей от модема.
СообщениеДобавлено: Вс янв 29, 2017 18:14:15 
Открыл глаза

Зарегистрирован: Вс авг 02, 2015 18:02:38
Сообщений: 68
Рейтинг сообщения: 0
Цитата:
11 -- знаков в мобильном номере

Не обязательно. Вдруг будет номер из какого-нибудь Уругвая))

Добавлено after 2 hours 41 minute 34 seconds:
Ещё вариант. Работает. Но пока без отсекания знака +. Годно?

Код:
void GSM_EXTRACT_NUMBER(char *str){
      uint8_t start, i, j;
      char number[] = "";
      for(i = 0; i < 44; i++){
            if(start){
                  if(str[i] == 0x22){
                        start = 0;
                        break;
                  }
                  number[j++] = str[i];
            }
            if(str[i] == 0x22){
                  start = 1;
            }
      }
      LCD_Send_String(1, number);
}


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Разбор строки, пришедшей от модема.
СообщениеДобавлено: Вс янв 29, 2017 19:38:50 
Опытный кот

Карма: 3
Рейтинг сообщений: -47
Зарегистрирован: Пт авг 12, 2011 09:14:27
Сообщений: 833
Откуда: Млечный путь/Земля/РФ/Екатеринбург
Рейтинг сообщения: 0
Без внешних либ, но не проверялось.

Код:
/* by pcb
**
*/
char   i;               //индекс в буфере
bool   foundnum = false;         //найдена строка?

for(i = o; i < rxStrLen; ++i){
   if(buf[i]=='"'){
      char idx = 0;         //индекс в найденом номере
      ++i;            //на первый символ после '"'
      foundnum = true;
      while(buf[i]!='"'){      //копируем до конца, пока не найдем '"'
         numStr[idx] = buf[i];
         ++i;
         ++idx;
      }
   }
   if(foundnum) break;         //если номер найден, то прерываем цикл
}


_________________
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Разбор строки, пришедшей от модема.
СообщениеДобавлено: Вс янв 29, 2017 20:40:25 
Поставщик валерьянки для Кота

Карма: 16
Рейтинг сообщений: 329
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Сообщений: 2222
Откуда: Tashkent
Рейтинг сообщения: 0
supercelt писал(а):
Годно?

Нет.

char number[] = ""; --- выделяется статически.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Разбор строки, пришедшей от модема.
СообщениеДобавлено: Вс янв 29, 2017 21:32:53 
Открыл глаза

Зарегистрирован: Вс авг 02, 2015 18:02:38
Сообщений: 68
Рейтинг сообщения: 0
то есть надо так?

Код:
char number[11];


А чем плохо динамически?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Разбор строки, пришедшей от модема.
СообщениеДобавлено: Пн янв 30, 2017 10:54:14 
Поставщик валерьянки для Кота

Карма: 16
Рейтинг сообщений: 329
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Сообщений: 2222
Откуда: Tashkent
Рейтинг сообщения: 0
Ничем не плохо.
Лишь за тем исключением, что динамическое выделение реализуется иными методами.
А то что там было написано вылезало за границы и возможно портило чужую область памяти. Пока прога маленькая или не полностью протестирована это можно не заметить.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Разбор строки, пришедшей от модема.
СообщениеДобавлено: Пт фев 03, 2017 17:20:39 
Открыл глаза

Зарегистрирован: Вс авг 02, 2015 18:02:38
Сообщений: 68
Рейтинг сообщения: 0
Слушайте, а если для интереса с регулярками поработать, для практики. Как их прикрутить к Keil? Где взять библиотеку для регулярок под Keil с мануалом?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Разбор строки, пришедшей от модема.
СообщениеДобавлено: Чт фев 23, 2017 09:54:49 
Родился

Зарегистрирован: Чт фев 23, 2017 09:52:10
Сообщений: 1
Рейтинг сообщения: 0
Автор, откройте для себя конечные автоматы, разбор таких строк станет ясным и простым.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y