اطلاعیه

Collapse
No announcement yet.

دریافت اس ام اس با sim900 و میکرو (مشکل در جداسازی شماره و پیام دریافتی)

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

    دریافت اس ام اس با sim900 و میکرو (مشکل در جداسازی شماره و پیام دریافتی)

    سلام
    برنامه رو طوری نوشتم که وقتی اس ام اس دریافت میشه شماره فرستنده و پیام رو تو دوتا آرایه جدا گانه ذخیره کنه و در صورت زدن شاستی اونهارو روی ال سی دی نمایش بده.

    ذخیره شماره به درستی انجام میشه ولی پیام نه!
    وقتی تعداد تکرار در خوندن (حلقه for) رو بین 5 تا 16 میزارم برنامه تو همون خطی که پایینتر نوشتم گیر میکنه!
    ولی اگه مثلا 3 باشه 3 کاراکتر اول پیامو به خوبی روی ال سی دی نمایش میده
    کد:
    for(i=0;i<3;i++)
    message[i]=getchar();
    چون مطمئنم تو همین خط گیر میکنه احتمالا مشکل از بافر گیرنده سریال باشه، بازم مطمئن نیستم
    اگه از دوستان کسی به این مشکل برخورده یا اطلاع داره ممنون میشم راهنمایی بکنه
    خیلی اعصابمو خورد کرده

    کد:
    /*****************************************************
    This program was produced by the
    CodeWizardAVR V2.05.0 Professional
    Automatic Program Generator
    © Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
    http://www.hpinfotech.com
    
    Project : 
    Version : 
    Date  : 5/6/2014
    Author : NeVaDa
    Company : 
    Comments: 
    
    
    Chip type        : ATmega8
    Program type      : Application
    AVR Core Clock frequency: 8.000000 MHz
    Memory model      : Small
    External RAM size    : 0
    Data Stack size     : 256
    *****************************************************/
    
    #include <mega8.h>
    
    // Alphanumeric LCD Module functions
    #include <alcd.h>
    
    #define enter 13
    #define dq 34
    
    #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 128
    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)
       {
    #else
      if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
      if (++rx_counter == RX_BUFFER_SIZE)
       {
       rx_counter=0;
    #endif
       rx_buffer_overflow=1;
       }
      }
    }
    
    #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
    
    // Standard Input/Output functions
    #include <stdio.h>
    #include <stdlib.h>
    #include <delay.h>
    
    // Declare your global variables here
    unsigned char i,buffer,number[16],message[16];
    ------------------------------------------------------------------------------------------
    void wait_to_get(char ch)
    {
    while(ch != getchar());
    }
    ------------------------------------------------------------------------------------------
    void read_sms()
    {
    lcd_clear();
    lcd_gotoxy(0,0);
    lcd_putsf("1 new message");
    
    wait_to_get('"');
     
    for(i=0;i<13;i++)
    number[i]=getchar();
    
    wait_to_get('\n');
    
    for(i=0;i<3;i++)
    message[i]=getchar();
    
    while(PIND.5);
    
    lcd_clear();
    lcd_gotoxy(0,0);
    lcd_puts(number);
    lcd_gotoxy(0,1);
    lcd_puts(message);
    }
    ------------------------------------------------------------------------------------------
    void main(void)
    {
    // Declare your local variables here
    
    // Input/Output Ports initialization
    // 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
    // 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 
    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=0x20;
    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: Timer1 Stopped
    // Mode: Normal top=0xFFFF
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer1 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: Off
    // Compare B Match Interrupt: Off
    TCCR1A=0x00;
    TCCR1B=0x00;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;
    
    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: Timer2 Stopped
    // Mode: Normal top=0xFF
    // OC2 output: Disconnected
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;
    
    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    MCUCR=0x00;
    
    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x00;
    
    // USART initialization
    // Communication Parameters: 8 Data, 1 Stop, No Parity
    // USART Receiver: On
    // USART Transmitter: On
    // USART Mode: Asynchronous
    // USART Baud Rate: 9600
    UCSRA=0x00;
    UCSRB=0x98;
    UCSRC=0x86;
    UBRRH=0x00;
    UBRRL=0x33;
    
    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;
    
    // ADC initialization
    // ADC disabled
    ADCSRA=0x00;
    
    // SPI initialization
    // SPI disabled
    SPCR=0x00;
    
    // TWI initialization
    // TWI disabled
    TWCR=0x00;
    
    // Alphanumeric LCD initialization
    // Connections specified in the
    // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
    // RS - PORTB Bit 1
    // RD - PORTB Bit 2
    // EN - PORTB Bit 3
    // D4 - PORTB Bit 4
    // D5 - PORTB Bit 5
    // D6 - PORTB Bit 6
    // D7 - PORTB Bit 7
    // Characters/line: 16
    lcd_init(16);
    
    // Global enable interrupts
    #asm("sei")
    
    lcd_clear();
    lcd_gotoxy(0,0);
    lcd_putsf("Receive SMS\nProject");
    delay_ms(2000);
    lcd_clear();
    
    while (1)
       {
       // Place your code here 
    
    
       buffer=getchar();
       if(buffer=='+')
        {
        buffer=getchar();
        if(buffer=='C')
         {
         buffer=getchar();
         if(buffer=='M')
          {
          buffer=getchar();
          if(buffer=='T')
           {
            read_sms();
           }
    
          }
         }
        }
       }
    }
    از سختی نترس! این سختی هاست که جایگاه و مقام انسان را بالا میبرد...

    #2
    پاسخ : دریافت اس ام اس با sim900 و میکرو (مشکل در جداسازی شماره و پیام دریافتی)

    سلام
    دوست عزیز اگر خواستید من به زبان بیسیک میتونم تا پایان پروژه شما را همراهمی بکنم

    دیدگاه


      #3
      پاسخ : دریافت اس ام اس با sim900 و میکرو (مشکل در جداسازی شماره و پیام دریافتی)

      نوشته اصلی توسط محمد مومنی تزنگی
      سلام
      دوست عزیز اگر خواستید من به زبان بیسیک میتونم تا پایان پروژه شما را همراهمی بکنم
      سلام، ممنونم ولی من بیسیک کار نکردم تاحالا

      از دوستان کسی میتونه ولتاژ پایه های TX و RX ماژول sim900 رو اندازه بگیره؟
      البته RX که باید صفر باشه ولی TX برا من 2.8 نشون میده!!! آیا باید همین باشه؟!
      چون اون طرف، پایه TX میکرو حدود 5 ولته! که با هم همخونی نداره!
      بنظرم مشکل من همین ولتاژ هست! چون ارتباط سریال به ولتاژ خیلی حساسه...
      از سختی نترس! این سختی هاست که جایگاه و مقام انسان را بالا میبرد...

      دیدگاه


        #4
        پاسخ : دریافت اس ام اس با sim900 و میکرو (مشکل در جداسازی شماره و پیام دریافتی)

        I/O های ماژول ولتاژشون همینه یعنی 2.8 ولت
        این ماژول اپلیکیشن نوت های کاملی داره مطالعه کنید نکات مفیدی دستگیرتون میشه
        مربوط به ارتباط سریال رو براتون پ کردم

        http://bayan******/id/7504715776121641363?info

        دیدگاه


          #5
          پاسخ : دریافت اس ام اس با sim900 و میکرو (مشکل در جداسازی شماره و پیام دریافتی)

          مشکلم حل شد بالاخره
          مشکل از کدویژن بود که برای اینتراپت اشتباه کد تولید میکرد
          درستش اینه:
          کد:
          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
            }
          }
          از سختی نترس! این سختی هاست که جایگاه و مقام انسان را بالا میبرد...

          دیدگاه

          لطفا صبر کنید...
          X