اطلاعیه

Collapse
No announcement yet.

دریافت پیامک با sim 800 L

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    دریافت پیامک با sim 800 L

    با سلام خدمت همه ی دوستان .
    در مورد 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 چاپ می کند بی معنی است
لطفا صبر کنید...
X