اطلاعیه

Collapse
No announcement yet.

برنامه نویسی ارتباط سریال

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

    برنامه نویسی ارتباط سریال

    باسلام
    در میکرو ها تا جاییکه من دیدم برای دریافت از طریق سریال باید تعداد کاراکتر هایی که انتظار دریافتشونو داریم بدونیم تا بتونیم درست کار کنیم(حداقل در توابع هال و stm32 که من کار میکنم اینطوری هست....البته این در صورتی هست که بخواهیم دریافت همراه با وقفه داشته باشیم وگرنه میشه زمانی رو برای این کار مشخص کرد که دیگه میکرو روی این دستور متوقف میشه!!)
    اما این موضوع یه سری جاها مشکل ساز میشه
    بعنوان مثال من الان با ماژول وایفای esp8266 دارم کار میکنم،وقتی منتظر دریافت پیغامی از طریق ارتباط سریال از این ماژول هستم،حتما باید تعداد کاراکتر هارو مشخص کنم و از اونجایی که ممکنه همیشه تعداد کاراکتر هایی که قراره دریافت بشن مشخص نیست با مشکل مواجه میشم!!

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

    این کار توی خود همین ماژول esp8266 پیاده سازی شده و تا وقتی کاراکتر های به کد اسکی ده و سیزده رو دریافت نکنه واکنشی نسبت به کاراکتر های قبلی نشون نمیده و این در عین حالیه که باودریت هم میتونه مقادیر بالایی داشته باشه
    باتشکر از دوستان
    ................Fx7SAM................

    #2
    پاسخ : برنامه نویسی ارتباط سریال

    از دوستان کسی که به داد ما نرسید
    این مدت بجز راهی که در بالا گفتم،یک راه دیگه هم به ذهنم رسیده.....
    اینکه بیایم و دریافت از پورت سریال رو بجای دریافت با وقفه،با DMA انجام بدیم و در حلقه اصلی برنامه مدام ارایه ای که کاراکتر ها توش ریخته میشن رو انالیز کنیم و اگر به کاراکتر های خاص مورد نظرمون رسیدیم عمل مقتضی انجام بشه و بافر پاک بشه و دیافت از نو انجام بشه
    نظرتون چیه؟
    ................Fx7SAM................

    دیدگاه


      #3
      پاسخ : برنامه نویسی ارتباط سریال

      نوشته اصلی توسط سیدعلی.م نمایش پست ها
      باسلام
      در میکرو ها تا جاییکه من دیدم برای دریافت از طریق سریال باید تعداد کاراکتر هایی که انتظار دریافتشونو داریم بدونیم تا بتونیم درست کار کنیم(حداقل در توابع هال و stm32 که من کار میکنم اینطوری هست....البته این در صورتی هست که بخواهیم دریافت همراه با وقفه داشته باشیم وگرنه میشه زمانی رو برای این کار مشخص کرد که دیگه میکرو روی این دستور متوقف میشه!!)
      اما این موضوع یه سری جاها مشکل ساز میشه
      بعنوان مثال من الان با ماژول وایفای esp8266 دارم کار میکنم،وقتی منتظر دریافت پیغامی از طریق ارتباط سریال از این ماژول هستم،حتما باید تعداد کاراکتر هارو مشخص کنم و از اونجایی که ممکنه همیشه تعداد کاراکتر هایی که قراره دریافت بشن مشخص نیست با مشکل مواجه میشم!!

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

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

      سلام
      منظورت این دستور هست :
      (HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout

      خب برای اینکه دیگه نخوای تعداد کاراکترها رو مشخص کنی از ()sizeof استفاده کن
      مثلا این :
      (HAL_UART_Transmit(&huart1,show,sizeof(show),1000

      ! Life doesn't get easier , you just get stronger

      دیدگاه


        #4
        پاسخ : برنامه نویسی ارتباط سریال

        نوشته اصلی توسط Blue Ice نمایش پست ها
        سلام
        منظورت این دستور هست :
        (HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout

        خب برای اینکه دیگه نخوای تعداد کاراکترها رو مشخص کنی از ()sizeof استفاده کن
        مثلا این :
        (HAL_UART_Transmit(&huart1,show,sizeof(show),1000

        نه....مشکل من توی دریافته
        توی ارسال که خب تعداد کاراکترهارو میدونیم و بقول خود شما هم میتونیم از تابع سایز رشته استفاده کنیم
        ولی توی دریافت چون نمیدونیم چه دستوری قراره بیاد این مشکل پیش میاد
        ................Fx7SAM................

        دیدگاه


          #5
          پاسخ : برنامه نویسی ارتباط سریال

          نوشته اصلی توسط سیدعلی.م نمایش پست ها
          نه....مشکل من توی دریافته
          توی ارسال که خب تعداد کاراکترهارو میدونیم و بقول خود شما هم میتونیم از تابع سایز رشته استفاده کنیم
          ولی توی دریافت چون نمیدونیم چه دستوری قراره بیاد این مشکل پیش میاد
          سلام
          به کد زیر دقت کن:
          کد:
          void flush (void) 
          {
            for (int y=0;y<250;y++)
              str[y]=0;
               b=0;
          } 
          
          void HAL_UART_RxCpltCallback (UART_HandleTypeDef *huart)
          {
                str[b]=data[0];
                b++;
                str[b]=0; 
                if (b>249) flush();    
                 HAL_UART_Receive_IT(&huart1,(unsigned char*)data,1);         
          }
          تابع دوم مربوط به وقفه سریال هست که دیتای دریافتی رو در رشته str ذخیره میکنه و اگر مقدار این رشته بزرگتر از 250 شد کل رشته رو پاک میکنه ، به عبارتی دیتای دریافتی از سریال رو بافر میکنه و دوباره وقفه سریال جهت دریافت یک بایت فعال میشه
          متغیر data یک آرایه 2 بایتی و متغیر str یک آرایه 250 بایتی هست که بسته به رم میکرو و نیازتون میتونید مقدار رو افزایش یا کاهش بدید
          اگر جایی رو متوجه نشدید بگیر بیشتر توضیح بدم
          موفق باشی

          دیدگاه


            #6
            پاسخ : برنامه نویسی ارتباط سریال

            سلام
            برای رشته هایی که حجم داده هاشون از قبل مشخص نیست باید سه شیوه رو همزمان به کار بگیرید، کارکتر انتهای رشته ، زمان دریافت رشته و حدااکثر طول رشته. به عنوان مثال اگر رشته با کارکتر x ختم نشد به خواندن ادامه بدهد اما اگر ارتباط قطع شد وضعیت به چه صورت خواهد بود؟ به دو صورت متفاوت می شود عمل کرد اگر مجددا رشته جدید دریافت شد با کارکتر ابتدایی رشته قبلی و ناکامل باید حذف شود و داده جدید دریافت شود و یا با تعیین حداکثر نرخ دریافت زمان اتمام را تخمین زد تا رشته معیوب یا کامل بین ارسال ها تعیین شود. همچنین در ارتباط سریال با تعیین وضعیت IDLE بودن خط می تونید اتمام و دریافت را بررسی کنید
            هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

            دیدگاه


              #7
              پاسخ : برنامه نویسی ارتباط سریال

              سلام.
              بنظر من شما چون تعداد کارکترهای دریافتی مشخص نیست شما با استفاده از وقفه uart کاراکتر دریافتی رو توی یک متغییر از نوع char بریز و قتی کد 13 آمد مقدار بافر توی یک اشاره گر بریزیعد از اشاره گر برای مقایسه شرط استفاده کن . موفق باشید.

              دیدگاه


                #8
                پاسخ : برنامه نویسی ارتباط سریال

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

                دیدگاه


                  #9
                  پاسخ : برنامه نویسی ارتباط سریال

                  باتشکر از همه دوستانی که کمک کردن
                  فکر میکنم به جواب رسیدم و همونطور که دوستان گفتن باید عمل کنم
                  ممنونم
                  ................Fx7SAM................

                  دیدگاه

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