راهنمای پورت سریال – قسمت اول(2961 مجموع کلمات موجود در متن) (17323 بار مطالعه شده است)
مقدمه
برنامهنویسی
برای پورتسریال یک راهنمای کامل برای
استفاده مناسب و راحت در سیستمعاملهای
مبتنی بر POSIX
است
که نویسنده تجربیات و دانش خود را از این
توع سیستمها مکتوب کرده و در نهایت در
آخرین ویرایشها برنامهها را برای
لینوکس نیز بهینه کرده است.
(م:
در
شماره ۲۹ ایرانتاکس مطلبی در مورد
استفاده از پورت پارالل منتشر شده بود.
از
آنجایی که پردازش سریال و انتقال اطلاعات
در الکترونیک و دیگر علوم و تکنولوژی
بسیار مهم و کارآمد است ٬ این مطلب در جهت
تکمیل راهنماها برای انواع پورتها و
استفاده از آن در لینوکس آورده شده است.
)
اصول
اولیه ارتباط از نوع سریال:
در
این قسمت طرز استفاده از RS-232
و
استاندارهای دیگر مطرح می شود.
الف)
یک
ارتباط سریال چیست ؟
رایانهها
برای انتقال اطلاعات از یک یا چند بیت در
یک لحظه استفاده میکنند.
سریال
امکان برگشت دادن یک بیت را در همان لحظه
دارد.
ارتباط
سریال در بسیاری از لوازم استفاده شده
است مانند :
keybord , mouse , network device , mic , modem , terminals و
غیره
زمانی
که از ارتباط سریال استفاده میکنید هر
کلمه (بایت
یا یک کاراکتر)
به
وسیله بیتها ارسال یا دریافت میشوند
که هر بیت نشاندهنده یک خانه روشن یا
خاموش میباشد.
روشن
که برای اطلاعات است و برای فواصل خالی
نیز میتوان از حالت خاموش
استفاده
کرد.
سرعت
انتقال اطلاعات در سیستم سریال با بیت
بر ثانیه (bps)
یا
baudot
rate
(baud نشان
داده میشود که نشاندهنده تعداد ۰و
۱هایی است که در یک ثانیه فرستاده
میشود.
اوایل
سرعت ۳۰۰ برای رایانهها بسیار زیاد و
مناسب بود !
اما
در حال حاضر توانایی انتقال با سرعتی
معادل 430,800
بیت
بر ثانیه وجود دارد !
زمانی
که عدد baud
از
۱۰۰۰ عبور میکند شما میتوانید از واحد
بزرگتری به نام کیلو استفاده کنید.
در
حال حاضر اکثرا سرعت انتقال را به صورت
9.6k
, 19.2 و
...
میبینید.
و
برای سرعتهای بالاتر از از 1,000,000
از
واحد بزرگتر megabaud
استفاده
میشود.
(1.5Mbps)
به
هنگام استفاده از سریال یا پورتهای دیگر
از آنها به عنوان
Data Communications Equipment ("DCE")
یا
Data Terminal Equipment ("DTE")
نام برده میشود.
در هر زمان که دو دستگاه به هم ارتباط برقرار
میکنند نیاز به یک رابط دارد که میتواند
یک سیم سریال یا یک نوع مودم باشد.
ب) RS-232 چیست؟
RS-232 یک
استاندارد برای بوردها و مدارهای
الکترونیکی است که توسط موسسه استاندارد
[۱]به
ثبت رسیده است.
در
واقع این استاندارد دارای چند نسخه متقاوت
میباشد (A,b,c)
که
هر کدام از آنها برای نشان دادن ۰و۱ از
سطح ولتاژ متفاوتی استفاده میکنند.
بیشترین
نوع مورد استفاده RS-232C
است
که برای ۱ از ولتاژی بین منفی ۳ تا منفی
۱۲ و برای ۰ از ولتاژی بین مثبت ۳ تا مثبت
۱۲ ولت استفاده میکند.
از
خصوصیات این نسخه انتقال اطلاعات به
فاصلهای در حدود ۸متر قبل از ایجاد
تغییر در سطح ولتاژ و کیفیت آن میرسد.
میتوان
اطلاعات را در فاصلهای بیشتر از این هم
ارسال کرد در صورتی که سرعت انتقال اطلاعات
شما تا حد امکان پایین باشد.
به
غیر از سیمهایی که برای انتقال اطلاعات
در نظر گرفته شدهاند ٬ تعدادی هم برای
زمان ٬ حالت و
handshaking
استفاده
شده است
.
جدول ۱ : تعریف پینهای RS-232
Description
|
Pin
|
Description
|
Pin
|
Description
|
Pin
|
Description
|
Pin
|
Description
|
Pin
|
Signal
Quality Detect
|
21
|
Secondary
RXD
|
16
|
Unassigned
|
11
|
DSR
- Data Set Ready
|
6
|
Earth
Ground
|
1
|
Ring
Detect
|
22
|
Receiver
Clock
|
17
|
Secondary
DCD
|
12
|
GND
- Logic Ground
|
7
|
TXD
- Transmitted Data
|
2
|
Data
Rate Select
|
23
|
Unassigned
|
18
|
Secondary
CTS
|
13
|
DCD
- Data Carrier Detect
|
8
|
TXD
- Transmitted Data
|
3
|
Transmit
Clock
|
24
|
Secondary
RTS
|
19
|
Secondary
TXD
|
14
|
Reserved
|
9
|
RTS
- Request To Send
|
4
|
Unassigned
|
25
|
DTR
- Data Terminal Ready
|
20
|
Transmit
Clock
|
15
|
Reserved
|
10
|
CTS
- Clear To Send
|
5
|
امکان
دارد RS-422
, RS574 دو
استاندارد دیگر را نیز ببینید که RS-422
برای
ولتاژهای پایینتر و سیگنالهای متفاوت
مورد استفاده قرار میگیرد که امکان
انتقال اطلاعات را بر روی سیمی در حدود
۳۰۰ متر امکانپذیر میکند.
RS-574 برای
تعریف پورت سریال برای رایانههای شخصی
و یک پورت ۹ پین مورد استفاده قرار میگیرد.
تعریف
سیگنالهای مورد استفاده در پورت :
استاندارد
RS-232
هیجده
سیگنال مجزا برای برقرار ارتباط از نوع
سریال تعریف کرده است که به صورت عمومی
تنها شش مورد از آنها در یونیکس مورد
استفاده قرار میگیرد.
.
GND - Logic Ground
در
واقع یک سیگنال نیست ولی بدون وجود آن
مابقی سیگنالها نمیتوانند کار خود
را انجام دهند.
در واقع
باری مدار منطقی یک منبع برای تشخیص ولتاژ
مثبت و منفی است.
.
TXD - Transmitted Data
جامل
اطلاعات از دستگاه شما به یک رایانه و یا
بالعکس (مانند
یک مودم)
زمانی
که ولتاژی برقرار باشد یعنی ۱ و در غیر
اینصورت فاصله خالی یا صفر است.
.
RXD - Received Data
حامل
اطلاعات انتقال داده شده از سوی رایانه
شما به سمت دستگاه میباشد که به مانند
TXD برای
ولتاژها معانی خاص خود را در نظر گرفتهاند.
.
DCD - Data Carrier Detect
زمانی
که این سیگنال که همانا فقط فاصله یا
ولتاژ صفر میباشد از هر سمتی از کابل
سریال شما به دیگر انتها که میتواند
دستگاه یا رایانه شما باشد انتقال پیدا
میکند به این معنا است که ارتباط شما
فیمابین برقرار است-شما
on line
هستید-.
البته
این سیگنال همیشه مورد استفاده قرار
نمیگیرد.
.
DTR - Data Terminal Ready
این
سیگنال در ابتدای کار و برای برقراری
ارتباط مورد استفاده قرار میگیرد و به
معنی این است که دستگاه شما آماده دریافت
اطلاعات میباشد.
صفر به
معنای عدم آمادگی و ۱ به معنای آماده بودن
برای دستگاه مقابل فرستاده میشود.
.
CTS - Clear To Send
.
به
معنای این است که هنوز اطلاعات بیشتری
باید از طریق پورت سریال به دستگاه شما
منتقل شود.
به نوعی
یک نوع تنظیم کننده برای شدت سرعت انتقال
اطلاعات نیز محسوب میشود.
.
RTS - Request To Send
دستگاه
باید آماده باشد تا اطلاعات به آن انتقال
داده شوند.
همانند
CTS, RTS
به نوعی
یک تنظیم کننده مابین دستگاه و رایانه و
یا بالعکس محسوب میشوند.
بیشتر
دستگاها به صورت پیشفرض همیشه صفر یا
همان فاصله خالی را برای این سیگنالها
در نظر گرفتهاند.
پ
)
برقراری
ارتباط به صورت آسنکرون (Asynchronous
Communications)
برای
رایانه اطلاعاتی که به صورت سریال برایش
فرستاده میشوند معنایی ندارند مگر
اینکه بداند ابتدای یک حرف و انتهای آن
کجا هستند.
این
قست میتواند شما را برای درک این قسمت
از کار کمک کند.
در
مد آسنکرون کانال ارتباطی سریال ما در
حالت ۱ باقی میماند تا اولین کاراکتر
ارسال شود.
که
شروع آن با یک بیت آغازین و بلافاصله
اولین بیت آن کاراکتر خواهد بود.
که
تعداد بیتها بسته به در نظر گرفتن بیت
توازن )
که
به دلخواه مورد استفاده قرار میگیرد و
یک یا چند بیت پایانی میتواند متفاوت
باشد.
استارت
بیت همیشه صفر در نظر گرفته میشود که
در واقع به رایانه اطلاع میدهد که
اطلاعات سریال آماده فرستاده شدن به سمت
پورت هستند.
اطلاعات
در هر زمانی قابل انتقال هستند و این تنها
در سایه امکانی به نام آسنکرون وجود
دارد
بیت
توازن به صورت ساده از جمع بیتهای یک
کاراکتر به دست میآید که در طرف دیگر
ارتباط میتواند این عمل بار دیگر انجام
شود تا از صحت اطلاعات فرستاده شده مطمئن
شد.
مثلا
اگر تعداد ۱های موجود در کاراکتر زوج
باشد عدد ا و اگر فرد باشد عدد صفر در نظر
گرفته میشود.
در
صورتی که در این مابین اطلاعات مخدوش شده
باشد این عمل جمع میتواند نشان دهنده
این خلل باشد و درخواست مجدد یک کاراکتر.
امکان
دارد که اصطلاحات دیگر نیز به کاربرده
شود مانند :
space
parityُ
٬ mark
parity و
no
parity.
space parity :
بیت توازن همیشه صفر خواهد بود.
mark
parity : بیت
توازن همیشه ۱ خواهد بود.
no
parity : هیچ
بیتی به عنوان بیت توازن در نظر گرفته
نشده و فرستاده نمیشود.
تنها بیتی که در مورد آن صحبت نشده بیت انتهایی
یا بیت توقف
(stop bit) است.
میتوان
به تعداد ۱ ٬ ۱
.۵
و ۲ بیت توقف را مورد استفاده قرار داد
که همیشه مقدار یک را دارند.
قبلا
این بیت برای ایجاد فرصتی برای رایانه
یا دستگاه دریافت کننده بود که بتواند
پردازش مربوط به کاراکتر مورد نظر را
انجام دهد اما در حال حاضر تنها برای
ایجاد هماهنگی بین فرستنده و گیرنده یا
همان اصطلاح آسنکرون
به کار برده میشود.
آسنکرون
به چند فرمت کلی مطرح میشود که عبارتند
از 8N1"
٬
"7E1"
و
حالت آزاد.
اولی
که ۸ بیت اطلاعات را بعلاوه یک بیت پایانی
و دومی ۷ بیت اطلاع به همراه یک بیت پایانی
ارسال میکند و روش آخر تا زمان فرستادن
کاراکتر بعدی از بیت پایانی استفاده
میشود
Full Duplex and Half
Duplex
Full Duplex در
اصطلاح به ارتباطی دوطرفه گفته میشود.
یعنی
برای هر دو عمل انتقال اطلاعات ٬ دریافت
و ارسال کاراکترها دو کانال مجزا وجود
دارد.
(یکی
برای ارسال و دیگری برای دریافت)
Half Duplex به
این معنی است که نمیتوان ارتباط دوطرفه
با رایانه برقرار کرد ٬ در واقع یک کانال
برای ارسال و دریافت وجود دارد.
این
محدودیت انجام یک عمل از نوع دریافت یا
ارسال را ممکن میسازد و البته به این
معنی نیست که از سیگنالهای مربوط به
RS-232
استفاده
نشده است بلکه از استاندارد RS-232
به صورت
Full
Duplex استفاده
نشده است.
Flow Control
برای منظم بودن
عملیات و اتصال مابین دو دستگاه یا رایانه
نیاز به یک هماهنگی مابین دو سیستم در دو
طرف این ارتباط از نوع سریال میباشد.
به صورت
عمومی از دو روش استفاده میشود که
عبارتند از :
.
نرمافزاری
:
استفاده
از کاراکترهای خاص مانندXON
٬
DC1
و
021
در
مبنای 8
به
عنوان کاراکتر آغازین و XOFF
٬
DC3
و
023
در
مبنای 8
به
عنوان کاراکتر پایانی.
این
کاراکترها توسط موسسه کدهای استاندارد
آمریکا [۲]
.
سختافزاری
: به
جای استفاده از کاراکترها از سیگنالهای
CTS , RTS
استفاده
میشود.
دریافت
کننده سیگنال CTS
را صفر
قرار داده و آماده دریافت اطلاعات میشود
و زمانی که این سیگنال ۱ بشود به معنی عدم
آمادگی جهت پذیرش اطلاعات خواهد بود در
طرف دیگر فرستنده هنگامی که سیگنال RTS
را صفر
میکند به این معنی است که آماده ارسال
اطلاعات و در صورتی که این سیگنال را ۱
کند به معنی عدم آمادگی برای ارسال را به
فرستنده اعلام میکند.
مدل
سختافزاری بسیار سریعتر است چون
همانند مدل نرمافزاری نیازی به ارسال
بیتهای اضافه نیست.
البته
این روش توسط تمام دستگاهها پشتیبانی
نمیشود !
قطع
ارتباط چیست (break)؟
در حالت طبیعی
وقتی یک کارکتر یا بیت ارسال میشود ٬
ولتاژ اعمالی بر روی کانال ارتباط باقی
میماند تا زمانی که سیگنال مربوط به
دریافت توسط گیرنده ارسال شده و اعلام
آمادگی شود.
در
صورتی که به مدت زمانی حدود ¼
یا ½
ثانیه
این پاسخ ارسال نشود به معنی قطع ارتباط
سریال میباشد معمولا برای برطرف شدن
این حالت مجدد مراحل برقراری ارتباط
اولیه انجام میشود و یا نوع برقراری
ارتباط تغییر داده میشود که این مورد
را در قسمتی به صورت خاص تحت عنوان برقراری
ارتباط با یک مودم بررسی میکنیم.
ت
)
برقراری
ارتباط به صورت سنکرون (Synchronous
Communications)
برخلاف آسنکرون
ارتباط سنکرون به صورت تعریفی از یک سری
بیتها به صورت ثابت امکان پذیر میشود.
برای
خواندن اطلاعات از روی یک کانال باید
رایانه یا دستگاه برای ارسال یا دریافت
بیتی را به به عنوان یک clock
در نظر
بگیرد و بدین ترتیب هر دو وسیله با هم
سنکرون میشوند.
همچنین رایانه
باید نقطه شروع اطلاعات را مشخص کند که
به طور کلی از دو روش زیر استفاده میشود.
Serial Data Link
Control ("SDLC")
High-Speed Data Link
Control ("HDLC")
هر کدام از این
پروتوکلها به نوعی یک سری بیت مشخص و
ثابت را به عنوان نقطه شروع و پایان در
نظر میگیرند ٬ یک سری بیت مشخص و ثابت
نیز برای نشان دادن موقعیت آزاد یا عدم
ارسال اطلاعات استفاده میشود این لیست
از بیتها این قابلیت را به وجود میآورد
تا وسیله دریافت کننده شروع ارسال یک
بسته اطلاعاتی را تشخیص بدهد.
ارتباط سنکرون
به دلیل عدم استفاده از بیتهای استاندارد
برای شناسایی اطلاعات در حدود ۲۵٪ سرعت
انتقال اطلاعات را به نسبت سیستم آسنکرون
بهبود میبخشد که امکان استفاده در
شبکهها بزرگتر و به کار گرفتن بیش از
یک یا دو دستگاه سریال را فراهم میکند.
بر خلاف سرعت
بالای این پروتکل همیشه در دستگاههای
سریال و پورت RS-232
استفاده
نمیشود چون نیاز به سختافزار و
نرمافزار اضافی برای اجرای آن الزامی
است.
د
)
دستیابی
به پورت سریال
فایل سیستم
:
مانند
سایر وسایل در سیستمعامل یونیکس پورت
سریال هم یک فایل سیستمی دارد که میتوان
به راحتی با باز کردن این فایل با این
سخت افزار ارتباط برقرار کرد.
جدول ۲ : لیست فایل سیستم در توزیعهای متفاوت
System
|
Port
1
|
Port
2
|
IRIX®
|
/dev/ttyf1
|
/dev/ttyf2
|
HP-UX
|
/dev/tty1p0
|
/dev/tty2p0
|
Solaris®/SunOS®
|
/dev/ttya
|
/dev/ttyb
|
Linux®
|
/dev/ttyS0
|
/dev/ttyS1
|
Digital
UNIX®
|
/dev/tty01
|
/dev/tty02
|
باز
کردن پورت سریال:
به
دلیل اینکه پورت سریال یک فایل است برای
استفاده از آن تنها باید به این فایل
دسترسی داشته باشید و آن را باز کنید.
اما
همانطور که میدانید به همین دلیل سیستم
امنیتی در سیستمعاملهای بر مبنای posix
اجازه
دسترسی به این فایل را به کاربر نمیدهد
و برای اجرای برنامهها نیاز به سطح
دسترسی برای این فایل به شما داده شود و
برای این کار میتوانید از کاربر root
این
مجوز را دریافت کنید.
البته
تنها برای آزمایش و بنا به دلایل امنیتی
این کار برای سیستمهای کاری پیشنهاد
نمیشود.
به
هر حال ما از اینجا به بعد در نظر میگیریم
که شما مجوز لازم جحت دسترسی به این پورت
را دارید.
کد
زیر برای باز کردن یک پورت سریال در لینوکس
مورد استفاده قرار میگیرد.
برای
سیستمعاملهای دیگر تنها کافی است که
نام سیستمفایل مناسب را در کد وارد کنید
در غیر این صورت کد در تمام سیستمهای
نام برده شده قابل استفاده است
#include <stdio.h>
/* Standard input/output definitions */
#include <string.h> /* String function definitions */
#include <unistd.h> /* UNIX standard function definitions */
#include <fcntl.h> /* File control definitions */
#include <errno.h> /* Error number definitions */
#include <termios.h> /* POSIX terminal control definitions */
/*
* 'open_port()' - Open serial port 1.
*
* Returns the file descriptor on success or -1 on error.
*/
int open_port(void)
{
int fd; /* File descriptor for the port */
fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1)
{
/*
* Could not open the port.
*/
perror("open_port: Unable to open /dev/ttyS0 - ");
}
else
fcntl(fd, F_SETFL, 0);
return (fd);
}
پارامترهای
بازکردن پورت :
شما
میدانید که برای بازو بسته کردن یک فایل
از پارامترهایی خاص استفاده میشود.
در
سیستم یونیکس از دو پارامتر دیگر علاوه
بر اینها نیز استفاده میشود.
fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
O_NOCTTY : نشان
دهنده این است که نیازی به ترمینال برای
کنترل آن نداریم.
اگر
این سویچ را به کار نبرید احتمالا در حین
کار سیگنال وسلیهای ورودی مانند کیبورد
در روند پردازش تاثیر میگذارد.
به صورت
عادی یک برنامه نیازی به این امکان ندارد.
: پیشفرض
یا حالت خاصی را برای سیگنال DCD
بر روی خط در نظر نمیگیرد
در صورتی که این پارامتر تعریف نشود
پردازش متوقف شده و برنامه منتظر میماند
تا سیگنال DCD در حالت صفر
قرار بگیرد.
نوشتن
اطلاعات بر روی پورت سریال:
این
کار بسیار ساده است و تنها کافی است که
از تابع write
استفاده
کنید
n = write(fd, "ATZ\r", 4);
if (n < 0)
fputs("write() of 4 bytes failed!\n", stderr);
تابع write
مقدار
بایتهای نوشته شده را برمیگرداند و در
صورت وجود خطا عدد ۱ .
تنها
موردی که میتواند برای بروز خطا رخ دهد
٬ خطای I/O
است و
این زمانی رخ میدهد که مودم یا ارتباط
شما سیگنال DCD
را قطع
کند که این شرط تا زمانی که پورت را نبندید
باقی میماند.
خواندن
اطلاعات ار روی پورت سریال:
خواندن
اطلاعات از روی پورت مقداری متفاوت است.
در
زمانی که از پورت برای انتقال اطلاعات
استفاده میکنید زمانی که تابع read
فراخوانی
میشود تعدادی کاراکتر که در واقع درون
بافر بوده است برگشت داده میشود.
زمانی
که کاراکتری وجود نداشته باشد ٬ تابع
منتظر کاراکتر بعدی میماند تا زمان
داخلی تابع به پایان برسد و یا اینکه
خطایی رخ دهد.
این
تابع میتواند بلافاصله به اتمام برسد
در صورتی که از کد زیر استفاده کنید
fcntl(fd, F_SETFL, FNDELAY);
پارامتر
FNDELAY
باعث
میشود در صورتی که کاراکتری برای دریافت
وجود نداشت زمان صفر در نظر گرفته شده و
بلافاصله عمل خواندن به پایان رسیده و
جواب برگشت داده میشود.
برای
اینکه بخواهید به نوعی از حالت اولیه که
گفته شده استفاده کنید ٬ نباید از این
پارامتر استفاده شود.
که
معمولا بعد از یک بار استفاده از پارامتر
O_NDELAY
استفاده
میشود
fcntl(fd, F_SETFL, 0);
بستن
پورت سریال:
تنها
کافی است که از تابع close
استفاده
کنید.
همچنین
این تابع سیگنال DTR را
صفر کرده و در این حالت اکثر مودمها قطع
میشوند.
close(fd);
مترجم
:
محمد
درویش-
md@janane.com
منبع
:http://www.easysw.com/~mike/serial/serial.html
پی
نویس:
[۱]
http://www.eia.org
[۲]
لیست
کدهای استاندارد مورد استفاده جهت کنترل
برقراری ارتباط سریال :(ASCII
Control Code List)
Name Binary Octal Decimal Hexadecimal
NUL 00000000 000 0 00
SOH 00000001 001 1 01
STX 00000010 002 2 02
ETX 00000011 003 3 03
EOT 00000100 004 4 04
ENQ 00000101 005 5 05
ACK 00000110 006 6 06
BEL 00000111 007 7 07
BS 00001000 010 8 08
HT 00001001 011 9 09
NL 00001010 012 10 0A
VT 00001011 013 11 0B
NP, FF 00001100 014 12 0C
CR 00001101 015 13 0D
SO 00001110 016 14 0E
SI 00001111 017 15 0F
DLE 00010000 020 16 10
XON, DC1 00010001 021 17 11
DC2 00010010 022 18 12
XOFF, DC3 00010011 023 19 13
DC4 00010100 024 20 14
NAK 00010101 025 21 15
SYN 00010110 026 22 16
ETB 00010111 027 23 17
CAN 00011000 030 24 18
EM 00011001 031 25 19
SUB 00011010 032 26 1A
ESC 00011011 033 27 1B
FS 00011100 034 28 1C
GS 00011101 035 29 1D
RS 00011110 036 30 1E
US 00011111 037 31 1F
PDF Version
|