با سلام و وقت بخیر
من در حال راه اندازی ماژول LC86L با میکرو Stm32 هستم، برای دریافت رشته های خروجی از ماژول اومدم از وقفه ی یوآرت استفاده کردم، ولی وقتی ماژول دیتا ارسال میکنه، بعد از دریافت اولین کاراکتر میکرو خطای
/* UART Over-Run interrupt occurred
میده ، تابع دریافت رشته رو هم به صورت زیر استفاده کردم ،
HAL_UART_Receive_IT(&huart5, GPS_DATA, 100);
کسی از دوستان میتونن کمک کنن؟؟ ممنون میشم
سلام دوست عزیز
معمولا خطای Over run در مواقعی زخ میده که شما زمان زیادی را در اینتراپت UART و یا اینتراپت دیگری با اولویت بالاتر صرف می کنید. لطفا این موارد رو بررسی کنید :
- فلگ RXNE رو پس از دریافت استرینگ از UART ریست کنید. از ترکیب زیر هم میتونید استفاده کنید.
__HAL_UART_CLEAR_FLAG()
HAL_UART_Receive_IT()
- از استفاده از Delay در اینتراپت ها پرهیز کنید
- هندل کردن دیتاهای دریافتی رو در اینتراپت انجام ندید و به یک تسک دیگه بسپارید (در صورتی که از سیستم عامل استفاده نمیکنید، در فانکشن دیگری در main.c دیتاهاتونو رو پارس کنید)
- حجم زیادی از کد رو داخل اینتراپت قرار ندید
- از فانکشن هایی مثل Print در اینتراپت UART به خصوص در این پروژه شما که حجم دیتا دریافتی زیاد هست استفاده نکنید .
- مورد آخر هم اینکه زمانی که حجم دیتا دریافتی زیاد هست، از رینگ بافر یا DMA استفاده کنید.
با سلام مجدد و تشکر از پاسختون
در کدی که الان دارم هیچ کد دیگه ای ندارم جز همین دریافت اطلاعات GPS، یعنی وقفه برای هیچ پریفرالی جز همین یوآرت فعال نیست، من بالای حلقه ی while(1) اومدم تابع زیر رو نوشتم :
HAL_UART_Receive_IT(&huart5, GPS_DATA, 100);
طبق این آموزش در تابع HAL_UART_RxCpltCallback مجددا اومدم همین تابع رو صدا زدم، در توابع وقفه در فایل stm32xx_it.c هم هیچ کاری نکردم، حالا الان جالبه بعضی اوقات رویه درست کار میکنه و دیتارو دریافت میکنه 100 بایت 100 بایت، بعضی اوقات هم یک بایت دریافت میکنه و ارور Over run میده و چند بار که دستی ریست میکنم دوباره رویه درست انجام میشه!! یعنی ریست که میکنم بعضی مواقع درست کار میکنه یعضی مواقع خیر
متاسفانه از لحاظ سخت افزاری به یوآرتی وصل شدم که dma نداره
برای اینکه بعد Over run لازم نباشه ریست کنید، میتونید فلگ over run رو clear کنید که خب این به معنی از دست رفتن دیتا هست. برای این کار به یوزر منوال میکرویی که استفاده میکنید رجوع کنید تا رجیستر یا مایکرو مربوط بهش رو پیدا کنید. ( که البته احتمالا با این وجود بازهم اورران اتفاق می افته).
اما برای جلوگیری از این اتفاق ی پیشنهاد دیگه هم دارم :
من معمولا از LL و SPL استفاده میکنم و به این مشکل نمیخورم، اما برای اینکه در HAL این اتفاق رو بشه ازش جلو گیری کرد میتونید از فانکشن HAL_UARTEx_ReceiveToIdle_IT بجای HAL_UART_Receive_IT استفاده کنید.