به کارگاه ترجمه ی سینا2 خوش آمدید!

تبلیغات شما در اینجا بالا

نمایش کدهای مورس در خروجی آردوینو

 

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

void Telegraph::output_code(const char* code) {
  const unsigned int code_length = strlen(code);
  
  for (unsigned int i = 0; i < code_length; i++) {
    if (code[i] == '.')
      dit();
    else
      dah();
    if (i != code_length - 1)
      delay(_dit_length);
  }
}

void Telegraph::dit() {
  Serial.print(".");
  output_symbol(_dit_length);  
}

void Telegraph::dah() {
  Serial.print("-");
  output_symbol(_dah_length);
}
void Telegraph::output_symbol(const int length) {
  digitalWrite(_output_pin, HIGH);
  delay(length);
  digitalWrite(_output_pin, LOW);
}

 

 تابع output_code یک دنباله ی کد مورس که شامل نقطه ها(dot) و خط های تیره(dash) است را می گیرد و آن را به فراخوانی های متدهای دیت(dit) و داه(dah) تبدیل می کند.سپس متدهای dit و dah یک نقطه(dot) یا یک خط تیره(dash) را در پورت سریال چاپ می کنند و بقیه ی کار را به متد output_symbol محول می کنند. و طول(length) نماد کد مورس که باید انتشار یابد را به آن پاس می دهند. متد output_symbol پین خروجی را به مقدار طول(length) نماد به HIGH تنظیم می کند. سپس آن را به LOW تنظیم می کند. اکنون همه چیز همان طور که در بخش های قبلی توضیح داده شده بود کار می کند و تنها تکمیل متد send_message از قلم افتاده است:

void Telegraph::send_message(const char* message) {
  for (unsigned int i = 0; i < strlen(message); i++) {
    const char current_char = toupper(message[i]); 
    if (isalpha(current_char)) {
      output_code(LETTERS[current_char - 'A']);
      delay(_dah_length);
    } else if (isdigit(current_char)) {
      output_code(DIGITS[current_char - '0']);
      delay(_dah_length);
    } else if (current_char == ' ') { 
      Serial.print(" ");
      delay(_dit_length * 7);
    }
  }
  Serial.println();
}

 متد send_message در یک حلقه(loop) یک پیغام را کاراکتر به کاراکتر بیرون می دهد. در خط شماره 3، ما کاراکتر فعلی را به حروف بزرگ تبدیل می کنیم، زیرا کاراکترها با حروف کوچک در کدهای مورس تعریف نشده اند( علت اینکه ما نمی توانیم یک نرم افزار چت با کدهای مورس تولید کنیم همین است). سپس  ما با استفاده از تابع isalpha در C، بررسی می کنیم که آیا کاراکتر فعلی(current_char) یک حرف است یا نه. اگر کاراکتر فعلی یک حرف باشد، ما از این کاراکتر برای مشخص کردن کد مورس آن که در آرایه ی LETTERS ذخیره شده است استفاده می کنیم. برای انجام این کار، ما از یک فن قدیمی استفاده می کنیم: در جدول اَسکی(ASCII)، تمام حروف (و رقم ها) به ترتیب صحیحی قرار گرفته اند-مثلا A=65 و b=66 و همین طور ای آخر. برای تبدیل کاراکتر فعلی(current_char) به یک اندیس برای آرایه ی LETTERS، ما باید از کد اسکی آن عدد 65 (یا همان A) را کم کنیم.

وقتی که ما کد مورس صحیح را مشخص کردیم، آن را به متد output_symbol پاس می دهیم و بعد از آن  برنامه را برای طول یک dah وقفه(delay) می دهیم. این الگوریتم برای بیرون دادن رقم ها، دقیقا به همین صورت عمل می کند؛ و ما تنها باید به جای آرایه ی LETTERS آرایه ی DIGITS را ایندکس کنیم؛ و همچنین باید مقدار اسکی کاراکتر 0 را از آنها کم کنیم.

 در خط 10، ما بررسی می کنیم که آیا به یک کاراکتر خالی(blank) رسیده ایم یا نه. در صورتی که به یک کاراکتر خالی رسیده باشیم، یک کاراکتر خالی را در پورت سریال چاپ می کنیم و به اندازه ی هفت دیت(dits) صبر می کنیم. تمام کاراکترهای دیگر نادیده گرفته می شوند: یعنی ما فقط حروف و رقم ها و کاراکترهای خالی را پردازش می کنیم.  در انتهای این متد، ما یک کاراکتر newline را به پورت سریال ارسال می کنیم تا مشخص کنیم که به پایان پیغام رسیده ایم.

 

!Donate

نوشتن دیدگاه

لطفا نظرات خود را بیان کنید. به سوالات در سریع ترین زمان پاسخ داده خواهد شد.اما به نکات زیر توجه کنید:
1. سعی کنید نظرات شما مرتبط با مقاله ی مورد نظر باشد، در غیر این صورت پاسخ داده نخواهد شد.
2. سوالات خود را به صورت کوتاه بیان کنید و از پرسیدن چند سوال به طور همزمان خودداری کنید.
3. سوال خود را به طور واضح بیان کنید و از کلمات مبهم استفاده نکنید.


تصویر امنیتی
تصویر امنیتی جدید

ستاره غیر فعالستاره غیر فعالستاره غیر فعالستاره غیر فعالستاره غیر فعال