Форум РадиоКот https://radiokot.ru/forum/ |
|
Разбор строки, пришедшей от модема. https://radiokot.ru/forum/viewtopic.php?f=59&t=141277 |
Страница 1 из 1 |
Автор: | ARV [ Сб янв 28, 2017 20:30:34 ] |
Заголовок сообщения: | Re: Разбор строки, пришедшей от модема. |
не понимаю, как человек, способный на ARM принять строку из модема, может задавать такие вопросы?! ![]() |
Автор: | supercelt [ Сб янв 28, 2017 20:45:54 ] |
Заголовок сообщения: | Re: Разбор строки, пришедшей от модема. |
наверное потому что просто не сталкивался с необходимостью дербанить строки |
Автор: | uk8amk [ Сб янв 28, 2017 22:04:59 ] |
Заголовок сообщения: | Re: Разбор строки, пришедшей от модема. |
Начнём? Код: 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 предлагают. |
Автор: | supercelt [ Сб янв 28, 2017 23:36:04 ] |
Заголовок сообщения: | Re: Разбор строки, пришедшей от модема. |
в стрингах ничего особо-то и не предлагают. Ну я попробовал вот так: Код: 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); //То на экран выведется всё что после первых кавычек. } А как отловить вторые кавычки не знаю. Мне нужен индекс массива, что бы крутить его в цикле. А по указателю можно определить индекс элемента массива? |
Автор: | uk8amk [ Вс янв 29, 2017 00:55:28 ] |
Заголовок сообщения: | Re: Разбор строки, пришедшей от модема. |
Думается мне как-то так: Код: 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] = "\""; } И как определить конец строки? |
Автор: | просто КОТ [ Вс янв 29, 2017 00:59:17 ] |
Заголовок сообщения: | Re: Разбор строки, пришедшей от модема. |
В самом примитивном случае. Просто защищая себя от потери пары байт вначале строки: Код: 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 -- до этого момента однозначно должен был появиться знак " ![]() |
Автор: | supercelt [ Вс янв 29, 2017 18:14:15 ] |
Заголовок сообщения: | Re: Разбор строки, пришедшей от модема. |
Цитата: 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); } |
Автор: | pcb [ Вс янв 29, 2017 19:38:50 ] |
Заголовок сообщения: | Re: Разбор строки, пришедшей от модема. |
Без внешних либ, но не проверялось. Код: /* 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; //если номер найден, то прерываем цикл } |
Автор: | uk8amk [ Вс янв 29, 2017 20:40:25 ] |
Заголовок сообщения: | Re: Разбор строки, пришедшей от модема. |
supercelt писал(а): Годно? Нет. char number[] = ""; --- выделяется статически. |
Автор: | supercelt [ Вс янв 29, 2017 21:32:53 ] |
Заголовок сообщения: | Re: Разбор строки, пришедшей от модема. |
то есть надо так? Код: char number[11]; А чем плохо динамически? |
Автор: | uk8amk [ Пн янв 30, 2017 10:54:14 ] |
Заголовок сообщения: | Re: Разбор строки, пришедшей от модема. |
Ничем не плохо. Лишь за тем исключением, что динамическое выделение реализуется иными методами. А то что там было написано вылезало за границы и возможно портило чужую область памяти. Пока прога маленькая или не полностью протестирована это можно не заметить. |
Автор: | supercelt [ Пт фев 03, 2017 17:20:39 ] |
Заголовок сообщения: | Re: Разбор строки, пришедшей от модема. |
Слушайте, а если для интереса с регулярками поработать, для практики. Как их прикрутить к Keil? Где взять библиотеку для регулярок под Keil с мануалом? |
Автор: | hi-tower [ Чт фев 23, 2017 09:54:49 ] |
Заголовок сообщения: | Re: Разбор строки, пришедшей от модема. |
Автор, откройте для себя конечные автоматы, разбор таких строк станет ясным и простым. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |