در قسمت بعدی از سری آموزش راه اندازی Virtual COM Port(VCP) با واحد جانبی USB برای میکروکنترلر STM32، چگونگی دریافت داده با طول نامشخص رو با هم مورد بررسی قرار میدیم.
ما دقیقا از پیکربندی مشابه پروژه ای که برای ارسال داده به سیستم کامپیوتر از طریق پورت مجازی که در جلسه قبل تنظیمات اون رو آموزش دیدیم استفاده میکنیم البته نیازه کمی اصلاحات انجام بدیم.
()CDC_Receive_FS در هدر usbd_cdc_if.h به صورت استاتیک تعریف شده، این مسئله باعث میشه که ما نتونیم اونو خارج از اون فایل مثلا درmain.c استفاده کنیم.
USB CDC software stack عملیات دریافت داده رو برای ما مدیریت میکنه. به همین خاطر ما نیازی نداریم که عملیات خوندن دیتا رو به صورت دستی انجام بدیم. به جای این مسئله ما از یک تابع callback استفاده میکنیم که هر موقع یک packet از داده دریافت میشه ما رو مطلع میکنه. داخل تابع callback ما داده دریافتی رو به صورت loopback دوباره برای سیستم ارسال میکنیم تا یک حالت اکو ایجاد بشه و بتونیم صحت عملیات دریافت رو زیر نظر داشته باشیم.
برای دریافت صحیح داده باید گام های زیر رو برداریم:
گام اول
;void USB_CDC_RxHandler(uint8_t*, uint32_t) رو به هدر main.h پروژه اضافه کنید.
گام دوم
تابع زیر رو به سورس فایل main.c پروژه اضافه کنید.
void USB_CDC_RxHandler(uint8_t* Buf, uint32_t Len)
}
; CDC_Transmit_FS(Buf, Len)
{
گام سوم
به هدر usbd_cdc_if.h مراجه کنید و تابع ()CDC_Receive_FS رو پیدا کنید و محتویات اون رو به شکل زیر تغییر بدین
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
}
;USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0])
;USBD_CDC_ReceivePacket(&hUsbDeviceFS)
;USB_CDC_RxHandler(UserRxBufferFS, *Len)
;memset(UserRxBufferFS, '\0', *Len)
;return (USBD_OK)
{
خب کار ما اینجا تمومه و هر چی لازم بوده رو انجام دادیم! البته که واضحه شما میتونین با داده دریافتی هر عملیاتی که دوست داشتین رو انجام بدین و ما صرفا برای سادگی یک مثال بسیار آسون رو به شما نمایش دادیم
سورس کد پروژه دریافت داده ارسالی از سریال ترمینال به کمک USB CDC VCP RECEIVE EXAMPLE
نتیجه اجرای کد
امیدواریم از این آموزش استفاده برده باشید!
دانلود سورس کد پروژه
با سایر آموزش های اصفهان درایو همراه باشید!