Цитата(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';
}
}
}
//здесь нужно разрешить прерывания по приему байта, если они принимаются по прерыванию
}
Сделано в Китае. Упаковано в России.