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

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

با نمونهسازیکردن از 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 کردن، این تابع سعی میکند مقادیری که قابل چاپ هست را به صورت کاراکتر نمایش نشان دهد. در صورتی که بایت قابل نمایش نباشد، مقدار هگز آن را نمایش میدهد. برای دسترسی به مقدار ده دهی دریافتی اندیس صفر از پاسخ دریافتی را انتخاب میکنیم.
با اجرای برنامه، در خروجی مشاهده میکنیم که میکروکنترلر حاصلجمع 21 و 55 که 76 میشود را ارسال کرده است.

خروجی:

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

خروجی:

این مثال را میتوان به روشهای دیگر مانند زیر هم پیادهسازی کرد:
دادههایی که میخواهیم ارسال کنیم را میتوان در چند مرحله ارسال کرد.

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

خروجی:


خروجی:

فایلهای این آموزش را میتوانید از لینک گیتهاب زیر دانلود نمایید:
https://github.com/sphrk/stm32_USB_CDC_Example
داکیومنت کتابخانه serial:
سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.