راهنمای پورت سریال (قسمت دوم)(2677 مجموع کلمات موجود در متن) (7485 بار مطالعه شده است)
راهنمای
پورت سریال برای سیستمهایعامل مبتنی
بر POSIX
(قسمت
دوم)
فصل
دوم :
پیکربندی
پورت سریال:
(به
کمک C
بر
روی یک ترمینال)
رابط
ترمینال برای سیستمهای POSIX
اغلب
سیستمها از ترمینال POSIX
به
عنوان یک رابط سریال برای دسترسی به
پارامترهایی مانند Baud
rate , اندازه
کاراکترها و دیگر موارد پشتیبانی میکنند.
اولین
کاری که باید انجام دهید استفاده از فایل
<termios.h>
برای
تعریف ساختار اصلی یک ترمینال به مانند
فانکشنهای کنترل POSIX
است.
دو
فانکشن مهم tcgetattr
و
tcsetattr
هستند
که مشخصات ترمینال را میتوان به کمک
آنها تنظیم کرد.
شما
تنها کافی است که یک نشانگر به ساختار
termios
ایجاد
کنید که تمام گزینههایی که در اختیار
شما قرار میدهد در جدول زیر آمده است.
جدول
۳ :
ساختار
termios
عضو
|
توضیح
|
c_cflag
|
انتخاب کنترل
|
c_lflag
|
انتخاب خط
|
c_iflag
|
انتخاب ورودی
|
c_oflag
|
انتخاب خروجی
|
c_cc
|
انتخاب کاراکترها
|
c_ispeed
|
تعداد کاراکتر
ورودی در یک ثانیه – رابطهای جدید
|
c_ospeed
|
تعداد کاراکتر
خروجی در یک ثانیه – رابطهای جدید
|
انتخاب
مقادیر برای کنترل پورت
مقادیری
که در c_cflag تعریف میشوند
امکان کنترل boud rate ٬ تعداد
بیت
توازن (parity)
٬
stop
bits و سرعت
انتقال اطلاعات را فراهم میکند.
برای تمامی آنها متغیرهای
ثابتی تعریف شدهاند که عبارتند از :
جدول
شماره ۴ : متغیرهای تعریف
شده در c_cflag
ثابت
|
شرح
|
CBAUD
|
Bit mask for baud rate
|
B0
|
0 baud (drop DTR)
|
B50
|
50 baud
|
B75
|
75 baud
|
B110
|
110 baud
|
B134
|
134.5 baud
|
B150
|
150 baud
|
B200
|
200 baud
|
B300
|
300 baud
|
B600
|
600 baud
|
B1200
|
1200 baud
|
B1800
|
1800 baud
|
B2400
|
2400 baud
|
B4800
|
4800 baud
|
B9600
|
9600 baud
|
B19200
|
19200 baud
|
B38400
|
38400 baud
|
B57600
|
57,600 baud
|
B76800
|
76,800 baud
|
B115200
|
115,200 baud
|
EXTA
|
External rate clock
|
EXTB
|
External rate clock
|
CSIZE
|
Bit mask for data bits
|
CS5
|
5 data bits
|
CS6
|
6 data bits
|
CS7
|
7 data bits
|
CS8
|
8 data bits
|
CSTOPB
|
2 stop bits (1 otherwise)
|
CREAD
|
Enable receiver
|
PARENB
|
Enable parity bit
|
PARODD
|
Use odd parity instead of even
|
HUPCL
|
Hangup (drop DTR) on last close
|
CLOCAL
|
Local line - do not change
"owner" of port
|
LOBLK
|
Block job control output
|
CNEW_RTSCTS CRTSCTS
|
Enable hardware flow control (not
supported on all platforms)
|
همیشه
دو گزینه CLOCAL
و
CREAD
در
c_cflag
باید
فعال شوند.
برای
اینکه مالکیت پورت در اختیار برنامه شما
نباشد و امکان کنترل و قطع ارتباط وجود
داشته باشد٬ همچنین رابط سریال شما بتواند
اطلاعات موجود بر روی پورت را بخواند.
متغیرهایی
که baud rate
را
تعریف میکند (CBAUD,
B9600, etc.) در
سیستمهای قدیمیتر مورد استفاده قرار
میگرفت وc_ispeed
و
c_ospeed
.
هرگز
به صورت مستقیم c_cflag
را
تغییر ندهید.
از
عملگرهای بیتی مانند and
٬
or
و
not
برای
پاک کردن یک بیت استفاده کنید.
تنظیم
baud
rate
baud
rate بسته
به سیستمها در مکانها متفاوتی نگهداری
میشود.
رابطهای
قدیمیتر از c_cflag
و
ثابتهای جدول ۴ استفاده میکردند در
صورتی که سیستمهای جدیدتر از c_ispeed
و c_ospeed استفاده
میکنند و مقدار واقعی baud rate را
در خود دارند.
توابع
cfsetospeed و cfsetispeed
امکان تعریف baud rate
را در termios بدون
در نظر گرفتن سیستمعامل و نوع رابط سریال
فراهم میکنند. شما
میتوانید از لیست برنامه شماره ۲ برای
این کار استفاده کنید.
لیست
برنامه شماره ۲ :
struct termios options;
tcgetattr(fd, &options);
cfsetispeed(&options, B19200);
cfsetospeed(&options, B19200);
options.c_cflag |= (CLOCAL | CREAD);
tcsetattr(fd, TCSANOW, &options);
تابع tcgetattr ساختار termios را با توجه به گزینههایی که قبلا انتخاب کردید را انجام میدهد. وقتی baud rate را تعریف کردید ٬ local mode فعال بود و اعلان دریافت اطلاعات سریال انجام شد. تنظیمات جدید را توسط tcgetattr انجام میدهیم. ثابت TCSANOW مشخص میکند که تغییرات بلافاصله باید اعمال شوند حتی اگر در وضعیت دریافت یا ارسال اطلاعات باشیم.توابع دیگری هم وجود دارند که منتظر بماند تا کار انتقال اطلاعات به پایان برسد و یا منتظر ورودی بماند و یا بافر ورود و خروجی را خالی کند.
اغلب سیستمها از سرعت های متفاوت ورودی و خروجی استفاده نمیکنند. بنابراین سعی کنید که هر دو مقدار را مشخص کنید تا بهترین وضعیت را برای انتقال اطلاعات داشته باشید.
جدول ۵ : ثابتهای
تابع tcsetattr
ثابت
|
شرح
|
TCSANOW
|
بدون
انتظار برای تمام شدن یک فعالیت تعییرات
را اعمال میکند
|
TCSADRAIN
|
منتظر
میماند تا اتنقال به صورت کامل انجام
بگیرد
|
TCSAFLUSH
|
بافر
ورودی و خروجی را پاک کرده و بعد تغییرات
را اعمال میکند.
|
تنظیم
اندازه کاراکترها
برخلاف
baud
rate ٬
برای این کار متغییر خاصی وجود ندارد.
تنها
با مقداردهی c_cflag
و
به وجود آوردن یک نوع شابلون امکانپذیر
میشود.
با
مثال زیر بهتر متوجه میشوید که چگونه
کاراکتر به مشخص کردن تعدا بیتها شکل
میگیرد.
options.c_cflag &= ~CSIZE; /* Mask the character size bits */
options.c_cflag |= CS8; /* Select 8 data bits */
تنظیم بیت توازن - Parity Checking
برای
این کار همانند کاری که برای تنظیم اندازه
کاراکترها انجام شد برای بیت توازن هم
استفاده میکنیم و به صورت دستی فعال و
تعداد بیتها مشخص میشود.
راهاندازهای
سریال خانواده یونیکس از بیت توازن زوج
٬ فرد و بدون بیت توازن پشتیبانی میکنند.
وجود
یک بیت فاصله به عنوان بیت توازن را با
کمی برنامهنویسی هوشمندانه میتوانید
بدست آورید.
options.c_cflag &= ~PARENB
options.c_cflag &= ~CSTOPB
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
بیت توزان زوج (7E1):
options.c_cflag |= PARENB
options.c_cflag &= ~PARODD
options.c_cflag &= ~CSTOPB
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS7;
بیت توزان فرد (7O1):
options.c_cflag |= PARENB
options.c_cflag |= PARODD
options.c_cflag &= ~CSTOPB
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS7;
بیت توازن به صورت فاصله خالی
که به مانند حالت اولی بدون بیت توازن
استفاده میشود (7S1):
options.c_cflag &= ~PARENB
options.c_cflag &= ~CSTOPB
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
تنظیم
و کنترل شدت جریان اطلاعات مابین دو وسیله
که به صورت سختافزاری در ارتباط هستند
بسیاری
از توزیعهای مختلف خانواده یونیکس به
صورت سختافزاری از CTS
و
RTS
روی
خطوط ارتباط سریال پشتیبانی میکنند.
در
صورتی که دو ثابت CNEW_RTSCTS
و CRTSCTS
تعریف شوند٬ کنترل
سختافزاری شدت جریان اطلاعات فعال
میشود. از خط زیر
برای این کار استفاده میکنیم.
options.c_cflag |= CNEW_RTSCTS; /* Also called CRTSCTS */
گزینههای محلی
در حالت محلی تنظیمات c_lflag برای کنترل کارکترهای ورودی و مدیریت درایور سریال استفاده میشود. به صورت عمومی برای استاندارد کردن و یا استفاده به شکل خاص و دلخواه مورد استفاده قرار میگیرد.
جدول شماره ۶ : ثابتهای
تابع c_lflag
ثابت
|
شرج
|
ISIG
|
فعال
کردن سیگنالهای SIGINTR, SIGSUSP, SIGDSUSP و
SIGQUIT
|
ICANON
|
فعال
کردن ورودی استاندارد (یا
بدون
قاعد)
|
XCASE
|
کارکترهای
بزرگ و کوچک
|
ECHO
|
فعال
کردن تکرار کاراکترهای ورودی
|
ECHOE
|
پاک
کردن کاراکترهای تکرار با BS-SP-BS
|
ECHOK
|
تکرار
NL بعد از بین رفتن کاراکتر
|
ECHONL
|
تکرار
NL
|
NOFLSH
|
عدم
امکان پاک کردن بافر ورودی بعد از یک
وقفه یا کاراکتر خروجی
|
IEXTEN
|
فعال
شدن توابع اضافی
|
ECHOCTL
|
تکرار
کاراکترهای کنترلی با کاراکتر ^ و
پاک کردن با ~?
|
ECHOPRT
|
تکرار کارکتر
پاک کردن با به عنوان کاراکتر پاک شده
|
ECHOKE
|
BS-SP-BS entire line on line kill
|
FLUSHO
|
خروجی
پاک میشود
|
PENDIN
|
تایپ
مجدد ورودی در خواندن و یا ورود یک
کارکتر جدید
|
TOSTOP
|
فرستادن
سیگنال SIGTTOU پیشزمینه
برای خروجی
|
انتخاب
ورودی استاندارد
ورودی
استاندارد به صورت خطی است.
کارکترهای
ورودی در یک بافر قرار میگیرند که کاربر
میتواند آنها را تغییر دهد تا زمانی که
کاراکترهای CR
و
LF وارد
نشوند. وقتی این حالت را
انتخاب میکنید به صورت نرمال گزینههای
ECHO و ECHOE را
هم انتخاب میکنید.
options.c_lflag |= (ICANON | ECHO | ECHOE);
ورود بدون قاعده از ورودی
ورود اطلاعات بدون قاعده٬ پردازش نمیشود. کارکترهای ورودی به همان صورتی که آمدهاند دریافت میشوند. در واقع شما در این روش حالت استاندارد را غیرفعال میکنید.
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
نکته: هرگز حالت تکرار (ECHO) را در صورتی که با مودم کار میکنید و یا رایانه طرف مقابل از این حالت استفاده میکند ٬ انتخاب نکنید. چراکه شما یک حلقه بیپایان را با این کار تشکیل میدهید !
گزینههای ورودی
زمانی که از مد c_iflag استفاده میشود٬ کنترل و پردازش ورودی بر روی هر کاراکتر روی پورت انجام میشود. همانند اعضای c_cflag نتیجه نهایی در c_iflag قرار میگیرد خواه به صورت اعداد منطقی و یا به صورتی که توسط گزینههای انتخابی بر روی آن اعمال شده است.
جدول
شماره ۷: ثابتهای تابع
c_iflag
ثابت
|
شرح
|
INPCK
|
چک
شدن بیت توزان انجام شود
|
IGNPAR
|
ایرادهای
بیت توازن در نظر گرفته نشوند
|
PARMRK
|
نشان
داده شدن ایرادهای بیت توازن
|
ISTRIP
|
Strip parity bits
|
IXON
|
فعال
کردن کنترل شدت جریان به صورت نرمافزاری
(خروجی)
|
IXOFF
|
فعال
کردن کنترل شدت جریان به صورت نرمافزاری
(ورودی)
|
IXANY
|
Allow any character to start flow again
|
IGNBRK
|
رد
کردن هر شرطی برای توقف
|
BRKINT
|
ارسال
سیگنال SIGINT زمانی که
هر نوع توقفی صورت گیرد.
|
INLCR
|
نوشته
شدن NL در CR
|
IGNCR
|
رد
کردن CR
|
ICRNL
|
نوشته
شدن CR در NL
|
IUCLC
|
تبدیل
حروف بزرگ به کوچک
|
IMAXBEL
|
اعلان
زنگ زمانی که خط ورودی بسیار بلند است
|
تنظیم
گزینهها بیت توازن برای ورود اطلاعات
زمانی که در c_cflag بیت توازن (PARENB) فعال شد ٬ باید برای ورود اطلاعات هم بیت توازن را چک کرد. توابع مربوط به این کار INPCK , IGNPAR , PARMRK و ISTRIP هستند. عموما از INPCK و ISTRIP برای فعال کردن و مشخص کردن بیت توازن استفاده میکنند.
options.c_iflag |= (INPCK | ISTRIP);
استفاده از گزینه IGNPAR خطراتی را به همراه دارد. به نوعی بیت توازن را در نظر ندارد و تا زمانی که مشکلی نباشد٬ دریافت اطلاعات ادامه دارد. برای مشخص شدن کیفیت ارتباطی خط میتواند مناسب باشد ٬ اما برای انجام تمرین برقراری ارتباط سریال و یا کارهای دیگر پیشنهاد نمیشود.
گزینه PARMRK بیت توزان را با کاراکترهای خاص مشخص میکند. در صورتی که IGNPAR فعال باشد ٬ کاراکتر NUL یا (000) در مبنای هشت قبل از هر کاراکتر با یک بیت ایراد٬ بیت توازن ارسال میشود. در غیر اینصورت کاراکتر DEL یا (177) در مبنای هشت و به دنبال آن کاراکتر نامناسب ارسال میشود.
تنظیم شدت جریان اطلاعات به صورت نرمافزاری
کنترل شدت جریان به صورت نرمافزاری با IXON ٬ IXOFF و IXANY امکانپذیر میشود.
options.c_iflag |= (IXON | IXOFF | IXANY);
و با در نظر نگرفتن این بیتها در c_iflag این کنترل غیر فعال میگردد.
options.c_iflag &= ~(IXON | IXOFF | IXANY);
شرح دو تابعXON و XOFF در زیر آورده شده است.
گزینههای خروجی
اعضای c_oflag همانند توضیحاتی که برای ورودی ها داده شد. امکاناتی را برای فیلتر کردن خروجیها فراهم میکند. شما میتوانید خروجیها را پردازش کرده و یا اینکه به صورت خام تنها آنها را بفرستید. ثابتهای تعریف شده در جدول شماره هشت آورده شده است.
جدول شماره ۸ : ثابتهای c_oflag
ثابت
|
شرح
|
OPOST
|
Postprocess output (not set = raw output)
|
OLCUC
|
Map lowercase to uppercase
|
ONLCR
|
Map NL to CR-NL
|
OCRNL
|
Map CR to NL
|
NOCR
|
No CR output at column 0
|
ONLRET
|
NL performs CR function
|
OFILL
|
Use fill characters for delay
|
OFDEL
|
Fill character is DEL
|
NLDLY
|
Mask for delay time needed between lines
|
NL0
|
No delay for NLs
|
NL1
|
Delay further output after newline for 100
milliseconds
|
CRDLY
|
Mask for delay time needed to return carriage
to left column
|
CR0
|
No delay for CRs
|
CR1
|
Delay after CRs depending on current column
position
|
CR2
|
Delay 100 milliseconds after sending CRs
|
CR3
|
Delay 150 milliseconds after sending CRs
|
TABDLY
|
Mask for delay time needed after TABs
|
TAB0
|
No delay for TABs
|
TAB1
|
Delay after TABs depending on current column
position
|
TAB2
|
Delay 100 milliseconds after sending TABs
|
TAB3
|
Expand TAB characters to spaces
|
BSDLY
|
Mask for delay time needed after BSs
|
BS0
|
No delay for BSs
|
BS1
|
Delay 50 milliseconds after sending BSs
|
VTDLY
|
Mask for delay time needed after VTs
|
VT0
|
No delay for VTs
|
VT1
|
Delay 2 seconds after sending VTs
|
FFDLY
|
Mask for delay time needed after FFs
|
FF0
|
No delay for FFs
|
FF1
|
Delay 2 seconds after sending FFs
|
انتخاب نوع
خروجی
عمل پردازش بر
روی خروجی با تنظیم OPOST
در
c_oflag
فعال
میشود.
options.c_oflag |= OPOST;
در
بین گزینهها تنها ONLCR
استفاده
میشود که که خط جدید را با CR
وLF مشخص
میکند. مابقی
تنها زمانی استفاده میشدند که پرینتر٬
کنسول و ترمینال ها با اطلاعات سریال
همخوانی نداشتند و شما مجبور بودید که
اطلاعات را به صورت دلخواه فیلتر کرده و
ارسال کنید.
انتخاب گزینه
فقط خروج(خروج
اطلاعات بدون پردازش)
تنها با ریست کردنOPOST در c_oflag این کار انجام میشود. در پی این کار تمامی گزینههایی تنظیم شده برای c_oflag از بین میروند.
options.c_oflag &= ~OPOST;
کاراکترهای
کنترلی
آرایه
c_cc
شامل
تعاریفی برای کارکترهای کنترلی میباشد.
جدول
شماره ۹: ثابتهای c_cc
-
ثابت
|
شرح
|
کلید
|
VINTR
|
Interrupt
|
CTRL-C
|
VQUIT
|
Quit
|
CTRL-Z
|
VERASE
|
Erase
|
Backspace (BS)
|
VKILL
|
Kill-line
|
CTRL-U
|
VEOF
|
End-of-file
|
CTRL-D
|
VEOL
|
End-of-line
|
Carriage return (CR)
|
VEOL2
|
Second end-of-line
|
Line feed (LF)
|
VMIN
|
Minimum number of characters to read
|
-
|
VSTART
|
Start flow
|
CTRL-Q (XON)
|
VSTOP
|
Stop flow
|
CTRL-S (XOFF)
|
VTIME
|
Time to wait for data (tenths of seconds)
|
-
|
کاراکترهای
تنظیم شدت جریان اطلاعات به صورت نرمافزاری
دو
ثابت VSTART
و
VSTOP
در
آرایه c_cc
حاوی
کارکترهایی هستند که برای تنظیم این شدت
جریان استفاده میشوند.
به
صورت معمول باید از کاراکترهای DC1
یا
021
و
DC3
یا
023
در
مبنای هشت استفاده کرد که همان XON
و
XOFF
کد
اسکی(ASCII)
هستند.
تعریف
محدودیت زمانی
پورتسریال
در خانواده یونیکس امکان تعریف کاراکتر
یا بستهای برای محدود کردن زمان انجام
کار در نظر گرفته است.
دو
ثابت VMIN
و VTIME
در
آرایه c_cc
در
نظر گرفته شدهاند.
محدودیت
زمان در حالتی که از خواندن اطلاعات به
صورت استاندارد استفاده میکنید و یا
گزینه NDELAY
در
زمان بازکردن فایل یا fcntl
قرار
دارد تاثیری ندارد.
گزینه
VMIN حداقل
کاراکترهایی که باید خوانده شوند را مشخص
میکند.
در
صورتی که مقدار آن صفر تعیین شود برای
خواندن هر کاراکتر تا زمانی که در متغییر
VTIME تعریف
شده صبر میکند. این
بدان معنی نیست که دستور خواندن N
بایت منتظر
ورود N کاراکتر
خواهد ماند. بلکه
با بروز محدودیت زمان (Timeout)
خواندن به
اتمام رسیده و هر آنچه که تا به آن موقع
وارد شده بود به عنوان برگشت آن تابع در
نظر گرفته میشود.(بسته
به تعداد کاراکتری که شما درخواست کنید)
در صورتی
که VMIN تعریفی
به جز صفر داشته باشد ٬ VTIME
زمانی است
که منتظر اولین کاراکتر میماند.
در صورتی
که کاراکتری در آن مدت زمان خوانده شد ٬
منتظر میماند تا به اندازه VMIN
کارکترها
خوانده شوند. در
صورتی که هر خدشهای در این خواندن به
وجود آید. مجددا
صبر میکند تا تمام بایتهای مورد نیاز
خوانده شود. و
هیچ فرمان دیگری برای خواندن اطلاعات
دیگری پذیرفته نیست. در
صورتی که N کاراکتر
یا بسته خوانده نشود تابع مقدار صفر را
باز میگرداند و در صورتی که عملیات کامل
انجام شود N کاراکتر
با بسته خروجی آن خواهد بود.
VTIME زمانی
را مشخص میکند که باید منتظر خوانده شدن
اطلاعات بود.
اگر
صفر باشد که خواندن متوقف میشود تا گزینه
NDELAY
در
وضعیت بازکردن فایل یا fcntl
قرار
گیرد.
مترجم
:
محمد
درویش-
md@janane.com
منبع
:http://www.easysw.com/~mike/serial/serial.html
PDF Version
|