ورود/ایجاد حساب کاربری
   منوی اصلی
· خانه
· لیست کاربران
· جستجو
· آمار مشاهدات
· آرشیو مقالات


- شرح
· راهنمای نویسندگان
· درباره ما

   همکاری با نشریه
در صورتی که مایل به همکاری با نشریه هستید، می‌توانید در لیست پستی نشریه عضو شده و در جریان امور قرار گیرید. برای اطلاعات بیشتر، اینجا کلیک کنید.

   کاربران
سردبیر
هیچ مدیر کمکی حاضر
همکاران
هیچ مدیر کمکی حاضر
اعضا:
جدیدترین:جدید امروز:0
جدیدترین:جدید دیروز:0
جدیدترین:مجموع:2471
جدیدترین:جدیدترین:
ufumenarayu
اعضا:حاضر
اعضا:اعضا:0
مهمان‌ها:مهمان‌ها:8
مجموع:مجموع:8
کاربران حاضر
هیچ کاربر حاضری وجود ندارد

   ورود کاربران




 


 برای ورود مشکل دارید؟
 ثبت نام کاربران جدید

راهنمای پورت سریال (قسمت دوم)

(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

برای این کار همانند کاری که برای تنظیم اندازه کاراکترها انجام شد برای بیت توازن هم استفاده می‌کنیم و به صورت دستی فعال و تعداد بیتها مشخص می‌شود. راه‌اندازهای سریال خانواده یونیکس‌ از بیت توازن زوج ٬ فرد و بدون بیت توازن پشتیبانی می‌کنند. وجود یک بیت فاصله به عنوان بیت توازن را با کمی برنامه‌نویسی هوشمندانه می‌توانید بدست آورید.

    بدون بیت توازن (8N1):

    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

مجوز: GNU/FDL

PDF Version

تمامی مطالب و مقالات این سایت تحت مجوز GNU FDL قرار دارند. بنابراین کپی و ایجاد تغییر در آنها مطابق شرایط این مجوز آزاد می‌باشد.