با سلام خدمت همه ی دوستان .
در مورد sim800l سوال دارم.در دریافت پیامک مشکل دارم.کد زیر را نوشته ام:
[LEFT]#include <mega32a.h>

// Alphanumeric LCD functions
#include <alcd.h>

#include <delay.h>
#include <string.h>

#define ctrl_z 0x1a
#define enter 0x0d

// char ATE0[]={"ATE0"};
char *pch=NULL;
char i=0,temp, receive_flag=0,buffer_flag=0,start_flag =1 , mobile_num[]={"091000000"};
//char cmgda[]= {'A','T','+','C','M','G','D','A','=','"','D','E','L',' ','A','L','L','"','\r'};
//char cmgr[]= {"AT+CMGR="};

char call(void);



#ifndef RXB8
#define RXB8 1
#endif

#ifndef TXB8
#define TXB8 0
#endif

#ifndef UPE
#define UPE 2
#endif

#ifndef DOR
#define DOR 3
#endif

#ifndef FE
#define FE 4
#endif

#ifndef UDRE
#define UDRE 5
#endif

#ifndef RXC
#define RXC 7
#endif

#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<DOR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)

// USART Receiver buffer
#define RX_BUFFER_SIZE 248
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 USART Receiver buffer overflow
bit rx_buffer_overflow;

// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index++] = data;
#if RX_BUFFER_SIZE == 256
// special case for receiver buffer size=256
if (++rx_counter == 0)
rx_buffer_overflow=1;
#else
if (rx_wr_index == RX_BUFFER_SIZE)
rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
}
#endif
}
}

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

// USART Transmitter buffer
#define TX_BUFFER_SIZE 40
char tx_buffer[TX_BUFFER_SIZE];

#if TX_BUFFER_SIZE <= 256
unsigned char tx_wr_index,tx_rd_index,tx_counter;
#else
unsigned int tx_wr_index,tx_rd_index,tx_counter;
#endif

// USART Transmitter interrupt service routine
interrupt [USART_TXC] void usart_tx_isr(void)
{
if (tx_counter)
{
--tx_counter;
UDR=tx_buffer[tx_rd_index++];
#if TX_BUFFER_SIZE != 256
if (tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
#endif
}
}

#ifndef _DEBUG_TERMINAL_IO_
// Write a character to the USART Transmitter buffer
#define _ALTERNATE_PUTCHAR_
#pragma used+
void putchar(char c)
{
while (tx_counter == TX_BUFFER_SIZE);
#asm("cli")
if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0))
{
tx_buffer[tx_wr_index++]=c;
#if TX_BUFFER_SIZE != 256
if (tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
#endif
++tx_counter;
}
else
UDR=c;
#asm("sei")
}
#pragma used-
#endif


// External Interrupt 2 service routine
interrupt [EXT_INT2] void ext_int2_isr(void)
{
rx_wr_index=0;
delay_ms(250);
if(PINB.2==1)
{
receive_flag=1;
}
if(PINB.2==0) receive_flag=0;
}



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

// Declare your global variables here

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

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

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


// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: On
// INT2 Mode: Falling Edge
GICR|=0x20;
MCUCR=0x00;
MCUCSR=0x00;
GIFR=0x20;


// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 56000
UCSRA=0x00;
UCSRB=0xD8;
UCSRC=0x06;
UBRRH=0x00;
UBRRL=0x08;

// Alphanumeric LCD initialization
// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTB Bit 0
// RD - PORTB Bit 1
// EN - PORTB Bit 3
// D4 - PORTB Bit 4
// D5 - PORTB Bit 5
// D6 - PORTB Bit 6
// D7 - PORTB Bit 7
// Characters/line: 20
lcd_init(20);


printf("AT");
delay_ms(100);
putchar(enter);
delay_ms(100);
printf("AT+CMGF=1");
putchar(enter);
delay_ms(100);
//echo off
printf("ATE0&W");
putchar(enter);
printf("AT+CMGDA=\"DEL ALL\"");
putchar(enter);
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts("start");
delay_ms(3000);
// delete receive buffer
printf("AT");
delay_ms(100);
putchar(enter);
delay_ms(100);
for(i=0; i<=248; i++)
{
rx_buffer[i]=0;
}

lcd_clear();
lcd_gotoxy(0,0);
lcd_puts("start2");
delay_ms(3000);

//calling
temp=call();
delay_ms(3000);
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts("call");
delay_ms(2000);

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


rx_wr_index=0;
start_flag =1;
while (1)
{
if(receive_flag == 1 && start_flag == 0)
{
rx_wr_index=0;
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts("sms");
delay_ms(3000);
lcd_clear();
for(i=0; i<11; i++)
{
lcd_gotoxy(i, 1);
lcd_putchar(rx_buffer[i]);
delay_ms(100);
}
lcd_gotoxy(5, 0);
lcd_puts("sms");
delay_ms(2000);
while(pch==NULL)
{
pch=strstr(rx_buffer,"SM");

}

lcd_clear();
lcd_gotoxy(0,0);
lcd_puts("find");
delay_ms(3000);
/* printf("AT+CMGR=");
putchar(pch[4]);
putchar(enter);
rx_wr_index=0;
pch=NULL;
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts("search on");
delay_ms(3000);
while(pch==NULL)
{
pch=strstr(rx_buffer,"on");

}
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts("on finde");
delay_ms(4000);

// delete receive buffer */
for(i=0; i<=248; i++)
{
rx_buffer[i]=0;
}

receive_flag =0;
rx_wr_index=0;

}
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts("while");
start_flag =0;
delay_ms(1000);
}
}



char call(void)
{
char response[5];
printf("AT");
delay_ms(100);
putchar(enter);
delay_ms(100);
printf("ATD%s;",mobile_num);
delay_ms(100);
putchar(enter);
gets(response,2);
delay_ms(100);
if(strcmp(response,"ER")==1)
{
return 0;
}
else return 1;



}
[/LEFT]


تابع اخر برنامه را برای تماس نوشتم این طور که در اغاز یک تماس با شماره مشخصی می گیرد.این قسمت به خوبی کار میکند
اما وقتی پیامکی به ماژول می فرستم درون حلقه while ای که مربوط به پیدا کردن SM (طبق دیتا شیت ماژول پس از دریافت پیامک این پیام را به میکرو باید ارسال کند +CMTI: "SM",1 که عدد، شماره خانه ایست که پیامک در ان ذخیره شده ، باید ان را استخراج کرد و دوباره به ماژول فرستاد)می باشد گیر میکند.
ممنون می شوم کمک کنید برنامه را اصلاح کنم یا برنامه بهتری پیشنهاد دهید.
در ضمن کاراکتر هایی را هم که در خط 305 چاپ می کند بی معنی است