اطلاعیه

Collapse
No announcement yet.

مشکل ارتباط SIM800 با پورت سریال AVR

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

    مشکل ارتباط SIM800 با پورت سریال AVR

    سلام دوستان خسته نباشید
    من برنامه رو تو Atmel Studio نوشتم و چون تو Atmel Studio نتوستم از کتابخونه stdio.h برای ارتباط با پورت سریال استفاده کنم مجبور شدم از ریجستر های USART استفاده کنم
    ولی در صورتی که پورت USART رو به کامپیوتر وصل کنم همه اطلاعات رو به درستی دریافت میکنم ولی در ارتباط با SIM800 فقط دو کارکتر اول دریافت میشه
    ایا راهی است از دستورات Sprintf و scanf تو Atmel Studio استفاده کنم؟
    در ضمن SIM800 با کامپیوتر به درستی کار میکنه
    ممنونم
    [FONT=Yekan]
    #ifdef F_CPU[/FONT]
    #define F_CPU 8000000UL
    #endif


    #define baud_rate 9600
    #define baud ((F_CPU/(16UL * baud_rate))-1)


    #include <avr/io.h>
    #include <util/delay.h>
    #include "lcd.h"
    #include <avr/interrupt.h>
    #include <string.h>


    volatile int ifg = 0, h = 0, i = 0, j = 0;
    volatile unsigned char msgc[20] , msg[100];
    volatile unsigned int g = 0;
    #define Ent 10


    void USART_Init(void){
    UCSRA = 0x00;
    UCSRB = (1<<RXEN) | (1<<TXEN);
    UCSRC = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0);
    UBRRL = baud;
    UBRRH = (baud<<8);
    UCSRB|=(1<<RXCIE);



    }


    void USART_Transmit_Char(unsigned char data){
    while(!((UCSRA) & (1<<UDRE)));
    UDR = data;
    }


    void USART_Transmit_String(unsigned char *_string_){
    int i;
    for(i=0;i<strlen(_string_);i++){
    while (( UCSRA & (1<<UDRE)) == 0){};
    UDR = _string_[i];
    }
    }


    unsigned char USART_Recieve_Char(void){


    while (((UCSRA) & (1<<RXC))==0);
    return UDR;
    }


    unsigned char USART_Recieve_String(unsigned char *_string){
    unsigned char s = 0;
    unsigned char n = 0;
    UDR = 0;
    while (1)
    {
    s = USART_Recieve_Char();
    if (s == '\n')break;
    _string[n] = s;
    UDR = 0;
    n++;
    }
    _string[n] = 0;
    }


    ISR(USART_RXC_vect){
    UCSRB&=~(1<<RXCIE); // DISABLE INTERRUPT
    ifg=1;
    UDR =0;
    USART_Recieve_String(msgc);

    }




    int main(void)
    {
    USART_Init();
    _delay_ms(30);


    lcd_init();
    lcd_clear();
    _delay_ms(100);
    lcd_gotoxy(1,0);
    _delay_ms(1000);
    lcd_clear();
    sei();
    cheak:
    //sprintf(msg,"ATE0%c",ent);
    //USART_Transmit_String(msg);

    lcd_gotoxy(0,0);
    lcd_clear();
    lcd_puts("Connecting");
    _delay_ms(1000);
    /*if(strstr(msgc,"OK")==NULL){
    lcd_puts(msgc);
    _delay_ms(1000);
    UCSRB|=(1<<RXCIE);
    goto cheak;
    }
    else{
    lcd_clear();
    lcd_gotoxy(0,0);
    lcd_puts("OK");
    _delay_ms(1000);
    UCSRB|=(1<<RXCIE);
    //goto cheak;
    }*/
    lcd_clear();
    while (1)
    {
    if (ifg == 1){
    _delay_ms(1000);
    lcd_gotoxy(0,0);
    lcd_putsf(msgc);
    if(strstr(msgc , "RING")){
    lcd_gotoxy(1,1);
    lcd_puts("OK");
    lcd_clear();
    }

    ifg = 0;
    UCSRB|=(1<<RXCIE);
    }
    }
    [FONT=Yekan]}[/FONT]
    جدیدترین ویرایش توسط amin_a_y; ۲۱:۴۱ ۱۳۹۶/۱۱/۱۶.
    اميدوارم خدا پنجره باز اتاقتون باشه!

    #2
    پاسخ : مشکل ارتباط SIM800 با پورت سریال AVR

    دوباره سلام
    پس از کلی کلنجار با برنامه مشکلش رو پیدا کردم
    مشکل از فرمت دیتا ارسالی توسط ماژول بود که به صورت
    <CR><LF><response><CR><LF> بود و برنامه رو به شکل زیر تغییر دادم دوستان اگه پیشنهاد بهتری دارن ممنون میشم کمک کنن ولی برنامه به خوبی کار میکنه

    unsigned char USART_Recieve_String(unsigned char *_string){
    unsigned char s = 0 , n = 0;
    UDR = 0;

    s = USART_Recieve_Char();
    s = USART_Recieve_Char();

    while (1)
    {
    s = USART_Recieve_Char();
    if (s == '\n'){
    UCSRB|=(1<<RXCIE);
    _string[n-1] = '\0';
    break;
    }
    _string[n] = s;
    UDR = 0;
    n++;
    }
    _string[n] = 0;
    [FONT=Yekan]}[/FONT][COLOR=#28282B][FONT=&quot][/FONT][/COLOR]

    اميدوارم خدا پنجره باز اتاقتون باشه!

    دیدگاه


      #3
      پاسخ : مشکل ارتباط SIM800 با پورت سریال AVR

      نوشته اصلی توسط amin_a_y نمایش پست ها
      دوباره سلام
      پس از کلی کلنجار با برنامه مشکلش رو پیدا کردم
      مشکل از فرمت دیتا ارسالی توسط ماژول بود که به صورت
      <CR><LF><response><CR><LF> بود و برنامه رو به شکل زیر تغییر دادم دوستان اگه پیشنهاد بهتری دارن ممنون میشم کمک کنن ولی برنامه به خوبی کار میکنه

      unsigned char USART_Recieve_String(unsigned char *_string){
      unsigned char s = 0 , n = 0;
      UDR = 0;

      s = USART_Recieve_Char();
      s = USART_Recieve_Char();

      while (1)
      {
      s = USART_Recieve_Char();
      if (s == '\n'){
      UCSRB|=(1<<RXCIE);
      _string[n-1] = '\0';
      break;
      }
      _string[n] = s;
      UDR = 0;
      n++;
      }
      _string[n] = 0;
      [FONT=Yekan]}[/FONT][COLOR=#28282B][FONT=&quot][/FONT][/COLOR]

      سلام
      از کتابخونه ای که تو لینک زیر هست استفاده کنید:

      من خیلی وقته که با این کتبخونه کار میکنم و تا حالا که هیچ مشکلی نداشتم
      قابلیت بافر دریافت حلقوی هم داره

      دیدگاه


        #4
        پاسخ : مشکل ارتباط SIM800 با پورت سریال AVR

        سلام دوست عزیز
        ممنون بابت معرفی کتابخانه
        من از این کتابخونه استفاده کردم و مشکم تو مقدار برگشتی از تابع هستش که بعضی وقتی با اینکه تو خود تابع رشته رو کامل دریافت میکنم ولی موقعی که تابع را فراخوانی میکنم مقدار برگشتی همون نیست که دریافت کردم
        تابع مربوط به دریافت رشته از پورت سریال:
        char * uart_gets(void){ 
        unsigned int n = 0 , c = 0, a = 0;
        unsigned char s;
        static unsigned char _string[100];
        for (n=0;n<=100;n++){
        _string[n] = '\0';
        }
        n = 0;
        while (1){
        again:
        c = uart_getc();
        if (!(c & UART_NO_DATA)){
        s = (unsigned char)c;
        if ((s == '\r' || s == '\n') && (n == 0)) goto again;
        if ((s == '\r' || s == '\n') && (n != 0)){
        _string[n] = '\0';
        return (_string);

        }
        _string[n] = s;
        n++;
        }
        }
        }


        تابع مربوط به دریافت SMS
        const char * SIM800_SMS_Read(unsigned int _sms){ 
        unsigned char *msg_receive = NULL;
        unsigned char *read = NULL;
        unsigned q = 0, w = 0, e = 0 , c = 0 , v = 0;

        for (v=0;v<=50;v++) sms_date[v] = '\0';
        for (v=0;v<=50;v++) sms_number[v] = '\0';
        for (v=0;v<=50;v++) sms_read[v] = '\0';

        sprintf(msg,"AT+CMGR=%d%c",_sms,Ent);
        uart_puts(msg);
        msg_receive = uart_gets();
        if(strstr(msg_receive,"+CMGR:")){
        for (q=0;q<=strlen(msg_receive);q++){
        if (msg_receive[q] == Cot && e <= 2) e++;
        if ((msg_receive[q] == Cot || c == 1) && e == 3){
        c = 1;
        sms_number[w] = msg_receive[q+1];
        w++;
        if (sms_number[w-1] == Cot)
        {
        sms_number[w-1] = '\0';
        c = 0;
        e++;
        w = 0;
        }
        }if ((msg_receive[q] == Cot && e >= 4) && (msg_receive[q] == Cot && e <= 7)) e++;
        if ((msg_receive[q] == Cot || c == 1) && e == 8){
        c = 1;
        sms_date[w] = msg_receive[q+1];
        w++;
        if (sms_date[w-1] == Cot)
        {
        sms_date[w-1] = '\0';
        c = 0;
        e++;
        w = 0;
        }
        }if ((msg_receive[q] == Cot) && e == 9){
        w = 0;
        e = 0;
        read = uart_gets();
        lcd_gotoxy(0,0);
        lcd_puts(read);


        }
        }
        }else return "Er SMS";
        free(msg_receive);
        msg_receive = NULL;
        free(read);
        read = NULL;
        return (read);
        }

        بازم ممنونم
        جدیدترین ویرایش توسط amin_a_y; ۱۰:۳۴ ۱۳۹۷/۰۱/۲۲.
        اميدوارم خدا پنجره باز اتاقتون باشه!

        دیدگاه

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