اطلاعیه

Collapse
No announcement yet.

مشکل در وقفه سریال

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

    مشکل در وقفه سریال

    سلام من یه پروژه ای دارم که توش از ارتباط سریال استفاده کردم
    و از دستور get برای دریافت اطلاعات استفاده کردم
    و همون طور که میدونید برنامه وقتی به این دستور میرسه
    متوقف میشه و منتظر دریافت اطلاعات میشه
    مشکل من اینکه من نیاز دارم توی حلقم
    دایم وضعیت یک سنسور چک بشه ولی این get
    و توقف برنامه کارمو خراب کرده
    و برای رفع این مشکل اومدم از وقفه سریال استفاده کردم
    و طبق کدهای زیر در روتین وقفه متغیر a رو مساوی یک قرار دادم
    ودر برنامم چک میکردم که هروقت a=1 بود دستور get رو بده
    و اطلاعات رو بگیره ولی با این کار وضعیت دقیقا مثل قبل از انجام
    این کارا شد و بازم توی اون شرط میره و پشت get گیر میکنه
    نمیدونم مشکل از کجاست میشه رانمایی کنید.
    با تشکر





    // 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
    }
    // این جا گزاشتمش
    a=1;
    }

    while(1){
    if(a==1) {
    gets(str,100);
    a=0;
    };
    }





    #2
    پاسخ : مشکل در وقفه سریال

    دوست عزیز. من C برای AVR بلد نیستم! ولی به جای حلقه از تایمر برای بررسی وضعیت سنسور استفاده کن
    STM32 واقعا یه چیز دیگه است...

    دیدگاه


      #3
      پاسخ : مشکل در وقفه سریال

      نوشته اصلی توسط Javad Moosavi
      دوست عزیز. من C برای AVR بلد نیستم! ولی به جای حلقه از تایمر برای بررسی وضعیت سنسور استفاده کن
      ممنون از پاسختون
      ولی به دلایلی نمی خوام از تایمر استفاده کننم و هستن کسانی که از این روش استفاده کردن و جواب گرفتن

      دیدگاه


        #4
        پاسخ : مشکل در وقفه سریال

        کسی نیست بتونه جواب ما رو بده???

        دیدگاه


          #5
          پاسخ : مشکل در وقفه سریال

          با سلام
          در مورد نحوه درست استفاده از وقفه سریال مطلب قبلا گفته شده، به صورت. مختصر شما در وقفه باید عملیات خوندن رو انجام بدین با دستور getc و خودتون بریزین تو ارایه و پردازش کنین، gets جواگوی کار نیست
          The healthy human mind doesn't wake up in the morning thinking this is his last day on earth.

          دیدگاه


            #6
            پاسخ : مشکل در وقفه سریال

            دوست عزیز
            اصلا نیاز به این کارا نیست ! بصورت ساده بخوام بگم یک متغیر گلوبال مثل rx_buffer تعریف میکنید حالا توی اینتراپت متغیر رو پر میکنید و ایندکس رو یکی بالا میبرید . وقتی دیتا کامل دریافت شد ایندکس رو دوباره صفر میکنید . با هربار اجرای اینتراپت یک بایت دریافت میشه که توی رشته ریخته خواهد شد
            USART Receiver interrupt service routine
            interrupt [USART_RXC] void usart_rx_isr(void)
            {
            char status,data;
            status=UCSRA;
            data=UDR;
            rx_buffer[i]=data
            i++
            ;
            }

            (کد مثالی بوده و برای آموزش ساده شده است )
            Don't hesitate to ask any question ..

            دیدگاه


              #7
              پاسخ : مشکل در وقفه سریال

              نوشته اصلی توسط artison
              دوست عزیز
              اصلا نیاز به این کارا نیست ! بصورت ساده بخوام بگم یک متغیر گلوبال مثل rx_buffer تعریف میکنید حالا توی اینتراپت متغیر رو پر میکنید و ایندکس رو یکی بالا میبرید . وقتی دیتا کامل دریافت شد ایندکس رو دوباره صفر میکنید . با هربار اجرای اینتراپت یک بایت دریافت میشه که توی رشته ریخته خواهد شد
              USART Receiver interrupt service routine
              interrupt [USART_RXC] void usart_rx_isr(void)
              {
              char status,data;
              status=UCSRA;
              data=UDR;
              rx_buffer[i]=data
              i++
              ;
              }

              (کد مثالی بوده و برای آموزش ساده شده است )
              سلام
              ممنون ازتوضیحات
              یعنی الان من یه رشته تعریف کنم یا ارایه بعد اطلاعات رو تو همون وقفه بریزم تو ارایه
              بعد من نمیدونم این ایندکس چی هست و چی کار میکنه که گفتید یکی ببرمش بالا میشه یکم توضیح بدید
              بعد لطفا اگه امکان داره بفرمایید اینکه هر دفعه یه بایت میگره یعنی چقدر یعنی مثلا چند کاراکتر میشه?
              و سوال آخر این که به جای این کارا من دستور get رو تو روتین وقفه بزارم مشکل حل نمیشه ?
              باتشکر فراوان

              دیدگاه


                #8
                پاسخ : مشکل در وقفه سریال

                کسی نیست کمک کنه???

                دیدگاه


                  #9
                  پاسخ : مشکل در وقفه سریال

                  نوشته اصلی توسط hessam2013
                  با سلام
                  در مورد نحوه درست استفاده از وقفه سریال مطلب قبلا گفته شده، به صورت. مختصر شما در وقفه باید عملیات خوندن رو انجام بدین با دستور getc و خودتون بریزین تو ارایه و پردازش کنین، gets جواگوی کار نیست
                  دستور getc چی هست یعنی چه فرقی با gets(str,100) داره?

                  دیدگاه


                    #10
                    پاسخ : مشکل در وقفه سریال

                    Getc یک کاراکتر میگیره، در حالی که gets یک چمله میگیره،
                    The healthy human mind doesn't wake up in the morning thinking this is his last day on earth.

                    دیدگاه


                      #11
                      پاسخ : مشکل در وقفه سریال

                      کسی نبود کمک کنه ?

                      دیدگاه


                        #12
                        پاسخ : مشکل در وقفه سریال

                        دوست عزیز شما پاسخ رو دریافت کردین، اشکال کار از اونجا هست که دانش برنامه نویسی لازم رو ندارین، پس با احترام، فکر می کنم بد نباشه کمی در مورد سی و ارایه ها مطالعه کنید بعد اون رو در میکرو پیاده کنید:
                        نوشته اصلی توسط mohammadt3000
                        سلام
                        ممنون ازتوضیحات
                        یعنی الان من یه رشته تعریف کنم یا ارایه بعد اطلاعات رو تو همون وقفه بریزم تو ارایه
                        بعد من نمیدونم این ایندکس چی هست و چی کار میکنه که گفتید یکی ببرمش بالا میشه یکم توضیح بدید
                        بعد لطفا اگه امکان داره بفرمایید اینکه هر دفعه یه بایت میگره یعنی چقدر یعنی مثلا چند کاراکتر میشه?
                        و سوال آخر این که به جای این کارا من دستور get رو تو روتین وقفه بزارم مشکل حل نمیشه ?
                        باتشکر فراوان
                        جواب سوالات بالا مختصرا :
                        ~رشته همون ارایه هست و هیچ تفاوتی ندارند، فقط در رشته شما ارایه از نوع کاراکتر تعریف می کنید و سر و کله نال کاراکتر پیدا میشه، به این دلیل که بشه با توابع رشته کارکرد، وگرنه رشته و ارایه یکی هستند، یعنی رشته نوع خاصی از تفسیر ما از ارایه هست
                        ~ایندکس عددی هست که به مکان مشخصی از ارایه اشاره می کنه، مثلا در ارایه با طول 3، ایندکس از 0 تا 2 قابل درک هست، که ایندکس 0 اولین عضو و ایندکس 2 عضو اخر ارایه رو مشخص میکنه
                        ~هر بار یوزارت در تنظیمات عادی 8 بیت منتقل میکنه، طول نوع char یا همون کاراکتر هم 8 بیت هست، پس در هربار انتقال 1 کاراکتر منتقل میشه
                        ~خیر، کار نمیکنه، همون طور که گفتم از getc باید استفاده کنید در داخل وقفه، کاراکتری که با getc گرفتین رو با روشی که دوستمون بالا گفتن ذخیره کنید و در برنامه پردازش، اگه همین انجمن رو سرچ کنید، نمونه کد کامل هم هست، که مکانیزم رو کامل پیاده کرده، هر چند دوستمون در بالا کدشون اصل مطلب رو رسونده
                        The healthy human mind doesn't wake up in the morning thinking this is his last day on earth.

                        دیدگاه


                          #13
                          پاسخ : مشکل در وقفه سریال

                          نوشته اصلی توسط hessam2013
                          دوست عزیز شما پاسخ رو دریافت کردین، اشکال کار از اونجا هست که دانش برنامه نویسی لازم رو ندارین، پس با احترام، فکر می کنم بد نباشه کمی در مورد سی و ارایه ها مطالعه کنید بعد اون رو در میکرو پیاده کنید:جواب سوالات بالا مختصرا :
                          ~رشته همون ارایه هست و هیچ تفاوتی ندارند، فقط در رشته شما ارایه از نوع کاراکتر تعریف می کنید و سر و کله نال کاراکتر پیدا میشه، به این دلیل که بشه با توابع رشته کارکرد، وگرنه رشته و ارایه یکی هستند، یعنی رشته نوع خاصی از تفسیر ما از ارایه هست
                          ~ایندکس عددی هست که به مکان مشخصی از ارایه اشاره می کنه، مثلا در ارایه با طول 3، ایندکس از 0 تا 2 قابل درک هست، که ایندکس 0 اولین عضو و ایندکس 2 عضو اخر ارایه رو مشخص میکنه
                          ~هر بار یوزارت در تنظیمات عادی 8 بیت منتقل میکنه، طول نوع char یا همون کاراکتر هم 8 بیت هست، پس در هربار انتقال 1 کاراکتر منتقل میشه
                          ~خیر، کار نمیکنه، همون طور که گفتم از getc باید استفاده کنید در داخل وقفه، کاراکتری که با getc گرفتین رو با روشی که دوستمون بالا گفتن ذخیره کنید و در برنامه پردازش، اگه همین انجمن رو سرچ کنید، نمونه کد کامل هم هست، که مکانیزم رو کامل پیاده کرده، هر چند دوستمون در بالا کدشون اصل مطلب رو رسونده



                          سلام
                          اول اینو بگم که دستور getc که اصن کد ویژن ارور داد و نمیشناخت این دستور رو که من از getchar استفاده کردم که اونم تو وقفه کار نکرد وباعث هنگ کردن میکرو میشد
                          اومدم از روش دوستمون استفاده کردم و یه ارایه تعریف کردم و اطلاعات رو همون جا ریختم توش و درست کار کرد
                          فقط مشکل اینجا بود که من نمیدونستم data کجا تموم میشه و ایندکس رو صفر کنم من اومدم تو وقفه یه شرط گزاشتم که هروقت کاراکتر نال رو دریافت کرد ایندکس رو صفر کنه که البته جواب نداد ممنون میشم درباره ی این موضوع راهنمایی بفرمایید

                          دیدگاه


                            #14
                            پاسخ : مشکل در وقفه سریال

                            نوشته اصلی توسط mohammadt3000



                            سلام
                            اول اینو بگم که دستور getc که اصن کد ویژن ارور داد و نمیشناخت این دستور رو که من از getchar استفاده کردم
                            فقط مشکل اینجا بود که من نمیدونستم data کجا تموم میشه و ایندکس رو صفر کنم
                            1- توی اینتراپت نیازی به دستورهای گرفتن دیتا نداریم خود بافر دریافت UDR رو بخونیم و توی متغیر بریزیم کافی هست
                            2- شما وقتی از ارتباط سریال استفاده میکنید باید از پروتکل استاندارد استفاده کنید یا یک پروتکل برای خودتون ایجاد کنید . مثلا اگر با یک ماژول خاص کار میکنید باید ببینید ساختار دیتای اون چطور هست و همون رو پیاده کنید . اگر ارتباط بین دو میکرو یا میکرو و کامپیوتر هست ، باید پروتکلی در نظر بگیرید که توش یا طول بسته ها ثابت باشه (مثلا 5 کاراکتر در هر بسته ) یا اینکه ابتدا و انتهای هر بسته با کاراکتر خاصی مشخص بشه (مثلا 0x02 در ابتدا و 0x03 انتها) و طول بسته رو در داخل خود بسته مثلا در کاراکتر دوم بیان کنید تا گیرنده متوجه بشه کی ایندکس صفر میشه .
                            Don't hesitate to ask any question ..

                            دیدگاه


                              #15
                              پاسخ : مشکل در وقفه سریال

                              نوشته اصلی توسط mohammadt3000

                              سلام
                              اول اینو بگم که دستور getc که اصن کد ویژن ارور داد و نمیشناخت این دستور رو که من از getchar استفاده کردم
                              فقط مشکل اینجا بود که من نمیدونستم data کجا تموم میشه و ایندکس رو صفر کنم
                              1- توی اینتراپت نیازی به دستورهای گرفتن دیتا نداریم خود بافر دریافت UDR رو بخونیم و توی متغیر بریزیم کافی هست
                              2- شما وقتی از ارتباط سریال استفاده میکنید باید از پروتکل استاندارد استفاده کنید یا یک پروتکل برای خودتون ایجاد کنید . مثلا اگر با یک ماژول خاص کار میکنید باید ببینید ساختار دیتای اون چطور هست و همون رو پیاده کنید . اگر ارتباط بین دو میکرو یا میکرو و کامپیوتر هست ، باید پروتکلی در نظر بگیرید که توش یا طول بسته ها ثابت باشه (مثلا 5 کاراکتر در هر بسته ) یا اینکه ابتدا و انتهای هر بسته با کاراکتر خاصی مشخص بشه (مثلا 0x02 در ابتدا و 0x03 انتها) و طول بسته رو در داخل خود بسته مثلا در کاراکتر دوم بیان کنید تا گیرنده متوجه بشه کی ایندکس صفر میشه .
                              Don't hesitate to ask any question ..

                              دیدگاه

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