Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: rx_buffer
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
digis14
посылаю в uart запрос на получение номера из телефона
приходит так AT+CPBR=1+CPBR: 1,"+79xxxxxxxxx",145,""OK
и помещается в буфер,причем помещается в буфер через раз непонятно почему
работаю с cvavr и proteus
вопрос
как мне проверить что есть плюс в номере, а также длинну и поместить сам номер в переменную ,или
поместить в eeprom чтоб я его мог в нужное время отправить обратно
_Bill
Цитата(digis14 @ Mar 5 2007, 16:37) *
посылаю в uart запрос на получение номера из телефона
приходит так AT+CPBR=1+CPBR: 1,"+79xxxxxxxxx",145,""OK
и помещается в буфер,причем помещается в буфер через раз непонятно почему
работаю с cvavr и proteus
вопрос
как мне проверить что есть плюс в номере, а также длинну и поместить сам номер в переменную ,или
поместить в eeprom чтоб я его мог в нужное время отправить обратно

Используйте функции работы со строками: strchr, strlen, ....
SasaVitebsk
Вопрос совершенно непонятен.
1) Длину можно посчитать.
2) плюс можно проконтролировать.
3) озу целиком - можно просмотреть в отладчике.

Непонятно что вы хотите. Уточните вопрос.
digis14
Цитата(SasaVitebsk @ Mar 5 2007, 16:55) *
Вопрос совершенно непонятен.
1) Длину можно посчитать.
2) плюс можно проконтролировать.
3) озу целиком - можно просмотреть в отладчике.

Непонятно что вы хотите. Уточните вопрос.



как посчитать , проконтролировать
в примерах
озу я вижу , но мне это ничего не дает т к не знаю как обратится к конкретному адресу
и взять там нужные данные т е +79xxxxxxxxx
beer_warrior
Работать с массивом как с операндом позволяет указатель.
Нужно использовать что-то наподобие:
Код
char *mystring = (char*)&rxbuf[0]
//Объявляем указатель на строку и присваиваем ему адрес первого элемента буфера
int len = strlen(mystring);
//Объявляем переменную и присваиваем ей длину принятой строки.

Остальных функций семейства string не помню. Посмотрите в справочнике.
Faradey
я бы на вашем месте смотрел с права на лево... скажем если получена ОК и кол-во бай в буфере не меньше заданного, тогда находим + и уже от него в правую сторону 12 цифр - это ваш искомый номер.
digis14
я не так много знаю чтоб реализовать это со слов
принцип понятен , но как это выглядит .......
пример нужен


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


вот например
указатель на строку это *mystring
(char*)&rxbuf[0] у меня наверное будет так (char*)&rx_buffer[0]
и я не понимаю где будет адрес первого элемента буфера
Faradey
вот так тоже можно:

Код
      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];
      }
digis14
переписал так
unsigned char rx_buffer[RX_BUFFER_SIZE]; //- пусть это ваш буфер приемник
unsigned char rx_wr_index; //-это индекс записи - куда будет записываться след. байт
unsigned char nomer[13]; //-сюда номер запишем
#define CALL_MODEM "+CPBR: \0" // -ответ модема

if(rx_wr_index>13 && strstr((char const*)&rx_buffer,"+CPBR: \0")) ???????
{//ПОСТУПИЛ ЗВОНОК
unsigned char i=1;
unsigned char j=0;
while(rx_buffer[rx_wr_index-i]!='+')
i--;//находим позицию плюса
for(;j<13;j++)//записываем номер
nomer[j] = rx_buffer[i+j];
}

там где знаки вопроса ошибка illegal address
char const*- почему const
Demeny
Цитата(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';
            }
         }
      }
//здесь нужно разрешить прерывания по приему байта, если они принимаются по прерыванию
}
digis14
[font=Arial]да ну и проблема . неужели все так сложно
в описанном выше варианте 5 ошибок вылетают
есть вот такой полный вариант под winavr , но тут pgmspace.h ,PROGMEM и подобные вещи ,
которых нет в cvavr. если можно отсюда взять что-то подскажите как
[/code]
/*
file: "main._c"
*/

#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <string.h>
#include "uart.h"

#define nop() {asm("nop");}

const char szATZ[] PROGMEM = "ATZ\x0d"; //Set to default configuration
const char szATE0[] PROGMEM = "ATE0\x0d"; //Дезактивировать ECHO команды
const char szATCPBS[] PROGMEM = "AT+CPBS=\"SM\"\x0d"; // выбираем записную книжку SIM
const char szATCPBR[] PROGMEM = "AT+CPBR=1\x0d"; // читаем из 1й ячейки SIM
const char szATE1[] PROGMEM = "ATE1\x0d"; // Активизирoвать ECHO команды
const char szATCMGS[] PROGMEM = "AT+CMGS=56\x0d"; // начинаем слать SMS
const char szATSMSStart[] PROGMEM = "0011000B91"; // заголовок СМС

//ТРЕВОГА! Ударный дат.
//0011000B919712674523F10008AA2A0422042004150412041E041304100021002004230434043004
40043D044B04390020043404300442002E
const char szSMSShock[] PROGMEM = "0008AA2A0422042004150412041E04130410002100200423043404300440043D044B0439002
0043404300442002E\x1a\x0d";
//ТРЕВОГА! Багажник.
//0011000B919712674523F10008AA2A0422042004150412041E041304100021002000200020002004
110430043304300436043D0438043A002E
//ТРЕВОГА!Откр.Багажник
//0011000B919712674523F10008AA2A0422042004150412041E041304100021041E0442043A044000
2E04110430043304300436043D0438043A
const char szSMSTrunk[] PROGMEM = "0008AA2A0422042004150412041E041304100021041E0442043A0440002E041104300433043
00436043D0438043A\x1a\x0d";

//ТРЕВОГА! Откр. двери.
//0011000B919712674523F10008AA2A0422042004150412041E0413041000210020041E0442043A04
40002E002004340432043504400438002E
const char szSMSDoors[] PROGMEM = "0008AA2A0422042004150412041E0413041000210020041E0442043A0440002E00200434043
2043504400438002E\x1a\x0d";

//ТРЕВОГА! Откр. капот.
//0011000B919712674523F10008AA2A0422042004150412041E0413041000210020041E0442043A04
40002E0020043A0430043F043E0442002E
const char szSMSHood[] PROGMEM = "0008AA2A0422042004150412041E0413041000210020041E0442043A0440002E0020043A043
0043F043E0442002E\x1a\x0d";

//Внимание! Нет питания
//0011000B919712674523F10008AA2A0412043D0438043C0430043D0438043500210020041D043504
420020043F043804420430043D0438044F
const char szSMSPower[] PROGMEM = "0008AA2A0412043D0438043C0430043D0438043500210020041D043504420020043F0438044
20430043D0438044F\x1a\x0d";

char szSMSRecipientNumber[15] = "+78121234567"; // в полном формате

void SendSMS(char cause);
void Init(void);
char Send_Receive(PGM_P pSend, int nBytes); // nBytes = 0 - тогда посылать до конца строки=0
void DiagOut(unsigned char n);
void wait_1ms(unsigned char ms);
void wait_1s(unsigned char s);

/*
Возврат Send_Receive:
0 = OK
1 = ERROR
2 = timeout
3 - неизвестное сообщение
*/

int main(void)
{
Init();

DiagOut(1);

while(1)
{
wait_1ms(250);

if(Send_Receive(szATZ, 0) != 0)
{
char i=8;
while(i--)
wait_1ms(250);
DiagOut(2);
continue;
}
// else DiagOut(0x82);

if(Send_Receive(szATE0, 0) != 0)
DiagOut(2);

//================AT+CPBS="SM"===получаем доступ к сим ======
if(Send_Receive(szATCPBS, 0) != 0)
DiagOut(3);
// else DiagOut(0x83);

// получим ответ типа OK

//================AT+CPBR=1 ===читаем из 1 ячейки ======
UART_ClearRxBuf();
UART_outstr_P(szATCPBR);
// получим ответ типа +CPBR: 1,"+79217444347",145," "\x0dOK
wait_1ms(250);
wait_1ms(250);

char nRecv = 0;
char* pBuf = UART_Recv(&nRecv);
if(nRecv < 12)
{
DiagOut(4); // нет номера
continue;
}
// else DiagOut(nRecv+0x80);

unsigned char cp = 0;
while(pBuf[cp])
{
if(pBuf[cp]=='O')
{
DiagOut(4);
cp = 240; // признак ошибки
break;
}
if(pBuf[cp]=='B') // +CPBR
{
DiagOut(0x81);
break;
}
cp++;
}
if(cp > 128)
continue; // ошибка

while(pBuf[cp])
{
if(pBuf[cp]=='\"' && pBuf[cp+1]=='+'/* && pBuf[cp+13]=='\"'*/)
{
// нашли "+
szSMSRecipientNumber[0] = pBuf[cp+1+2]; // 8
szSMSRecipientNumber[1] = pBuf[cp+1+1]; // 7
szSMSRecipientNumber[2] = pBuf[cp+1+4]; // 2
szSMSRecipientNumber[3] = pBuf[cp+1+3]; // 1
szSMSRecipientNumber[4] = pBuf[cp+1+6]; // 0
szSMSRecipientNumber[5] = pBuf[cp+1+5]; // 9
szSMSRecipientNumber[6] = pBuf[cp+1+8]; // 4
szSMSRecipientNumber[7] = pBuf[cp+1+7]; // 3
szSMSRecipientNumber[8] = pBuf[cp+1+10]; // 6
szSMSRecipientNumber[9] = pBuf[cp+1+9]; // 5
szSMSRecipientNumber[10] = 0x46; // F
szSMSRecipientNumber[11] = pBuf[cp+1+11]; // 7
szSMSRecipientNumber[12] = 0; // EOS
DiagOut(0x82);
cp = 241;
break;
}
cp++;
}

if(cp < 220)
{
DiagOut(5); // нет плюса в номере
continue;
}

// теперь рабочий цикл
unsigned char FirstRun = 1;
unsigned char CountLED = 0;
while(1)
{
while(bit_is_set(PIND, 6))
{
if(FirstRun > 100)
{
cbi(PORTB,7);
FirstRun = 1;
}
wait_1ms(100);
sbi(PORTB,7);
FirstRun++;
}
wait_1ms(50); // защита от дребезга
if(bit_is_set(PIND, 6))
continue;

if(FirstRun) // если только что поставили на охрану
{
wait_1s(10); // ждем 10 секунд перед постановкой на охрану
FirstRun = 0;
}

// помигиваем светодиодом
if(++CountLED & 0x8)
cbi(PORTB,7);
else
sbi(PORTB,7);

// опрос шлейфов
char i;
for(i=2; i<6; i++)
{
if(bit_is_clear(PIND, i))
{
char c;
for(c = 0; c<5; c++)
{
wait_1ms(40); // защита от дребезга
if(bit_is_set(PIND, i))
break;
}
if(c == 5) // все 5 раз шлейф был замкнут на землю
{
if(i == 4) // двери - ждем 5 с
{
wait_1s(5);
if(bit_is_set(PIND, 6)) // если за это время выключили охрану
continue; // ничего не посылаем
}
SendSMS(i);
continue;
}
}
}

if(bit_is_clear(PINB, 2)) // питание
{
wait_1ms(200); // защита от дребезга
wait_1ms(200); // защита от дребезга
wait_1ms(200); // защита от дребезга
if(bit_is_clear(PINB, 2))
{
SendSMS(11); // питание пропало!
continue;
}
}
}// while(1)
} // while(1)

return 0;
}


void Init(void)
{
DDRB = 0x80; // Нога 19 - выход, светодиод
DDRD = 2; // остальные - входы, TX = выход
PORTB = 0x7f;
PORTD = 0xfd;
UART_Init();
}

char Send_Receive(PGM_P pSend, int nBytes)
{
char timer = 0;

UART_ClearRxBuf();

UART_outstr_P(pSend);

// wait_1ms(250);

for(timer = 0; timer < 10; timer++)
{
char n = 0;

wait_1ms(150);

char* pBuf = UART_Recv(&n);
if(strchr(pBuf, 0x0d)) // если есть конец строки
{
if(strstr(pBuf, "OK"))
return 0;
if(strstr(pBuf, "ERROR"))
return 1;
return 3; // неизвестная ошибка
}
}

return 2; // timeout
}

// старший бит указывает на то, что вспышки д.б. короткими
void DiagOut(unsigned char n)
{
unsigned char len = 150;
if(n&0x80)
len = 50;

while(n&0x7f)
{
cbi(PORTB,7);
wait_1ms(len-20);
sbi(PORTB,7);
wait_1ms(len);
n--;
}
wait_1s(1);
}


void SendSMS(char cause)
{
PGM_P psz = NULL;
switch(cause)
{
case 2: // удар
psz = szSMSShock;
break;
case 3: // багажник
psz = szSMSTrunk;
break;
case 4: // двери
psz = szSMSDoors;
break;
case 5: // капот
psz = szSMSHood;
break;
case 11: // пропало питание
psz = szSMSPower;
break;
default:
break;
}

if(psz) // если аргумент правильный
{
// отправляем SMS
UART_ClearRxBuf();
UART_outstr_P(szATCMGS); // начинаем отправку
char n = 0;
unsigned char nLoops = 0;
char* p = NULL;
while(!n)
{
wait_1ms(10);
p = UART_Recv(&n); // от трубы должен прийти знак ">"
if(++nLoops > 150)
{
DiagOut(2); // нет подтверждения от трубы
break;
}
}
if(*p != '>' && p[1] != '>' && p[2] != '>')
{
DiagOut(3); // нет подтверждения от трубы
}
else
{
UART_outstr_P(szATSMSStart); // 0001000B91
UART_outstr(szSMSRecipientNumber); // номер подготовлен заранее
UART_outstr_P(psz); // строка СМС подготовлена заранее, 0х1а в конце
cbi(PORTB,7);
wait_1s(150);
wait_1s(150);
sbi(PORTB,7);
}
}
}

/*
void SendStr(char * s)
{
while(pgm_read_byte(s)) Send(pgm_read_byte(s++));
}
*/

void wait_1ms(unsigned char ms)
{
while(ms)
{
short int i;
for(i=0; i<560; i++)
inp(PINB);
ms--;
}
}

void wait_1s(unsigned char sec)
{
while(sec)
{
wait_1ms(250);
wait_1ms(250);
wait_1ms(250);
wait_1ms(250);
sec--;
}
}


#define SIZERX 32
char arRx[SIZERX];
unsigned char posRx = 0;

// прерывание происходит по приходу байта
SIGNAL(SIG_UART_RECV)
{
arRx[posRx] = inp(UDR);
posRx++;
if(posRx >= SIZERX)
posRx--;
}


void UART_Init(void)
/* initialize uart */
{
/* enable RxD/TxD and ints */
outp((1<<RXCIE)|/*(1<<TXCIE)|*/(1<<RXEN)|(1<<TXEN),UCR);
/* set baud rate */
outp((unsigned char)UART_BAUD_SELECT, UBRR);
}

void UART_outstr_P(PGM_P str)
{
unsigned char i = 0;
while(1)
{
char c = pgm_read_byte(&str[i]);
if(!c)
break;
outp(c, UDR);
loop_until_bit_is_set(USR, UDRE);
i++;
}
}

void UART_outstr(char* psz)
{
unsigned char i = 0;
while(1)
{
char c = psz[i];
if(!c)
break;
outp(c, UDR);
loop_until_bit_is_set(USR, UDRE);
i++;
}
}

char* UART_Recv(char* pnRecv)
{
*pnRecv = posRx;
return arRx;
}

void UART_ClearRxBuf(void)
{
// unsigned char i;
cli();
memset(arRx, 0, SIZERX);
/* arRx[0] = 0;
arRx[1] = 0;
arRx[2] = 0;
arRx[3] = 0;
arRx[4] = 0;
arRx[5] = 0;
arRx[6] = 0;
arRx[7] = 0;
arRx[8] = 0;
arRx[9] = 0;
arRx[10] = 0;
arRx[11] = 0;
arRx[12] = 0;
arRx[13] = 0;
arRx[14] = 0;
arRx[15] = 0;
arRx[16] = 0;
arRx[17] = 0;
arRx[18] = 0;
arRx[19] = 0;
arRx[20] = 0;
arRx[21] = 0;
arRx[22] = 0;
arRx[23] = 0;
arRx[24] = 0;
arRx[25] = 0;
arRx[26] = 0;
arRx[27] = 0;
arRx[28] = 0;
arRx[29] = 0;
arRx[30] = 0;
arRx[31] = 0;*/
posRx = 0;
sei();
}
[code]
Demeny
Цитата(digis14 @ Mar 6 2007, 12:32) *
да ну и проблема . неужели все так сложно
в описанном выше варианте 5 ошибок вылетают
есть вот такой полный вариант под winavr , но тут pgmspace.h ,PROGMEM и подобные вещи ,
которых нет в cvavr. если можно отсюда взять что-то подскажите как

Ну, батенька, что же Вы хотите - чтобы за Вас всю работу проделали специалисты форума?
А что за ошибки дает компилятор на мой кусок кода?
digis14
разобраться бы что это
char* pBuf = UART_Recv(&nRecv);
и это
char Send_Receive(PGM_P pSend, int nBytes);
в коде выше

ошибки

if((rx_wr_index>13) && strstr((const char*)rx_buffer, CALL_MODEM))

parameter #1 of type 'flash unsigned char *[]' is incompatible with type 'unsigned char *' specified in the function 'strstr' declaration


if((rx_buffer[i+j])<'0') || (rx_buffer[i+j])>'9'))

invalid expression

if ((rx_buffer[i+k)>='0') && (rx_buffer[i+k])<='9'))

missing ']'
если сделать так

if ((rx_buffer[i+k]>='0') && (rx_buffer[i+k])<='9'))
то invalid expression

else

no matching if
Demeny
Цитата(digis14 @ Mar 6 2007, 21:00) *
ошибки

if((rx_wr_index>13) && strstr((const char*)rx_buffer, CALL_MODEM))

parameter #1 of type 'flash unsigned char *[]' is incompatible with type 'unsigned char *' specified in the function 'strstr' declaration


if((rx_buffer[i+j])<'0') || (rx_buffer[i+j])>'9'))

invalid expression

if ((rx_buffer[i+k)>='0') && (rx_buffer[i+k])<='9'))

missing ']'
если сделать так

if ((rx_buffer[i+k]>='0') && (rx_buffer[i+k])<='9'))
то invalid expression

else

no matching if

Мда, что ж тут непонятного ? Скажите мне, как программист программисту, уж не одинаковым ли должно быть количество открывающих и закрывающих скобок? Да, когда я писал этот пример, возможно, где-то наставил лишних скобок - ну нельзя же воспринимать пример символ-в-символ.
Должно быть так.
Код
if  (  (  rx_buffer[i+j] < '0')   ||   (  rx_buffer[i+j]  >'9'  )  )
...................................................
if  (  (  rx_buffer[i+k] >=  '0'  ) &&  (  rx_buffer[i+k]  <=  '9')  )

Что касается первой ошибки - тут дело в приведении типов аргументов. Видимо, функция strstr(...) в Вашей версии компилятора требует в качестве первого параметра указатель на unsigned char. Ну дык и сделайте такое приведение
Код
if  (  (rx_wr_index>13) &&  strstr(  (unsigned char*)rx_buffer, CALL_MODEM  )  )
digis14
вот так вот сделал
Код
#include <90s2313.h>
#include <delay.h>
// Standard Input/Output functions
#include <stdio.h>

#define SIZERX 32
char arRx[SIZERX];
unsigned char posRx = 0;

interrupt [UART_RXC] void uart_rx_isr(void)
{
char data;
data=UDR;
arRx[posRx] = data;
posRx++;                              // +1 следующий регистр
if(posRx >= SIZERX)        // если posRx больше или равно SIZERX
posRx--;          
}
// Declare your global variables here

char* UART_Recv(char* pnRecv)
{
    *pnRecv = posRx;
    return arRx;
}

char szSMSRecipientNumber[15] = "+78121234567"; // в полном формате

void main(void)
{
// Declare your local variables here

PORTB=0xFF;
DDRB=0xFF;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
OCR1H=0x00;
OCR1L=0x00;
GIMSK=0x00;
MCUCR=0x00;
TIMSK=0x00;
UCR=0x18;
UBRR=0x17;
ACSR=0x80;
//===================================================================
{              
                unsigned char cp = 0;
                char nRecv = 0;
        char* pBuf = UART_Recv(&nRecv);
        if(nRecv < 12)
        {
            //DiagOut(4); // нет номера
            //continue;
        }
//        else DiagOut(nRecv+0x80);

        //unsigned char cp = 0;
        while(pBuf[cp])
        {
            if(pBuf[cp]=='O')
            {
                //DiagOut(4);
                cp = 240; // признак ошибки
                break;
            }
            if(pBuf[cp]=='B') // +CPBR
            {
                //DiagOut(0x81);
                break;
            }
            cp++;
        }
        if(cp > 128)
            //continue; // ошибка

        while(pBuf[cp])
        {
            if(pBuf[cp]=='\"' && pBuf[cp+1]=='+'/* && pBuf[cp+13]=='\"'*/)
            {
                // нашли "+
                szSMSRecipientNumber[0] = pBuf[cp+1+2]; // 8
                szSMSRecipientNumber[1] = pBuf[cp+1+1]; // 7
                szSMSRecipientNumber[2] = pBuf[cp+1+4]; // 2
                szSMSRecipientNumber[3] = pBuf[cp+1+3]; // 1
                szSMSRecipientNumber[4] = pBuf[cp+1+6]; // 0
                szSMSRecipientNumber[5] = pBuf[cp+1+5]; // 9
                szSMSRecipientNumber[6] = pBuf[cp+1+8]; // 4
                szSMSRecipientNumber[7] = pBuf[cp+1+7]; // 3
                szSMSRecipientNumber[8] = pBuf[cp+1+10]; // 6
                szSMSRecipientNumber[9] = pBuf[cp+1+9]; // 5
                szSMSRecipientNumber[10] = 0x46; // F
                szSMSRecipientNumber[11] = pBuf[cp+1+11]; // 7
                szSMSRecipientNumber[12] = 0; // EOS
                //DiagOut(0x82);
                cp = 241;
                break;
            }
            cp++;
        }
}        
//=======================================================================
while (1)
      {
      // Place your code here

      };
}

ошибка вылетает вот здесь char* pBuf = UART_Recv(&nRecv);
non-address/-constant initializer
что ему надо ?
digis14
новый вариант и причем работает
Код
/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.2 Beta1 Standard
Automatic Program Generator
© Copyright 1998-2006 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date    : 07.03.2007
Author  : 123                            
Company : 123                            
Comments:


Chip type           : AT90S2313
Clock frequency     : 3,680000 MHz
Memory model        : Tiny
External SRAM size  : 0
Data Stack size     : 32
*****************************************************/
#include <90s2313.h>
#include <delay.h>

#define RXB8 1
#define TXB8 0
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7

#define FRAMING_ERROR (1<<FE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)

// UART Receiver buffer
#define RX_BUFFER_SIZE 48
char rx_buffer[RX_BUFFER_SIZE];

#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif

// This flag is set on UART Receiver buffer overflow
bit rx_buffer_overflow;

// UART Receiver interrupt service routine
interrupt [UART_RXC] void uart_rx_isr(void)
{
char status,data;
status=USR;
data=UDR;
if ((status & (FRAMING_ERROR | DATA_OVERRUN))==0)
   {
   rx_buffer[rx_wr_index]=data;
   if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
   if (++rx_counter == RX_BUFFER_SIZE)
      {
      rx_counter=0;
      rx_buffer_overflow=1;
      };
   };
}

#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the UART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif

// Standard Input/Output functions
#include <stdio.h>

// Declare your global variables here
//=====================================================================
const char szATZ[] = "ATZ\x0d";     //Set to default configuration
const char szATE0[] = "ATE0\x0d";    //Дезактивировать ECHO команды
const char szATCPBS[] = "AT+CPBS=\"SM\"\x0d"; // выбираем записную книжку SIM
const char szATCPBR[] = "AT+CPBR=1\x0d"; // читаем из 1й ячейки SIM
const char szATE1[] = "ATE1\x0d";   // Активизирoвать ECHO команды
const char szATCMGS[] = "AT+CMGS=56\x0d"; // начинаем слать SMS
const char szATSMSStart[] = "0011000B91"; // заголовок СМС

//char arRx[16];
//unsigned char posRx = 0;

char* UART_Recv(char* pnRecv)
{
    *pnRecv = 0;
    return rx_buffer;//arRx;
}

char szSMSRecipientNumber[15] = "555555555555"; // в полном формате
char cp = 0;
char nRecv=0;
char *pBuf;
int main(void)
{
// Declare your local variables here
char e=0;

// Input/Output Ports initialization
// Port B initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTB=0xFF;
DDRB=0xFF;

// Port D initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1 output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
OCR1H=0x00;
OCR1L=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
GIMSK=0x00;
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// UART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// UART Receiver: On
// UART Transmitter: On
// UART Baud rate: 9600
UCR=0x98;
UBRR=0x17;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;

// Global enable interrupts
#asm("sei")
//===================================================================

delay_ms(500);
putsf("ATE0\x0d");  
//delay_ms(100);
//putsf("AT+CPBR=1\x0d");  
delay_ms(500);

//#asm("cli")
//memset(arRx, 0, 32);
//delay_ms(1000);
//#asm("sei")  
putsf("AT+CPBR=1\x0d");
UCR.4=1;
PORTB|=UCR;
delay_ms(2500);
//UCR.4=1;
//========================================================================
        pBuf= UART_Recv(&nRecv);
                delay_ms(50);
        while(pBuf[cp])
        {          
         PORTB.1=0;
            if(pBuf[cp]=='+' && pBuf[cp+1]=='7')//&& pBuf[cp+2]=='9')
            {
                // нашли "+
                PORTB.2=0;
                szSMSRecipientNumber[0] = pBuf[cp]; // 8
                szSMSRecipientNumber[1] = pBuf[cp+1]; // 7
                szSMSRecipientNumber[2] = pBuf[cp+2]; // 2
                szSMSRecipientNumber[3] = pBuf[cp+3]; // 1
                szSMSRecipientNumber[4] = pBuf[cp+4]; // 0
                szSMSRecipientNumber[5] = pBuf[cp+5]; // 9
                szSMSRecipientNumber[6] = pBuf[cp+6]; // 4
                szSMSRecipientNumber[7] = pBuf[cp+7]; // 3
                szSMSRecipientNumber[8] = pBuf[cp+8]; // 6
                szSMSRecipientNumber[9] = pBuf[cp+9]; // 5
                szSMSRecipientNumber[10] = pBuf[cp+10]; // 5
                szSMSRecipientNumber[11] = pBuf[cp+11]; // 5
                //szSMSRecipientNumber[10] = 0x46; // F
                //szSMSRecipientNumber[11] = pBuf[cp+1+11]; // 7
                szSMSRecipientNumber[12] = 0; // EOS
                //DiagOut(0x82);
                 //d--;
                 PORTB.3=0;
                //cp = 241;
                e++;
                break;
                
            }  
            cp++;
            

  
  
          
//=======================================================================
      
    {
      char i=0;
      while (1)    
      {  
      if (i>15)i=0;  //проверка выхода за пределы массива
      putchar(szSMSRecipientNumber[i]);//выводим символ i раз через UART
      i++;
      if(i==15)
      break;      
      };  
    }  
     // while(1){}
    

  
  return;
}


правильно ли я сделал

из char* pBuf = UART_Recv(&nRecv);

char* pBuf ;
pBuf = UART_Recv(&nRecv);
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.