راه‌اندازی ارتباط USB در STM32 – قسمت چهارم (ارسال و دریافت داده با Python)

به نام خدا 1404-11-25 راه‌اندازی ارتباط USB در STM32 – قسمت چهارم (ارسال و دریافت داده با Python)
18 بازدید
۱۴۰۴-۱۱-۲۹
6 دقیقه
  • نویسنده: Sepehr Kouzegaran
  • درباره نویسنده: ---

 در قسمت قبل یک بافر FIFO پیاده‌سازی کرده و با نحوه‌ی دریافت و پردازش داده‌های دریافتی با استفاده از FIFO آشنا شدیم. در قسمت‌های قبلی برای ارسال و دریافت داده به میکروکنترلر از یک نرم‌افزار پورت سریال مانند QCom، Termit، TeraTerm و… استفاده می‌کردیم. در این قسمت می‌خواهیم با استفاده از پایتون با میکروکنترلر ارتباط برقرار کرده و ارسال و دریافت داده را انجام دهیم.

✅ نکته

مطالبی که در این قسمت برای ارسال و دریافت داده با پایتون مطرح می‌شود را می‌توانید برای ارسال و دریافت داده از طریق ارتباط UART با میکروکنترلر هم استفاده کنید.

نصب کتابخانه و نمونه‌سازی از کلاس Serial

برای ارسال و دریافت داده از طریق پورت سریال با پایتون می‌توانیم از کتابخانه serial استفاده کنیم. برای نصب این کتابخانه، ترمینال یا خط فرمان را باز کرده و با pip install pyserial این کتابخانه را نصب می‌کنیم.

نصب کتابخانه و نمونه‌سازی از کلاس Serial

یک فایل پایتون ایجاد کرده و در آن serial را import می‌کنیم. برای ارسال و دریافت از طریق سریال با پایتون، از کلاس Serial نمونه می‌سازیم. در آرگومان اول، پورت سریالی که می‌خواهیم ارتباط برقرار کنیم و در آرگومان دوم بادریت را ارسال می‌کنیم. در آرگومان سوم به‌صورت اختیاری می‌توان زمان timeout برای دریافت را تعیین کرد (بر حسب ثانیه).

نصب کتابخانه و نمونه‌سازی از کلاس Serial

باز و بسته کردن پورت سریال

با نمونه‌سازی‌کردن از Serial پورت سریالی که مشخص کرده‌ایم را باز می‌کند. درصورتی‌که پورت سریال که اسم آن را هنگام نمونه‌سازی مشخص کرده‌ایم به کامپیوتر وصل نشده باشد، موقع باز کردن پورت سریال خطا رخ می‌دهد. در ویندوز اسم پورت سریالی که میکروکنترلر به آن وصل شده است را می‌توان از Device Manager مشاهده کرد. برای بستن پورت، متد close را صدا می‌زنیم. برای باز کردن پورت سریال از متد open استفاده می‌کنیم.

با صدازدن reset_input_buffer، بافر ورودی پاک می‌شود. بعد از باز کردن پورت سریال ممکن است بخواهیم از پاک بودن بافر سریال ورودی مطمئن شویم، در این صورت این متد را فراخوانی می‌کنیم.

پس از باز کردن پورت سریال، می‌توانیم داده ارسال و دریافت کنیم. در انتهای کار لازم است پورت را ببندیم. توجه داشته باشید که اگر پورت بسته باشد و بخواهیم داده ارسال کنیم خطا رخ می‌دهد. برای بررسی باز بودن پورت سریال می‌توان از ویژگی is_open استفاده کرد.

باز و بسته کردن پورت سریال

میکروکنترلر را با برنامه‌ای که در قسمت سوم پیاده‌سازی کرده‌ایم، پروگرام کرده و با کابل USB به کامپیوتر وصل می‌کنیم. با بررسی Device Manager مشاهده می‌کنیم که به پورت COM4 وصل شده است. برنامه پایتون را اجرا می‌کنیم.

خروجی:

باز و بسته کردن پورت سریال

ارسال داده

برای ارسال داده از write استفاده می‌کنیم. توجه داشته باشید که این تابع در ورودی، داده‌ای که می‌خواهد ارسال کند را از نوع bytes یا bytearray دریافت کرده و ارسال می‌کند. همچنین می‌توان به آن اعداد صحیح (یک بایتی) را در یک لیست ارسال کرد. اگر بخواهیم یک رشته ارسال کنیم بایستی رشته را به bytes تبدیل کنیم. برای این کار می‌توان از متد encode رشته استفاده کرد و یا در ابتدای رشته قبل از کوتیشن، کاراکتر b را قرار دهیم.

ارسال داده

پس از تبدیل‌کردن رشته به bytes آن را با استفاده از write می‌توانیم ارسال کنیم. در برنامه زیر پس از باز کردن پورت،  Hello را ارسال کرده و سپس پورت را می‌بندیم.

ارسال داده

می‌خواهیم اعداد هگز 55، AB و 8 را ارسال کنیم. برای اینکار می‌توانیم از یک رشته از نوع bytes استفاده کنیم و یا مقادیر را در یک لیست قرار داده و ارسال کنیم.

ارسال داده

دریافت داده

برای دریافت داده از متد read استفاده می‌کنیم. با صدازدن آن به‌صورت پیش‌فرض یک بایت می‌خواند. برای خواندن تعداد بایت بیشتر، تعداد را به تابع read ارسال می‌کنیم. این تابع نتیجه را به‌صورت آرایه‌ی bytes بر می‌گرداند.

تابع read درصورتی‌که تعداد داده‌ی کافی در بافر وجود داشته باشد آن‌ها را خوانده و بر می‌گرداند، در غیر این صورت به مدت timeout ثانیه صبر می‌کند تا بافر با تعداد داده کافی پر شود تا بتواند آن‌ها را بخواند. اگر مدت‌زمان timeout سپری شود و داده‌ی کافی در بافر وجود نداشته باشد، تابع read داده‌هایی که توانسته است بخواند را بر می‌گرداند.

دریافت داده

برقراری ارتباط بین میکروکنترلر و برنامه پایتون

برنامه‌ای که در قسمت قبل پیاده‌سازی کردیم، میکروکنترلر با دریافت مقدار 0x55 رشته‌ی Hello world\n را ارسال می‌کند. در پایتون مقدار 55 هگز را ارسال کرده و سپس 12 بایت را می‌خوانیم. همان‌طور که قبلاً هم اشاره کردیم، خروجی تابع از نوع bytes می‌باشد. با استفاده از متد decode می‌توان داده‌های دریافتی را به رشته تبدیل کرد.

برقراری ارتباط بین میکروکنترلر و برنامه پایتون

خروجی:

برقراری ارتباط بین میکروکنترلر و برنامه پایتون

برنامه‌ای که در میکروکنترلر نوشته‌ایم با دریافت 01 دو مقدار بعدی که دریافت می‌کند را با هم جمع کرده و ارسال می‌کند. در پایتون مقدار 01 را ارسال کرده و پس از آن دو مقدار 21 و 55 را ارسال می‌کنیم. سپس یک بایت می‌خوانیم. داده‌ی دریافتی که از نوع bytes می‌باشد، موقع print کردن، این تابع سعی می‌کند مقادیری که قابل چاپ هست را به صورت کاراکتر نمایش نشان دهد. در صورتی که بایت قابل نمایش نباشد، مقدار هگز آن را نمایش می‌دهد. برای دسترسی به مقدار ده دهی دریافتی اندیس صفر از پاسخ دریافتی را انتخاب می‌کنیم.

شاید برای شما مفید باشد:
کدام نسخه ی آلتیوم دیزاینر Altium  Designer ؟

با اجرای برنامه، در خروجی مشاهده می‌کنیم که میکروکنترلر حاصل‌جمع 21 و 55 که 76 می‌شود را ارسال کرده است.

برقراری ارتباط بین میکروکنترلر و برنامه پایتون

خروجی:

برقراری ارتباط بین میکروکنترلر و برنامه پایتون

پس از ارسال 0x01، 21 و 55 مقدار 0xAA و 0xFA را ارسال می‌کنیم و دو بایت ارسال شده توسط میکروکنترلر را می‌خوانیم.

برقراری ارتباط بین میکروکنترلر و برنامه پایتون

خروجی:

برقراری ارتباط بین میکروکنترلر و برنامه پایتون

این مثال را می‌توان به روش‌های دیگر مانند زیر هم پیاده‌سازی کرد:

  • روش دیگر اول:

داده‌هایی که می‌خواهیم ارسال کنیم را می‌توان در چند مرحله ارسال کرد.

برقراری ارتباط بین میکروکنترلر و برنامه پایتون

  • روش دیگر دوم:

دریافت داده‌ها را می‌توان در چند مرحله انجام داد.

برقراری ارتباط بین میکروکنترلر و برنامه پایتون

خروجی:

برقراری ارتباط بین میکروکنترلر و برنامه پایتون

  • روش دیگر سوم:

برقراری ارتباط بین میکروکنترلر و برنامه پایتون

خروجی:

برقراری ارتباط بین میکروکنترلر و برنامه پایتون

فایل‌های این آموزش را می‌توانید از لینک گیت‌هاب زیر دانلود نمایید:

https://github.com/sphrk/stm32_USB_CDC_Example

 

داکیومنت کتابخانه serial:

https://pyserial.readthedocs.io/en/latest/shortintro.html

اطلاعات
18
0
0
اشتراک و حمایت
profile نویسنده: Sepehr Kouzegaran متخصص الکترونیک

ویراستار: مریم میریان
مقالات بیشتر

slide

پالت | بازار خرید و فروش قطعات الکترونیک

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

آیسی | موتور جستجوی قطعات الکترونیک

سامانه آی سی سیسوگ (Isee) قابلیتی جدید و کاربردی از سیسوگ است. در این سامانه سعی شده است که جستجو، انتخاب و خرید مناسب تر قطعات برای کاربران تسهیل شود. جستجو در آیسی
family

سیسوگ‌شاپ | فروشگاه محصولات Quectel

فروشگاه سیسوگ مجموعه ای متمرکز بر تکنولوژی های مبتنی بر IOT و ماژول های M2M نظیر GSM، GPS، LTE، NB-IOT، WiFi، BT و ... جایی که با تعامل فنی و سازنده، بهترین راهکارها انتخاب می شوند. برو به فروشگاه سیسوگ
family

سیسوگ فروم | محلی برای پاسخ پرسش‌های شما

دغدغه همیشگی فعالان تخصصی هر حوزه وجود بستری برای گفتگو و پرسش و پاسخ است. سیسوگ فروم یک انجمن آنلاین است که بصورت تخصصی امکان بحث، گفتگو و پرسش و پاسخ در حوزه الکترونیک را فراهم می‌کند. پرسش در سیسوگ فرم
family

سیکار | اولین مرجع متن باز ECU در ایران

بررسی و ارائه اطلاعات مربوط به ECU (واحد کنترل الکترونیکی) و نرم‌افزارهای متن باز مرتبط با آن برو به سیکار
become a writer
نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
become a writer
نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله

خانواده سیسوگ

سیسوگ‌شاپ

فروشگاه محصولات Quectel

پالت
سیسوگ فروم

محلی برای پاسخ پرسش‌های شما

سیسوگ جابز
سیسوگ
سیسوگ فروم
سی‌کار

اولین مرجع متن باز ECU در ایران

سیسوگ مگ
آی‌سی

موتور جستجوی قطعات الکترونیکی

سیسوگ آکادمی
پالت

بازار خرید و فروش قطعات الکترونیک

دیدگاه ها

become a writer
نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
become a writer
نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله