NOTICE توجه: این یک موضوع قدیمی است که آخرین پست ارسالی آن مربوط به 3133 روز قبل است . لطفا فقط پاسخ ها ، سوالات و درخواست های 100 درصد مرتبط را به آن ارسال کنید و برای درخواست ها و سوالات جدید موضوع جدیدی را ایجاد کنید
نمایش نتایج: از 1 به 8 از 8

موضوع: رفتار عجیب تابع Sprintf

  1. #1
    عضو جدید
    تاریخ عضویت
    Dec 2012
    نوشته ها
    7
    تشکر
    1
    تشکر شده 0 بار در 0 پست

    پیش فرض رفتار عجیب تابع Sprintf

    سلام دوستان وقتتون بخیر؛
    من با LPC1788 کار میکنم و یک برنامه 3000 خطی نوشتم و میکرو داره اجرا میکنه .(منظور از 3000 خط فقط اینه که حجم کد زیاده و امکان وجود باگ هست.) مشکلی که برای من به وجود اومده اینه که به صورت رندوم و بعد از یک مدت زمان نامشخص (بعضی وقت ها یک ربع)، تابع Sprintf برای مقدار float درست عمل نمیکنه و این مشکل ادامه داره تا میکرو ریست شه. حتی گاهی میکرو هم ممکنه هنگ کنه.

    کد:
    sprintf(disp_data,"%d=%2.2f\xdf",connector_number,temperature);
    مشکل اینجاست که دما کاملا درست و مثلا 12.34 نمایش داده میشه. این کار ادامه پیدا میکنه تا وقتی مشکل رخ میده این عدد تبدیل میشه به 34#12 (عبارت جای نقطه متغییره همیشه یکسان نیست لزوما) و بعد از اون دیگه رقم اعشار نشون نمیده و مقدار صحیح رو فقط نمایش میده.
    تو این حالت دیباگ هم کردم و نکته جالب این بود که تو متغییر s متغییر float یعنی temperature به درستی تبدیل میشه به جز نقطه (ممیز) سر همین دیگه بعد ممیز رو هم نمایش نمیده و فقط مقدار صحیح نمایش داده می شود.
    من واقعیت هیچ جور متوجه نشدم چطور ممکنه یک تابع ناقص کار کنه! اونم این نوع توابع. ولی یکی از دلایل ایجاد مشکل آیا میتونه اینتراپت یوارت بعد هر یک دقیق باشه؟ الان مثلا حدود 20-30 دقیقه گذشته و این اتفاق نیفتاده.

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

  2. # ADS
    Circuit advertisement
    تاریخ عضویت
    Always
    نوشته ها
    Many
     

  3. #2
    مدیر انجمن mzarkoob آواتار ها
    تاریخ عضویت
    Jun 2011
    نام
    مهدی زرکوب
    نوشته ها
    2,902
    تشکر
    1,202
    تشکر شده 2,317 بار در 1,273 پست

    پیش فرض

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

  4. #3
    کاربر فعال
    تاریخ عضویت
    Mar 2010
    نوشته ها
    236
    تشکر
    101
    تشکر شده 246 بار در 163 پست

    پیش فرض

    شاید اندازه متغییر disp_data رو کم گذاشتید. یا اینکه این در جای دیگه ایی ازش استفاه میکنید یا ....

  5. #4
    عضو جدید
    تاریخ عضویت
    Dec 2012
    نوشته ها
    7
    تشکر
    1
    تشکر شده 0 بار در 0 پست

    پیش فرض

    نقل قول نوشته اصلی توسط mzarkoob نمایش پست ها
    سلام
    یک پروژه ساده داشته باشید که فقط این قسمت داخلش باشه و جداگانه تست کنید سریع تر ایراد متوجه میشید نه در یک برنامه بزرگ
    همیشه قسمت قسمت یک کار را انجام می دند بعد سر همش می کنند که اگه ایرادی بود خودشو نشون بده
    سلام. ممنون از پاسختون قاعدتا بنده هم به همین صورت این کد رو نوشتم و هر قسمت جدید رو هم حتی می خوام اضافه کنم یه while 1 می نویسم و جدا از کل برنامه قسمت جدید رو تست میکنم. موضوع اصلی این هست که طبق همین روال همه چی درست هستش. و در برنامه نهایی هم تا 30 دقیقه حدودا مشکلی نیست اما یکهو این اتفاق میفته و بعد از چند ساعت میکرو هنگ میکنه.
    ویرایش توسط ariahope : 29-09-2015 در ساعت 10:15

  6. #5
    عضو جدید
    تاریخ عضویت
    Dec 2012
    نوشته ها
    7
    تشکر
    1
    تشکر شده 0 بار در 0 پست

    پیش فرض

    نقل قول نوشته اصلی توسط mrm نمایش پست ها
    شاید اندازه متغییر disp_data رو کم گذاشتید. یا اینکه این در جای دیگه ایی ازش استفاه میکنید یا ....
    سلام ممنون. این متغییر به صورت زیر تعریف شده:
    کد:
    char disp_data[20];
    بنده هم یکی از حدس هام همین موضوعی که شما میگید بود به همین دلیل متغییر disp_data رو ایجاد کردم و تنها جایی که ازش استفاده کردم همین جا بود.

  7. #6
    عضو جدید
    تاریخ عضویت
    Dec 2012
    نوشته ها
    7
    تشکر
    1
    تشکر شده 0 بار در 0 پست

    پیش فرض

    سلام دوستان وقتتون بخیر؛
    همونطور که گفتم به احتمال بسیار زیاد مشکل از اینتراپت یوارت هستش. به دلیل اینکه حجم داده هایی که از یوارت میاد هربار حدود سی بایت هستش من از اینتراپت یوارت استفاده کردم. لازم به ذکر است که سرعت خواندن برای بنده اهمیت ندارد. اگر حجم داده ها دریافتی کمتر بود fifo uart هم کفایت میکرد.
    نحوه ی استفاده از اینتراپت هم به این شکل هست که به محض اینکه داده ای جدید بیاد فلگ فعال میشه و داده ها ذخیره میشه تو آرایه تا زمانی که فلگ رو بخونم و صفرش کنم. البته الان تو این قسمت کد اصلا فلگ رو نمیخونم و کاری به اینتراپت ندارم ولی در کد نهایی داده های ذخیره شده رو میخونم. (اینکه عملیات دریافت و ارسال درست انجام میشه رو با ارسال داده هایی با طول 40-50 بایت تست کردم و خیلی خوب عمل کرد.) اینم کدهای مربوط به اینتراپت:

    Code:
    کد:
    //UART3 interrupt handler sub-routine
     void UART3_IRQHandler(void)
    {    
            uart3_int_fifo[uart3_int_len] = UART_ReceiveByte(UART_3);
            uart3_int_len++;
            uart3_int_flag=1;
    }
        //in main function
        /* Initialize UART Configuration parameter structure to default state:
         * Baudrate = 9600bps
         * 8 data bit
         * 1 Stop bit
         * None parity
         */
        //uart configuration
        UART_3_CFG.Parity=UART_PARITY_NONE;
        UART_3_CFG.Databits=UART_DATABIT_8;
        UART_3_CFG.Stopbits=UART_STOPBIT_1;
        UART_3_CFG.Baud_rate=9600;
    
    
        //uart initialization
        UART_Init(UART_3,&UART_3_CFG);
        
        //*Enable Interrupt for UART3 channel
        UART_IntConfig(UART_3, UART_INTCFG_RBR, ENABLE);
        NVIC_EnableIRQ(UART3_IRQn);
        
        //Enable Uart TXD
        UART_TxCmd(UART_3,ENABLE);

    اتفاقی که الان افتاده اینه که اینتراپت رو غیر فعال کردم و باقی قسمت های کد به درستی تا الان عمل کرده اند و اون مشکل تابع sprintf هم تا الان پیش نیومده.

  8. #7
    عضو جدید
    تاریخ عضویت
    Dec 2012
    نوشته ها
    7
    تشکر
    1
    تشکر شده 0 بار در 0 پست

    پیش فرض

    سلام مجدد؛
    مشکل رو به نظر پیدا کردم و دیگه اون مشکلات قبلی رخ نداد. همونطور که بالا گفتم من برای اینکه مرحله به مرحله پیش برم بعد از تست اینتراپت دیگه ازش استفاده نکردم همین موضوع باعث ایجاد این باگ عجیب شده بود که حسابی همه چیز رو تحت تاثیر قرار داده بود حتی توابعی چون sprintf. من اومده بودم توی اینتراپت شماره آرایه رو افزایش دادم بودم و دیتا رو در اون ذخیره میکردم. اما چون از اینتراپت استفاده نکرده بودم و مقادیر رو صفر نمیکردم این متغییر آرایه اعدادی بیش از طول آرایه پیدا میکرد و این موضوع باعث شده بود تمام رفتارهای میکرو دست خوش تغییر بشه.
    امیدوارم یه روزی به کار کسی بیاد.

  9. #8
    کاربر فعال pirozy آواتار ها
    تاریخ عضویت
    May 2010
    نوشته ها
    337
    تشکر
    147
    تشکر شده 192 بار در 84 پست

    پیش فرض

    سلام
    مهندس قبل از استفاده از تابع sprintf
    اندیس صفر متغییر disp_data رو برابر کاراکتر نول قرار بدین

موضوعات مشابه

  1. مشکل با sprintf در coIDE
    توسط mehdi_nxp در انجمن LPC series (NXP)
    پاسخ: 0
    آخرين نوشته: 10-12-2012, 20:34
  2. float در دستور sprintf
    توسط آقاجون در انجمن LPC series (NXP)
    پاسخ: 0
    آخرين نوشته: 20-07-2012, 19:36
  3. پاسخ: 1
    آخرين نوشته: 01-07-2012, 19:12
  4. مشکل با sprintf در avrgcc
    توسط mojtaba_led در انجمن AVR
    پاسخ: 12
    آخرين نوشته: 03-09-2011, 03:08

کلمات کلیدی این موضوع

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •