مقدمه
UART (دریافت کننده/انتقال دهنده غیرهمزمان جهانی) یک پروتکل ارتباطی سریال است که در آن داده به صورت سریالی، یعنی بیت به بیت منتقل میشود. ارتباط سریال غیرهمزمان (Asynch) برای انتقال بایتی به وفور استفاده میشود. در ارتباط سریال غیرهمزمان، در هر لحظه یک بایت داده منتقل میشود.
پروتکل ارتباط سریال UART از یک ساختار فریم تعریف شده برای بایتهای داده استفاده میکند. ساختار فریم در ارتباط غیر همزمان شامل:
- بیت شروع (START): بیتی است که نشان میدهد که ارتباط سریال آغاز شده است. این بیت همواره پایین (low) است
- بستههای بیت داده: بیتهای داده میتوانند بستههای ۵ تا ۹ بیتی باشند. معمولاً از بستههای داده ۸ بیتی استفاده میکنیم، که همیشه پس از بیت شروع فرستاده میشوند.
- بیت پایان(STOP): این بیت به طور معمول یک یا دو بیت میباشد. این بیت پس از اتمام بستههای بیت داده ارسال میشود تا پایان فریم را مشخص کند. بیت پایان همواره بالا (high) میباشد.
معمولاً یک فریم از ارتباط سریال غیرهمزمان شامل یک بیت شروع ( ۱بیت) است که به دنبال آن یک بایت داده (۸ بیت) و سپس یک بیت پایان (۱ بیت) میآید، که در مجموع یک فریم ۱۰ بیته را تشکیل میدهد (شکل بالا). فریم ممکن است به جای یک بیت، شامل ۲ بیت پایان باشد، و همچنین میتواند دارای یک بیت توازن (PARITY) پس از بیت پایانی نیز باشد.
UART رزبریپای
رزبریپای داری دو UART داخلی به شرح زیر است.
- PL011 UART
- Mini UART
PL011 UART یک UART مبتنی بر آرم میباشد. این UART نسبت به mini UART بازدهی (throughput) بهتری دارد.
در رزبریپای ۳، mini UART برای خروجی کنسول لینوکس به کار میرود، در حالی که PL011 به ماژول بلوتوث روبرد متصل میشود.
در دیگر نسخههای رزبری پای، PL011 برای خروجی کنسول لینوکس استفاده میشود.
Mini UART از فرکانسی استفاده میکند که به فرکانس هسته GPU لینک است. بنابراین با تغییر فرکانس هسته GPU، فرکانس UART نیز تغییر میکند و در نتیجه buad rate برای UART عوض میشود. این مسئله منجر به ناپایداری mini UART میگردد که ممکن است از دست رفتن یا خرابی دادهها را دربرداشته باشد. برای پایدار کردن mini UART، باید فرکانس هسته را ثابت کنیم. Mini UART از بیت توازن پشتیبانی نمیکند.
PL011 یک UART پایدار با عملکرد بالا میباشد. برای ارتباط بهتر و موثرتر به جای mini UART از PL011 استفاده کنید.
توصیه میشود که ارتباط UART رزبریپای را برای ارتباط سریال فعال کنید. در غیر این صورت، نمیتوان از ارتباط سریال استفاده کرد زیرا پورتهای UART برای خروجی کنسول لینوکس و ماژول بلوتوث استفاده میشوند.
پینهای UART در رزبریپای ۳
پیکربندی UART در رزبریپای
در رزبریپای برای فعالسازی UART، ابتدا دستور زیر را در پنجره ترمینال وارد کنید.
sudo raspi-config
گزینهی Interfacing Options را انتخاب کنید.
بعد از انتخاب آن، گزینهی Serial را انتخاب کنید تا UART فعال شود.
سپس از شما پرسیده میشود که آیا میخواهید وارد یک shell شوید که از طریق ارتباط سریال قابل دسترسی است یا نه. گزینهی No را همانند شکل زیر انتخاب کنید.
در پایان، دربارهی فعالسازی پورت سریال سختافزاری از شما پرسیده میشود، گزینهی Yes را انتخاب کنید.
در انتها، UART برای ارتباط سریال روی پینهای RX و TX رزبریپای ۳ فعال شده است.
رزبریپای را مجدداً راهاندازی کنید.
پورت سریال برای ارتباط UART
به صورت پیشفرض، mini UART به پینهای UART (RX و TX) نگاشته میشود و PL011 به ماژول بلوتوث روی بورد رزبریپای ۳ متصل است.
در نسخههای پیشین مدلهای رزبری پای، PL011 برای خروجی کنسول لینوکس (نگاشته شده به پینهای UART) به کار میرفت زیرا ماژول بلوتوثی روی بورد وجود نداشت.
پس از انجام پیکربندی بالا، میتوان UART را روی پینهای UART (GPIO14 و GPIO15) به کار بست.
پورت ttsy0 برای دسترسی به mini UART در رزبریپای ۳، اختصاص داده شده است و برای دسترسی به PL011 در رزبریپای ۳، پورت ttyAMA0 اختصاص یافته است. اما برای دیگر مدلهای رزبریپای، تنها پورت ttyAMA0 در دسترس میباشد.
پورت UART سختافزاری، یعنی GPIO14(TXD) و GPIO15(RXD) با عنوان serial0 نیز شناخته میشود، و دیگر پورت UART که به ماژول بلوتوث وصل است با نام serial1 شناخته میشود. این نامهای مستعار جهت سهولت بکارگیری بین نسخههای مختلف رزبریپای ایجاد گشتهاند.
میتوانیم اتصال UART به پورتها، یعنی نگاشت mini UART (ttyS0) یا PL011 (ttyAMA0) به پینهای UART ( GPIO14 و GPIO15) را چک کنیم. برای بررسی این نگاشت، دستورات زیر را وارد کنید.
ls -l /dev
نگاشت UART برای dev/ttyS0/ و dev/ttyAMA0/ در شکل زیر آمده است.
تست ارتباط سریال بین رزبریپای و کامپیوتر
برای تست عملکرد ارتباط سریال، اتصالات موجود در شکل زیر را برقرار کنید.
یک ترمینال روی لپتاپ یا کامپیوتر شخصی برای دریافت دادههای ارسالی از رزبریپای باز کنید.
اکنون، برای ارسال داده، دستور زیر را از ترمینال رزبریپای وارد کنید.
echo “Hello” > /dev/ttyS0
این دستور رشته «Hello» را روی پورت UART، یعنی پین Tx ارسال میکند و این خروجی باید روی اپلیکیشن ترمینال لپتاپ نمایش داده شود.
به صورت پیشفرض، mini UART به GPIO14(TX) و GPIO15(RX) نگاشته میشود. در حالی که PL011، یعنی ttyAMA0 به ماژول بلوتوث روی برد وصل شده است.
مثال
حال اجازه دهید ارتباط سریال بین رزبریپای ۳ و لپتاپ را با استفاده از UART برقرار کنیم. میتوان با استفاده از زبان پایتون یا C ارتباط سریال مبتنی بر UART را ایجاد کرد.
در اینجا، یک echo روی کامپیوتر ایجاد خواهیم کرد.
ارتباط UART روی رزبریپای با استفاده از پایتون
''' UART communication on Raspberry Pi using Pyhton http://www.electronicwings.com ''' import serial from time import sleep ser = serial.Serial ("/dev/ttyS0", 9600) #Open port with baud rate while True: received_data = ser.read() #read serial port sleep(0.03) data_left = ser.inWaiting() #check for remaining byte received_data += ser.read(data_left) print (received_data) #print received data ser.write(received_data) #transmit data serially
توابع به کار رفته
تابع serial.Serial(port,baudrate)
این یک کلاس است که برای باز کردن پورت سریال به کار گرفته میشود. یک نمونه برای این کلاس ایجاد میشود (در اینجا از نام ser استفاده شده، میتوان هر نامی را برگزید) مثلا:
ser = serial.Serial(/dev/ttyS0, 9600)
پارامترها
Port: نام پورت، یعنی ttyUSB0، ttyS0 و … و یا None.
Buadrate: بادریت شامل ۹۶۰۰، ۳۸۴۰۰ و… .
تابع بالا پارامترهای دیگری نیز دارد که در اینجا استفاده نشدهاند. برای جزییات بیشتر از پارامترها، میتوان به Python API for PySerial رجوع کرد.
تابع Read(Size)
این تابع برای خواندن داده از پورت سریال به کار میرود.
پارامترها
Size: تعداد بایتی که باید خوانده شود را مشخص میکند. مقدار پیش فرض ۱ است.
بازگشتی
بایتهای خوانده شده از پورت را برمیگرداند.
تابع Write(Data)
این تابع برای انتقال/ارسال داده روی پورت سریال به کار میرود.
پارامترها
Data: داده ارسالی
بازگشتی
تعداد بایتهای نوشته شده/ارسال شده را برمیگرداند.
برای اطلاعات بیشتر از API سریال و جزئیات مربوطه، میتوان به Python API for PySerial رجوع کرد.
ارتباط UART روی رزبریپای با استفاده از زبان C
اکنون اجازه دهید ارتباط سریال UART بین رزبریپای و لپتاپ/کامپیوتر شخصی را با یک برنامه به زبان C پیادهسازی کنیم. در اینجا، از کتابخانه WiringPi برای برقراری ارتباط UART روی رزبریپای بهره گرفتهایم.
/* UART communication on Raspberry Pi using C (WiringPi Library) http://www.electronicwings.com
*/ #include <stdio.h> #include <string.h> #include <errno.h> #include <wiringPi.h> #include <wiringSerial.h> int main () { int serial_port ; char dat; if ((serial_port = serialOpen ("/dev/ttyS0", 9600)) < 0) /* open serial port */ { fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno)) ; return 1 ; } if (wiringPiSetup () == -1) /* initializes wiringPi setup */ { fprintf (stdout, "Unable to start wiringPi: %s\n", strerror (errno)) ; return 1 ; } while(1){ if(serialDataAvail (serial_port) ) { dat = serialGetchar (serial_port); /* receive character serially*/ printf ("%c", dat) ; fflush (stdout) ; serialPutchar(serial_port, dat); /* transmit character serially on port */ } } }
خروجی ترمینال رزبریپای
خروجی ترمینال لپتاپ/کامپیوتر
در سمت لپتاپ/کامپیوتر، از نرمافزار Realterm استفاده کردهایم.
نامهای مستعار Serial
در اینجا، از پورت ttyS0 استفاده کردهایم که در رزبریپای ۳، UART (GPIO14 و GPIO15) روی آنها نگاشته میشود. اما در دیگر مدلهای رزبریپای، این پینها روی ttyAMA0 نگاشته میشوند زیرا ماژول بلوتوث روی بورد وجود ندارد.
بنابراین، برنامهای که برای رزبریپای ۳ نوشته شده در دیگر مدلهای رزبریپای با خطا مواجه خواهد شد زیرا نام پورتها متفاوت است. برای سهولت جابهجایی در نام پین، در رزبین نامهای مستعار serial0 و serial1 ایجاد شدهاند. Serial0 به پورت UART نگاشته شده به پورت پیشفرض (ttyS0 یا ttyAMA0) اشاره دارد. بنابراین، میتوان serial0 را جایگزین ttsS0 یا ttyAMA0 کرد.
وقتی که به جای ttyS0 یا ttyAMA0، از serial0 به عنوان پورت UART استفاده کنیم، برنامهی نوشته شده برای رزبریپای ۳ بر روی مدلهای قدیمیتر رزبریپای نیز اجرا خواهد شد.
عوض کردن جای پورتهای سریال در رزبریپای ۳
برای بازدهی بهتر، ارتباط سریال روی GPIO14 و GPIO15 نیازمند استفاده از پورت ttyAMA0 میباشد که به ماژول بلوتوث وصل است. برای استفاده از این پورت، باید جای پورتهای UART را عوض کنیم، یعنی ttyAMA0 را به GPIO14 و GPIO15 نگاشت کنیم و ttyS0 (mini UART) را به ماژول بلوتوث نگاشت کنیم.
جابهجا کردن پورتهای سریال را میتوان با بکارگیری mini UART(ttyS0) برای ماژول بلوتوث از طریق یک دستگاه overlay، مثل pi3miniart-bt انجام داد. یا میتوان با غیرفعال کردن کامل ماژول بلوتوث از طریق دستگاه overlay، یعنی pi3-disable-bt به انجام رساند.
برای عوض کردن جای پورتهای UART، فایل config.txt را همانند زیر باز کنید.
sudo nano /boot/config.txt
خط
dtoverlay = pi3-miniuart-bt
یا
dtoverlay = pi3-disable-bt
را در انتهای فایل اضافه کنید.
تغییرات را در فایل ذخیره کرده و سیستم را راهاندازی مجدد کنید.
میتوان نگاشت جدید پورتهای سریال را با دستور زیر بررسی کرد.
ls -l /dev
نگاشت جدید پورت UART در شکل زیر نشان داده شده است.
منبع: ترجمه از سایت electronicwings.com
امیدواریم آموزش ارتباط UART رزبریپای با استفاده از پایتون و زبان C براتون مفید واقع شده باشه. لطفا دیگر آموزشهای رزبریپای را نیز مطالعه کنید.
اگر این نوشته برایتان مفید بود لطفا کامنت بنویسید.