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


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

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

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

   ورود کاربران




 


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

راهنمای پورت سریال – قسمت اول

(2961 مجموع کلمات موجود در متن)
(17323 بار مطالعه شده است)  نسخه چاپی

مقدمه

برنامه‌نویسی برای پورت‌سریال یک راهنمای کامل برای استفاده مناسب و راحت در سیستم‌عاملهای مبتنی بر POSIX است که نویسنده تجربیات و دانش خود را از این توع سیستمها مکتوب کرده و در نهایت در آخرین ویرایش‌ها برنامه‌ها را برای لینوکس نیز بهینه کرده است. (م: در شماره ۲۹ ایران‌تاکس مطلبی در مورد استفاده از پورت پارالل منتشر شده بود. از آنجایی که پردازش سریال و انتقال اطلاعات در الکترونیک و دیگر علوم و تکنولوژی بسیار مهم و کارآمد است ٬ این مطلب در جهت تکمیل راهنماها برای انواع پورتها و استفاده از آن در لینوکس آورده شده است. )


  1. اصول اولیه ارتباط از نوع سریال:

    در این قسمت طرز استفاده از 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



  1. امکان دارد 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)

    برای رایانه اطلاعاتی که به صورت سریال برایش فرستاده می‌شوند معنایی ندارند مگر اینکه بداند ابتدای یک حرف و انتهای آن کجا هستند. این قست می‌تواند شما را برای درک این قسمت از کار کمک کند.

    در مد آسنکرون کانال ارتباطی سریال ما در حالت ۱ باقی می‌ماند تا اولین کاراکتر ارسال شود. که شروع آن با یک بیت آغازین و بلافاصله اولین بیت آن کاراکتر خواهد بود. که تعداد بیتها بسته به در نظر گرفتن بیت توازن ) که به دلخواه مورد استفاده قرار می‌گیرد و یک یا چند بیت پایانی می‌تواند متفاوت باشد. استارت بیت همیشه صفر در نظر گرفته می‌شود که در واقع به رایانه اطلاع می‌دهد که اطلاعات سریال آماده فرستاده شدن به سمت پورت هستند. اطلاعات در هر زمانی قابل انتقال هستند و این تنها در سایه امکانی به نام آسنکرون وجود دارد

  1. بیت توازن به صورت ساده از جمع بیتهای یک کاراکتر به دست می‌آید که در طرف دیگر ارتباط می‌تواند این عمل بار دیگر انجام شود تا از صحت اطلاعات فرستاده شده مطمئن شد. مثلا اگر تعداد ۱های موجود در کاراکتر زوج باشد عدد ا و اگر فرد باشد عدد صفر در نظر گرفته می‌شود. در صورتی که در این مابین اطلاعات مخدوش شده باشد این عمل جمع می‌تواند نشان دهنده این خلل باشد و درخواست مجدد یک کاراکتر. امکان دارد که اصطلاحات دیگر نیز به کاربرده شود مانند : 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


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