اطلاعیه

Collapse
No announcement yet.

** سوالاتی در باب ارتباط UART

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

    ** سوالاتی در باب ارتباط UART

    سلام دوستان!
    سوال اولی واجبه،اگه حوصله داشتید الباقی رو هم جواب بدید!

    زبان برنامه نویسی: کدویژن
    1- فرض کنید تو یه ارتباط سریال داریم تعداد نا معلومی کاراکتر دریافت میکنیم(100-280-500 کاراکتر؟ تعدادنامعلومه!)، زمان شروع ارسال رو میشه فهمید(با فعال کردن وقفه دریافت)، اما از کجا بفهمیم کاراکترها کامل دریافت شدن؟

    2- اگه راه خاصی نیست خودم یه ایده به ذهنم رسید: بیام و 10ms صبر کنم،اگه وقفه دریافت رخ نداد،میفهمم که کاراکترها کامل دریافت شدن(چون این تعداد نامعلوم کاراکتر با سرعت بالا و بدون تاخیر-همه پشت سر هم- به میکرو ارسال میشن)،اما یه مشکلی هست: این 10ms رو کجا قرار بدم؟ (اگه بعد از هر دریافت قرار بدم که تعدادی کاراکتر این وسط از بین میرن)

    3- اگه از دستور getchar استفاده کنیم، برنامه صبر میکنه تا یه کاراکتر وارد شه، حالا راهی هست که بهش بگیم، مثلا 50ms ثانیه صبر کن و اگه کاراکتری نیومد،برو خط بعد(لطفا نگید که از وقفه دریافت استفاده کن!)

    پیشاپیش ممنون...
    اونچيزي که در دانشگاه ياد ميگيريد، "الفبايي" هست براي نوشتن يک "رمان" !!

    #2
    پاسخ : ** سوالاتی در باب ارتباط UART

    نوشته اصلی توسط ☺بابابرقی☺
    سلام دوستان!
    سوال اولی واجبه،اگه حوصله داشتید الباقی رو هم جواب بدید!

    زبان برنامه نویسی: کدویژن
    1
    3- اگه از دستور getchar استفاده کنیم، برنامه صبر میکنه تا یه کاراکتر وارد شه، حالا راهی هست که بهش بگیم، مثلا 50ms ثانیه صبر کن و اگه کاراکتری نیومد،برو خط بعد(لطفا نگید که از وقفه دریافت استفاده کن!)

    پیشاپیش ممنون...
    برای اینکه دستور getchar صبر نکنه بایستی بیت هشتم رجیستر USCRA برای فهمیدن حضور یک کاراکتر دریافتی چک بشه .مثلا دو خط زیر معادل یک getchar بدون صبره
    (if((UCSRA & 0x80)!=0
    ;()c=getchar
    حالا میشه به اندازه دلخواه تاخیر به getchar اضافه کرد.

    هنگام دریافت یک استرینگ از پورت سریال اخرین کاراکتر line feed با کد اسکی 10 دسیمال است شاید این کمکی بکنه.

    دیدگاه


      #3
      پاسخ : ** سوالاتی در باب ارتباط UART

      ممنون
      اما الان یکم فکر میکنم، میبینم مشکلم همچنان پا برجاست
      اون line feed هم چند باری بین رشته ها میاد و نمیشه فهمید کدومش به معنای اتمام ارساله! :angry:

      دوستان! برای این 2 سوال هم یه فکری بکنید! :redface:
      زبان برنامه نویسی: کدویژن
      1- فرض کنید تو یه ارتباط سریال داریم تعداد نا معلومی کاراکتر دریافت میکنیم(100-280-500 کاراکتر؟ تعدادنامعلومه!)، زمان شروع ارسال رو میشه فهمید(با فعال کردن وقفه دریافت)، اما از کجا بفهمیم کاراکترها کامل دریافت شدن؟

      2- اگه راه خاصی نیست خودم یه ایده به ذهنم رسید: بیام و 10ms صبر کنم،اگه وقفه دریافت رخ نداد،میفهمم که کاراکترها کامل دریافت شدن(چون این تعداد نامعلوم کاراکتر با سرعت بالا و بدون تاخیر-همه پشت سر هم- به میکرو ارسال میشن)،اما یه مشکلی هست: این 10ms رو کجا قرار بدم؟ (اگه بعد از هر دریافت قرار بدم که تعدادی کاراکتر این وسط از بین میرن)
      اونچيزي که در دانشگاه ياد ميگيريد، "الفبايي" هست براي نوشتن يک "رمان" !!

      دیدگاه


        #4
        پاسخ : ** سوالاتی در باب ارتباط UART

        ببینم اولویت وقفه تایمر ها نسبت به USART چقدره؟ :-?
        به ازای هر وقفه UART میتونید از اون به بعد بگید که تایمر بشماره تا 10ms بگذره(مثلا)
        اگه تایمر به 10ms رسید میاید و میگید تموم شد رفت
        اگه دیتا رسید تو وقفه USART رجیستر Counter تایمر رو صفر میکنید تا از اول بشماره
        این درباره ایده خودتون
        در مورد صورت مسئله
        خوب یه سری دیتا میاد والا اون دستگاه یه چیزی باید داشته باشه که بگه دیتا تموم شد یا با فرستادن یه کارکتر همینو بگه
        اگه نه که من نمیدونم :-??
        حالا اون دستگاه چی هست؟

        دیدگاه


          #5
          پاسخ : ** سوالاتی در باب ارتباط UART

          ممنون شهریار جان!
          راهنماییتون به جا بود(تایمر) اما من نمیخوام از تایمر استفاده کنم
          دستگاهمم ماجول GPS هستش
          مشکل رو حل کردم :applause: :nerd:
          از همون ایده اولیم!
          الگوریتم اینه(یه وقت دیدی به درد یکی دیگه هم خورد :agree:
          بعد از آخرین دریافت، مثلا 3ms صبر میکنیم و اگر همچنان داده جدیدی وارد نشده بود، از بافر دریافت Break میکنیم.
          جزء اصلی که این کارو انجام میده(فرض بر اینه که حداکثر 600کاراکتر دریافت میشه- بافر دریافت اینجا GPSData نام داره که یک آرایه 600کاراکتری تعریف شده) :
          کد:
          while(i!=600)
           {
          
          
            if((UCSRA & 0x80)!=0)
              {a=UDR;
              GPSData[i++]=a;}
            else
              {
          [color=red]    delay_ms(3);
              if((UCSRA & 0x80)!=0)
                {a=UDR;
                GPSData[i++]=a;}
              else break;
              }
          [/color] }
          GPSData[i]=0;
          UCSRB=0x00; //USART OFF
          من دنبال اون قسمت قرمزه بودم که بالاخره یافتمش
          ممنون از تمامی دوستان...
          اونچيزي که در دانشگاه ياد ميگيريد، "الفبايي" هست براي نوشتن يک "رمان" !!

          دیدگاه


            #6
            پاسخ : ** سوالاتی در باب ارتباط UART

            گیرنده های GPS معمولا خروجیشون با NMEA هست و پاین هر پک کاملا مشخصه. شروع اون هم مشخصه (این نحوه ارسال تو هر دستگاهی باید باشه یه جور هند شیک یه طرفه)

            دیدگاه


              #7
              پاسخ : ** سوالاتی در باب ارتباط UART

              نوشته اصلی توسط mojalan
              گیرنده های GPS معمولا خروجیشون با NMEA هست و پاین هر پک کاملا مشخصه. شروع اون هم مشخصه (این نحوه ارسال تو هر دستگاهی باید باشه یه جور هند شیک یه طرفه)
              فکر نمیکنم اینطور باشه، یعنی تا 90% مطمئنم! آخه چک کردم، جملاتش یه ترتیب خاصی دارن، اما پایان هر پکیج با هیچ کاراکتری مشخص نمیشه oo:
              ولی خب روش بالا تا الان که جواب داده :applause: :nice:
              اونچيزي که در دانشگاه ياد ميگيريد، "الفبايي" هست براي نوشتن يک "رمان" !!

              دیدگاه


                #8
                پاسخ : ** سوالاتی در باب ارتباط UART

                تمام دستورات NMEA با یک کاراکتر $ و 5 حرف شروع میشه. که تعداد آرگومانها و فرم شون هم مشخصه.
                ولی باید از همون روش مانیتور کردن زمان برای تعیین آخر کار استفاده کرد.
                اینجا رو ببینید:
                http://aprs.gids.nl/nmea/

                دیدگاه


                  #9
                  پاسخ : ** سوالاتی در باب ارتباط UART

                  سلام به همه دوستان عزیز.
                  نمیدونم جای این سوالم اینجا هست یا نه.

                  دوستان من میخوام از Uart0 و Uart1 میکرو به صورت همزمان استفاده کنم.یعنی هردوتاشون فعال باشن و بتونم دیتا رو رد و بدل کنم.
                  نمیدونم Uart1 هم اینتراپت داره یا نه.
                  در کل نمیدونم چطور میتونم Uart1 رو کانفیگ و راه اندازی کنم و دستور ارسال دیتا از Uart1 رو نمیدونم.
                  از دوستان عزیز کسی هست کار کرده باشه و اطلاعات داشته باشه؟ممنون میشم پاسخ بدید.

                  من با بسکام کار میکنم و مگا128

                  دیدگاه


                    #10
                    پاسخ : ** سوالاتی در باب ارتباط UART

                    دوستان کسی نیست سوال منو جواب بده؟

                    دیدگاه


                      #11
                      پاسخ : ** سوالاتی در باب ارتباط UART

                      بله داره(UART های سخت افزاری وقفه دارن)
                      میآ‌تونی از هر دو همزمان استفاده کنی و مشکلی پیش نمیاد.

                      دیدگاه


                        #12
                        پاسخ : ** سوالاتی در باب ارتباط UART

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

                        دیدگاه

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