اطلاعیه

Collapse
No announcement yet.

مشکل با مقدار برگشتی تابع(اشاره گر)

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

    مشکل با مقدار برگشتی تابع(اشاره گر)

    سلام دوستان عزیز خسته نباشید
    تابع زیر مربوط به دریافت رشته در پورت سریال هستش
    ولی وقتی مقدار رو داخل تابع میخونم درسته ولی وقتی داخل تابع Main فراخوانی میکنم بعضی وقتا درست نشون نمیده(مربوط به SIM800)
    [FONT=Yekan]unsigned char * uart_gets(void){[/FONT]    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();
    _delay_ms(50);
    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)){
    return &_string;

    }
    _string[n] = s;
    n++;
    }
    }
    [FONT=Yekan]}
    [/FONT]


    و تابع زیر برای به دست اوردن نام اپراتور هستش ولی وقتی از تابع خارج میشه و میخوام تابع دیگری رو فراخوانی کنم میکرو هنگ میکنه
    [FONT=Yekan]const char * SIM800_OPERATOR_Name(void){[/FONT]    auto unsigned char * msg_receive, operator_name[20], msg[100];
    for (int q=0;q<=100;q++) operator_name[q] = '\0';
    for (int q=0;q<=100;q++) msg[q] = '\0';
    unsigned int a = 0 , b = 0 , s = 0;
    sprintf(msg,"AT+CSPN?%c",Ent);
    TIMER0_Start();
    t_en_er_check = 1;
    check_operatot_name:
    if (t_er_check >= 1){
    t_er_check = 0;
    TIMER0_Stop();
    t_en_er_check = 0;
    return "Time Out E108";
    }
    //USART_Transmit_String(msg);
    uart_puts(msg);
    _delay_ms(300);
    msg_receive = uart_gets();
    if (strstr(msg_receive,"+CSPN:") == NULL)
    {
    _delay_ms(100);
    goto check_operatot_name;
    }else{

    TIMER0_Stop();
    t_en_er_check = 0;
    for (a=0;a<=strlen(msg_receive);a++)
    {
    if (msg_receive[a] == Cot || s == 1)
    {
    s = 1;
    operator_name[b] = msg_receive[a+1];
    if (operator_name[b] == Cot){
    operator_name[b-1] = '\0';
    msg_receive = NULL;
    free(msg_receive);
    a = 0;
    b = 0;
    s = 0;
    return &operator_name;
    }
    b++;
    }
    }
    }
    }




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


    const char * SIM800_SMS_Delete(unsigned int _del){
    auto unsigned char * msg_receive = NULL, msg[100];
    for (int q=0;q<=100;q++) msg[q] = '\0';
    if(_del <= 5){
    TIMER0_Start();
    t_en_er_check = 1;
    if (_del == 0)
    sprintf(msg,"AT+CMGDA=\"DEL READ\"%c",Ent);
    else if (_del == 1)
    sprintf(msg,"AT+CMGDA=\"DEL UNREAD\"%c",Ent);
    else if (_del == 2)
    sprintf(msg,"AT+CMGDA=\"DEL SENT\"%c",Ent);
    else if (_del == 3)
    sprintf(msg,"AT+CMGDA=\"DEL UNSENT\"%c",Ent);
    else if (_del == 4)
    sprintf(msg,"AT+CMGDA=\"DEL INDEX\"%c",Ent);
    else if (_del == 5)
    sprintf(msg,"AT+CMGDA=\"DEL ALL\"%c",Ent);
    else{
    TIMER0_Stop();
    return "ER SMS DEL";
    }
    check_Del:
    if (t_er_check >= 1){
    t_er_check = 0;
    TIMER0_Stop();
    t_en_er_check = 0;
    return "Time Out E110";
    }
    //USART_Transmit_String(msg);
    uart_puts(msg);
    _delay_ms(500);
    msg_receive = uart_gets();
    if (strstr(msg_receive,"OK") == NULL){
    _delay_ms(100);
    goto check_Del;
    }else{
    TIMER0_Stop();
    msg_receive = NULL;
    free(msg_receive);
    t_en_er_check = 0;
    if (_del == 0)
    return "Del Read";
    else if (_del == 1)
    return "Del UnRead";
    else if (_del == 2)
    return "Del Sent";
    else if (_del == 3)
    return "Del UnSent";
    else if (_del == 4)
    return "Del Index";
    else if (_del == 5)
    return "Del All";
    else
    return "ER SMS DEL";
    }
    }else
    return "ER Code SMS Delete";
    }




    ممنون از همتون
    در ضمن برنامه نویسی در محیط Atmel Studio هستش و اگه کتابخونه برای Usart معرفی کنید ممنون میشم
    جدیدترین ویرایش توسط amin_a_y; ۱۲:۲۷ ۱۳۹۷/۰۲/۱۹.
    اميدوارم خدا پنجره باز اتاقتون باشه!

    #2
    پاسخ : مشکل با مقدار برگشتی تابع(اشاره گر)

    نوشته اصلی توسط amin_a_y نمایش پست ها
    سلام دوستان عزیز خسته نباشید
    تابع زیر مربوط به دریافت رشته در پورت سریال هستش
    ولی وقتی مقدار رو داخل تابع میخونم درسته ولی وقتی داخل تابع Main فراخوانی میکنم بعضی وقتا درست نشون نمیده(مربوط به SIM800)
    ممنون از همتون
    در ضمن برنامه نویسی در محیط Atmel Studio هستش و اگه کتابخونه برای Usart معرفی کنید ممنون میشم
    در تابع اولی یک اشتباه بزرگ وجود دارد
    کد:
    static unsigned char _string[100];
        for (n=0;n<=100;n++){
            _string[n] = '\0';
        }
    اندازه آرایه 100 عدد تعریف شده ولی 101 عدد در آن گذاشته میشود
    آن دستور for را باید به شکل زیر اصلاح کنید
    کد:
        for (n=0;n<100;n++){
            _string[n] = '\0';
    یعنی علامت "کوچکتر یا مساوی" با "کوچکتر" عوض شود
    والا دستور for در آخرین دورش ، در حافظه نامربوطی خواهد نوشت

    دیدگاه


      #3
      پاسخ : مشکل با مقدار برگشتی تابع(اشاره گر)

      سلام ممنون دوست عزیز
      مساوی هارو حذف کردم تو کل برنامه پر بود از این اشتباهم
      ممنون بابت راهنمایی ولی هنوز مشکل حل نشه
      بعد این تابعی که من نوشتم مشکله ساختاری نداره؟
      اميدوارم خدا پنجره باز اتاقتون باشه!

      دیدگاه


        #4
        پاسخ : مشکل با مقدار برگشتی تابع(اشاره گر)

        نوشته اصلی توسط amin_a_y نمایش پست ها
        سلام ممنون دوست عزیز
        مساوی هارو حذف کردم تو کل برنامه پر بود از این اشتباهم
        ممنون بابت راهنمایی ولی هنوز مشکل حل نشه
        بعد این تابعی که من نوشتم مشکله ساختاری نداره؟
        وقت نکردم همه سورستون رو به دقت نگاه کنم
        ولی مثل اینکه داخل حلقه ها ، شما اندازه آرایه هایی که با اونها کار میکنید رو چک نمی کنید
        مثلا تو همون قسمت اول ، در داخل حلقه while که اطلاعات رو از سریال میگیرید و توی آرایه میذارید ، اندازه آرایه چک نمیشه !
        همیشه و همیشه باید این موضوع رو چک کنید ، یعنی شرط اندازه بافرتون رو همیشه در حلقه ها رعایت کنید

        دیدگاه


          #5
          پاسخ : مشکل با مقدار برگشتی تابع(اشاره گر)

          نوشته اصلی توسط x935418 نمایش پست ها
          وقت نکردم همه سورستون رو به دقت نگاه کنم
          ولی مثل اینکه داخل حلقه ها ، شما اندازه آرایه هایی که با اونها کار میکنید رو چک نمی کنید
          مثلا تو همون قسمت اول ، در داخل حلقه while که اطلاعات رو از سریال میگیرید و توی آرایه میذارید ، اندازه آرایه چک نمیشه !
          همیشه و همیشه باید این موضوع رو چک کنید ، یعنی شرط اندازه بافرتون رو همیشه در حلقه ها رعایت کنید
          بازم ممنون از توجهتون
          ولی میشه یکم کاملتر توضیح بدید
          اميدوارم خدا پنجره باز اتاقتون باشه!

          دیدگاه


            #6
            پاسخ : مشکل با مقدار برگشتی تابع(اشاره گر)

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

            دیدگاه


              #7
              پاسخ : مشکل با مقدار برگشتی تابع(اشاره گر)

              نوشته اصلی توسط amin_a_y نمایش پست ها
              دوستان من اخرش متوجه نشدم کد من مشکل داره یا نه

              ببخشید من چند روزی نبودم
              همونطور که گفتم باید در داخل حلقه ها ، حتما اندیس آرایه رو چک کرد که از محدوده بیرون نزنه
              مثلا در همون تابع اول ، که کاراکترهای دریافتی رو داخل آرایه میگدارید ، این موضوع رعایت نشده
              با توجه به ابعاد آرایه شما که 100 تایی هستش ، بالاترین اندیس قابل استفاده ، 99 هستش یعنی اگه بعد از قراردادن کاراکتر در آرایه و افزایش اندیس ،
              مقدار اندیس شد 99 ، باید حلقه تموم بشه
              حالا سورس خودتون رو میذارم
              کد:
              while (1){
                      again:
                      c = uart_getc();
                      _delay_ms(50);
                      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)){
                              return &_string;
                               
                          }
                          _string[n] = s;
                          n++;
                          }
                  }
              در سورس اصلاح شده من فقط شرط حلقه رو عوض کردم

              کد:
              while (n<99){
                      again:
                      c = uart_getc();
                      _delay_ms(50);
                      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)){
                              return &_string;
                               
                          }
                          _string[n] = s;
                          n++;
                          }
                  }
              اینئ موضوع رو باید در همه حلقه هاتون رعایت کنید

              دیدگاه


                #8
                پاسخ : مشکل با مقدار برگشتی تابع(اشاره گر)

                نوشته اصلی توسط x935418 نمایش پست ها
                ببخشید من چند روزی نبودم
                همونطور که گفتم باید در داخل حلقه ها ، حتما اندیس آرایه رو چک کرد که از محدوده بیرون نزنه
                مثلا در همون تابع اول ، که کاراکترهای دریافتی رو داخل آرایه میگدارید ، این موضوع رعایت نشده
                با توجه به ابعاد آرایه شما که 100 تایی هستش ، بالاترین اندیس قابل استفاده ، 99 هستش یعنی اگه بعد از قراردادن کاراکتر در آرایه و افزایش اندیس ،
                مقدار اندیس شد 99 ، باید حلقه تموم بشه
                حالا سورس خودتون رو میذارم
                کد:
                while (1){
                        again:
                        c = uart_getc();
                        _delay_ms(50);
                        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)){
                                return &_string;
                                 
                            }
                            _string[n] = s;
                            n++;
                            }
                    }
                در سورس اصلاح شده من فقط شرط حلقه رو عوض کردم

                کد:
                while (n<99){
                        again:
                        c = uart_getc();
                        _delay_ms(50);
                        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)){
                                return &_string;
                                 
                            }
                            _string[n] = s;
                            n++;
                            }
                    }
                اینئ موضوع رو باید در همه حلقه هاتون رعایت کنید
                سلام ممنونم از جوابی که دادید
                من فعلا اومدم سر کارم و تا یه ماه دسترسی ندارم تستش کنم، ایشاااله تو اولین فرصت نتیجه رو بهتون میگم
                بنظرتون مشکل از همینه؟
                چون احساس میکنم کدم مشکل ساختاری داری یعنی استاندارد نیست
                بازم ممنونم از توجهتون
                اميدوارم خدا پنجره باز اتاقتون باشه!

                دیدگاه

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