|
rx_buffer, как взять данные по определенному адресу |
|
|
|
Mar 5 2007, 16:37
|
Группа: Новичок
Сообщений: 8
Регистрация: 30-09-06
Пользователь №: 20 838

|
посылаю в uart запрос на получение номера из телефона приходит так AT+CPBR=1+CPBR: 1,"+79xxxxxxxxx",145,""OK и помещается в буфер,причем помещается в буфер через раз непонятно почему работаю с cvavr и proteus вопрос как мне проверить что есть плюс в номере, а также длинну и поместить сам номер в переменную ,или поместить в eeprom чтоб я его мог в нужное время отправить обратно
Сообщение отредактировал digis14 - Mar 5 2007, 16:37
|
|
|
|
|
Mar 5 2007, 16:44
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(digis14 @ Mar 5 2007, 16:37)  посылаю в uart запрос на получение номера из телефона приходит так AT+CPBR=1+CPBR: 1,"+79xxxxxxxxx",145,""OK и помещается в буфер,причем помещается в буфер через раз непонятно почему работаю с cvavr и proteus вопрос как мне проверить что есть плюс в номере, а также длинну и поместить сам номер в переменную ,или поместить в eeprom чтоб я его мог в нужное время отправить обратно Используйте функции работы со строками: strchr, strlen, ....
|
|
|
|
|
Mar 5 2007, 17:23
|
Группа: Новичок
Сообщений: 8
Регистрация: 30-09-06
Пользователь №: 20 838

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

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
Работать с массивом как с операндом позволяет указатель. Нужно использовать что-то наподобие: Код char *mystring = (char*)&rxbuf[0] //Объявляем указатель на строку и присваиваем ему адрес первого элемента буфера int len = strlen(mystring); //Объявляем переменную и присваиваем ей длину принятой строки. Остальных функций семейства string не помню. Посмотрите в справочнике.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Mar 5 2007, 19:29
|
Частый гость
 
Группа: Свой
Сообщений: 127
Регистрация: 31-05-06
Из: Belarus, Minsk
Пользователь №: 17 638

|
я бы на вашем месте смотрел с права на лево... скажем если получена ОК и кол-во бай в буфере не меньше заданного, тогда находим + и уже от него в правую сторону 12 цифр - это ваш искомый номер.
--------------------
Завтра пойму, что нужно было сделать вчера...
|
|
|
|
|
Mar 5 2007, 19:42
|
Группа: Новичок
Сообщений: 8
Регистрация: 30-09-06
Пользователь №: 20 838

|
я не так много знаю чтоб реализовать это со слов принцип понятен , но как это выглядит ....... пример нужен
char *mystring = (char*)&rxbuf[0]
вот например указатель на строку это *mystring (char*)&rxbuf[0] у меня наверное будет так (char*)&rx_buffer[0] и я не понимаю где будет адрес первого элемента буфера
|
|
|
|
|
Mar 5 2007, 20:12
|
Частый гость
 
Группа: Свой
Сообщений: 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]; }
--------------------
Завтра пойму, что нужно было сделать вчера...
|
|
|
|
|
Mar 5 2007, 20:59
|
Группа: Новичок
Сообщений: 8
Регистрация: 30-09-06
Пользователь №: 20 838

|
переписал так 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
|
|
|
|
|
Mar 6 2007, 11:30
|

Знающий
   
Группа: Свой
Сообщений: 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'; } } } //здесь нужно разрешить прерывания по приему байта, если они принимаются по прерыванию }
--------------------
Сделано в Китае. Упаковано в России.
|
|
|
|
|
Mar 6 2007, 12:32
|
Группа: Новичок
Сообщений: 8
Регистрация: 30-09-06
Пользователь №: 20 838

|
[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]
Сообщение отредактировал digis14 - Mar 6 2007, 12:35
|
|
|
|
|
Mar 6 2007, 14:48
|

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

|
Цитата(digis14 @ Mar 6 2007, 12:32)  да ну и проблема . неужели все так сложно в описанном выше варианте 5 ошибок вылетают есть вот такой полный вариант под winavr , но тут pgmspace.h ,PROGMEM и подобные вещи , которых нет в cvavr. если можно отсюда взять что-то подскажите как Ну, батенька, что же Вы хотите - чтобы за Вас всю работу проделали специалисты форума? А что за ошибки дает компилятор на мой кусок кода?
--------------------
Сделано в Китае. Упаковано в России.
|
|
|
|
|
Mar 6 2007, 21:00
|
Группа: Новичок
Сообщений: 8
Регистрация: 30-09-06
Пользователь №: 20 838

|
разобраться бы что это 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
Сообщение отредактировал digis14 - Mar 6 2007, 21:25
|
|
|
|
|
Mar 7 2007, 09:50
|

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

|
Цитата(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 ) )
--------------------
Сделано в Китае. Упаковано в России.
|
|
|
|
|
Mar 7 2007, 14:01
|
Группа: Новичок
Сообщений: 8
Регистрация: 30-09-06
Пользователь №: 20 838

|
вот так вот сделал Код #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 что ему надо ?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|