در قسمت قبل با نحوهی راهاندازی و ارسال داده از طریق واحد USB میکروکنترلر STM32F103 آشنا شدیم. در این قسمت میخواهیم با نحوهی دریافت داده از USB در میکروکنترلر آشنا شویم. در این آموزش مثالی که پیادهسازی میکنیم، دادههای ارسال شده از کامپیوتر را با USB دریافت کرده و آنها را مجدد از طریق USB به کامپیوتر ارسال میکند.
موقع دریافت داده از USB، تابع callback مربوط به دریافت اجرا میشود. این تابع در فایل usbd_cdc_if.c قرار دارد.
در Callback مربوط به دریافت داده از USB، میخواهیم دادهی دریافت شده را در آرایهی دیگری (بافر موقت) کپی کرده و از آن استفاده کنیم. در فایل main.c یک آرایه به نام buff و یک متغیر به نام len را بهصورت gloabal تعریف میکنیم. داده های دریافت شده را میخواهیم در آرایهی buff کپی کنیم.

اینجا طول آرایه را 128 در نظر گرفته ایم. بهتر است طول آرایهی buff را برابر با طول آرایهی بافر داخلی که برای دریافت در نظر گرفته شده است در نظر بگیریم. سایز بافر ارسال و دریافت را میتوان در CubeMX تغییر داد (قسمت Middleware قسمت USB_DEVICE قسمت Parameter Settings). سایز هر دو بافر در فایل usbd_cdc_if.h به صورت ماکرو تعریف میشوند.

در فایل usbd_cdc_if.c از روی این دو مقدار، بافرهای ارسال و دریافت داخلی تعریف میشوند.

با برابر درنظرگرفتن طول آرایهی buff (که خودمان تعریف کردیم) با UserRxBufferFS، موقع دریافت دادههای بزرگ دچار مشکل سرریز بافر نمیشویم. موقع تعریفکردن buff میتوانیم از ماکرو APP_RX_DATA_SIZE استفاده کنیم و طول آرایه را برابر با این مقدار در نظر بگیریم (uint8_t buff[APP_RX_DATA_SIZE]).
در داخل تابع CDC_Receive_FS ابتدا دو متغیر buff و len را extern کرده و دادههای دریافت شده را به آرایهی buff کپی میکنیم. برای این کار میتوان از تابع memcpy استفاده کرد. طول دادهی دریافت شده را هم در متغیر len قرار میدهیم.

در فایل main.c میخواهیم پیامهای دریافت شده را مجدد ارسال کنیم. برای این کار در داخل حلقهی while مقدار متغیر len را بررسی میکنیم. درصورتیکه مقدار آن غیرصفر باشد محتوای موجود در آرایهی buff را ارسال میکنیم (مقدار اولیه متغیر len باید صفر در نظر گرفته شود). پس از ارسالکردن دادهی دریافتی، در len مقدار صفر را قرار میدهیم تا به صورت تکراری ارسال انجام نشود.
برنامه را کامپایل کرده و میکروکنترلر را پروگرام میکنیم. میکروکنترلر را با کابل USB به کامپیوتر وصل کرده و برنامهی QCom را باز میکنیم. پورت را بازکرده و متن abcd را ارسال میکنیم. پس از ارسالکردن داده، میکروکنترلر همان پیام را برای ما ارسال میکند.

مثال دوم:

در قسمت بعدی آموزش، برای دریافت داده از FIFO استفاده میکنیم.
فایلهای این آموزش را میتوانید از لینک گیتهاب زیر دانلود نمایید:
سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.