آموزش آردوینو تکنولوژی

آموزش ارتباط سریال UART در بردهای آردوینو – بخش دوم

آموزش ارتباط سریال Arduino
نوشته شده توسط علیرضا قربانی

به نام خدا . در قسمت ۲ آموزش جامع  ارتباط سریال آردوینو در خدمتتان هستیم . در قسمت اول به بررسی ماهیت  پروتکل سریال و توابع print , println , begin , end , available  پرداختیم. در این بخش نیز قصد داریم توابع خواندن از پورت سریال را مورد بررسی قرار دهیم.در ادامه‌ی آموزش با سایت مرجع آردوینو، دیجی اسپارک همراه  باشید.

 

read()

به وسیله‌ی این تابع دیتایی که بر روی پورت سریال قرار دارد خوانده می‌شود.این تابع اگر دیتایی دریافت نکند مقدار ۱- و اگر دیتایی دریافت کند ، همان دیتا را برمی‌گرداند. ساختار کلی تابع به صورت زیر می‌باشد:

Serial.read();

 

مثال:

void loop()
{
  if (Serial.available())
  {
    char ch = Serial.read();
    if (ch >= '0' && ch <= '7')
    {
      int led = ch - '0';
      bitSet(leds, led);
      updateShiftRegister();
      Serial.print("Turned on LED ");
      Serial.println(led);
    }
    if (ch == 'x')
    {
      leds = 0;
      updateShiftRegister();
      Serial.println("Cleared");
    }
  }
}

 

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

char ch = Serial.read();

دیتای دریافتی درون متغیر ch ذخیره می‌شود و بعد از خوانده شدن توسط تابع read  این دیتا از بافر گیرنده پورت سریال پاک می‌شود  و در ادامه نیز این عملیات در صورت وجود دیتا در بافر سریال تکرار می‌شود.

 

Serial.readBytes()

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

Serial.readBytes(buffer, length);

 

lenght : تعداد بایتی است که قرار است دریافت شود.

buffer: نام آرایه‌ای که قرار است اطلاعات خوانده شده از پورت سریال درون آن دخیره شود.این آرایه می‌تواند از جنس []char یا []byte باشد

این تابع هنگامی که به مقدار lenght دیتا دریافت کند عملیات خواندن از پورت سریال را متوقف می‌کند.

 

به مثال زیر توجه کنید :

char buffer[3];
int lenght;
void setup()
{
  Serial.begin(9600);

}


void loop()
{
  if (Serial.available() > 0)
  {
    lenght = Serial.readBytes(buffer , 3);
    for (int i = 0 ; i <= lenght- 1 ; i++)
    {
      Serial.print(buffer[i]);
    }
    Serial.println();
  }
}

 

در این مثال برنامه به شروع خواندن پورت سریال می‌کندو هنگامی که ۳ بایت داده دریافت کرد متوقف شده و سه بایت دریافتی را چاپ می‌کند و دوباره به عملیات خود ادامه می‌دهد.

 

Serial.readBytesUntil()

دارای ساختار زیر می‌باشد :

Serial.readBytesUntil(character, buffer, length);

 

lenght : تعداد بایت مورد نظر برای دریافت

character :  کاراکتری که به محض  دیدن آن ، عملیات خواندن را متوقف می‌کند.

buffer :  آرایه‌ای از جنس []char یا []byte

این تابع عمل کردی مشابه تابع readBytes  دارد با ایت تفاوت که  دیتا را از بافر پورت سریال می‌خواند و به محض رسیدن به یک کاراکتر  خاص ( character ) و  یا تعداد تعیین شده‌ی بایت ( length )  عملیات خواندن را متوقف نموده و تعداد بایت دریافت شده قبل از کاراکتر مورد نظر را برمی‌گرداند ( اگر دیتایی موجود نباشد عدد ۰ را برمی‌گرداند )  .

به عنوان مثال در قطعه کد زیر برنامه شروع به خواندن از بافر پورت سریال می‌کند و هنگامی که به کاراکتر  e  رسید و یا هنگامی که تعداد بایت دریافتی به ۸ عدد رسید عملیات خواندن را متوقف می‌کند . و دیتای دریافتی را بر روی سریال مانیتور نرم افزار نمایش می‌دهد.

char buffer[8];
int lenght;
void setup()
{
  Serial.begin(9600);

}


void loop()
{
  if (Serial.available() > 0)
  {
    lenght = Serial.readBytesUntil('e',buffer , 8);
    for (int i = 0 ; i <= lenght- 1 ; i++)
    {
      Serial.print(buffer[i]);
    }
    Serial.println();
  }
}

 

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

 

درباره نویسنده

علیرضا قربانی

علیرضا قربانی هستم دانشجوی مهندسی پزشکی. چیزهای خیلی زیادی رو در دنیا دوست دارم. یک گیک هستم و یشه گفت یک هکر. نه به معنی دزدی پسورد و ایمیل مردم. به معنی عشق به دونستن و عشق به تحقیق درباره خیلی از چیزهایی که می بینم و می‌شنوم. اگر بخوام علاقه‌مندی‌ درجه یکم رو نام ببرم میتونم بگم برنامه نویسی و بعد از اون امبدد سیستم ها.

تبادل نظر و رفع عیب با ثبت دیدگاه

۱۹ دیدگاه

  • (if (Serial.available() > 0
    (++for (int i = 0 ; i &lt ; = lenght- 1 ; i
    این gt& چه معنی میده؟
    و for دومی هم لطفا توضیح بدین ؟
    اینکه چرا چهارتا ; داره و اینکه i&lt یعنی چی؟
    با تشکر از سایت عالی تون مهندس

  • if (v==”salam”)

    (sms.SendSMS(“09389817833″,”salam”));
    سلام خسته نباشید
    این تابع بالا ارسال پیام درsim 900(شیلد)میباشد که من برای پاسخ به پیام های دریافتی از این تابع استفاده کردم
    من هروقت یه سلام میفرستم به شیلد “salam”جواب رو به من سلام میفرسته و این سلام من میره توی بافر سریال ذخیره میشه
    چون توی حلقه lopهست برنامه هربار میاد روی این شرط جون سلام توی بافر سریال ذخیره شدا است هنوز یا پیام میده
    که این ارسال پیام ها تا بینهایت ادامه داره
    حالا سوال من اینه که چطور میتونم بعد این که پیام ارسال شد و جواب هم دریافت شد
    بافر سریال خالی بشه که دیگه پشت سر هم پیام نفرسته ؟
    چطور میتونم این کارو انجام بدم ؟
    اگه امکانش هست به زبان ساده بم بگیت جون من مبتدی هستم.
    با تشکر ازشما ???

    • با سلام
      ضمن تشکر از توجه شما، این کتابخانه از تابع serial.read به منظور خواندن سریال استفاده می‌کند. این تابع پس از خواندن دیتا به صورت خودکار بافر را خالی میکند. این ارسال پشت سر هم به دلیل loop داخل برنامه هست. باید لوپ به گونه ای کنترل شود که پس از ارسال پیام، مجددا وارد این حلقه نشود و به بافر سریال هیچ ارتباطی ندارد.

  • سلام خسته نباشید من میخاستم خروجی پالس نبض رو تو مانیتور هم نمایش بدم امکانش هست کمکم کنید؟
    برنامه من در حال حاضر تعداد پالس رو میتونم توی ال سی دی نمایش بدم

  • سلام وقت بخیر
    چطور میتونم اطلاعات شبکه can یه ماشین رو روی سریال مانیتور ide بخونم
    لطفا کمکم کنید

    • با سلام
      برای این منظور بایستی از مبدل Can به سریال استفاده کنید. سپس از یک برد آردوینو از جمله Uno استفاده کنید. سپس با اتصال به پایه‌های RX و TX برد آردوینو، و اجرای یک کد ساده میتوانید در سریال مانیتور دیتا را مشاهده کنید.

  • سلام باتشکر از اموزش خوبتون
    ان کدgt& چی هست که تو اردوینو اررور میده ایا کتابخانه لازم داره
    با تشکر

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

  • سلام ببخشید مشکل این قسمت چیه؟

    char buffer[8];
    int lenght;
    void setup()
    {
    Serial.begin(9600);

    }

    void loop()
    {
    if (Serial.available() > 0)
    {
    lenght = Serial.readBytesUntil(‘e’,buffer , 8);
    for (int i = 0 ; i <= lenght- 1 ; i++)
    {
    Serial.print(buffer[i]);
    }
    Serial.println();
    }
    }

    • با سلام
      کاربر گرامی امکان بررسی کد متفرقه بدون توضیحات امکان پذیر نمی‌باشد.