با سلام ،
دوست عزیز شما در حال استفاده از ورژنی قدیمی از اینترنت اکسپلورر هستید ، برای اینکه مشکلات ناشی از نمایش را نداشته باشید ، لطفا اقدام به دریافت مرورگری مناسب کرده و یا از ورژن قدیمی ما استفاده نمایید.


موضوع بسته شده است 
امتیاز موضوع:
  • 4 رأی - میانگین امتیازات: 5
  • 1
  • 2
  • 3
  • 4
  • 5
آموزش عملی ارتباط میکروکنترلر با پورت سریال
#1

[تصویر:  Serial.png]

میخوام باهم یه نگاهی بندازیم به ارتباط سریال میکروکنترلر با کامپیوتر



سرفصلهای مورد بحث:





Rolleyes
#2

جلسه اول



مواد لازم:
  • میکروکنترلر ( من اینجا از دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.
    استفاده کردم ولی میشه از هر میکروی PIC یا AVR که دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.
    داخلی داره استفاده کرد )

  • کامپایلر ( من چون با دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.
    کار میکنم اینجا هم با همین کامپایلر آموزش میدم )

  • کامپیوتر با پورت سریال ( البته اگه کامپیوترتون از این جدید مدیداس و پورت سریال نداره میتونید از مبدل دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.
    استفاده کنید )

  • محیط برنامه نویسی برای ویندوز ( من با دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.
    آموزش میدم )



روش کار هم اینجوریه که اول میخوام در مورد ارتباط سریال توضیح بدم، بعدش میریم سراغ MikroC و کتابخونه URAT و یه برنامه مینویسیم که هر موقع میکرومون داده مشخصی رو دریافت کرد فلان کار رو انجام بده، بعدشم میریم سراغ #C و اون داده مشخص رو میفرستیم به پورت سریال که قراره میکرومون دریافت کنه و یه برنامه هم برعکس این کار و در آخر بصورت عملی مدارمونو میبندیم و نتیجه رو میبینیم.

Rolleyes
#3

جلسه دوم


همونطور که میدونیم کامپيوتر به دو روش موازي و سريال داده ها رو انتقال ميده. فقط چون در روش موازی از هشت ( یا بیشتر ) کابل استفاده میشه و طول کابل هم در صحت فرستادن اطلاعات میتونه تاثیر بد بذاره استفاده از ارتباط سریال کار رو راحتتر میکنه. هونطور که تو شکل هم میبینید تو ارتباط سریال از یه سیم واسه فرستادن اطلاعات استفاده میشه که این خودش هم هزینه رو پایین میاره و هم امکان ارتباط رو با خط تلفن هم که میتونه به فاصله دو شهر باشه رو فراهم میکنه. البته این وسط یه مودم باید اطلاعات ( همون 0 و 1 ها ) رو باید به سیگنال های رادیویی تبدیل کنه بفرسته و یه مودم هم تو مقصد سیگنال هارو به همون 0 و 1 ها تبدیل کنه. ولی وقتی که مسیر کوتاهه همون سیگنال های دیجیتالی رو میشه منتقل کرد و نیازی به عمل مدولاسیون نیست.

[تصویر:  1.png]

پس ما همون ارتباط سریال رو که آسونتره انتخاب میکنیم.

ارتباط سریال هم دو روش داره:
  1. روش سنکرون
  2. روش آسنکرون
تو روش سنکرون کل اطلاعات تو یه بلوک، اونم تو یک زمان فرستاده میشه ولی تو روش آسنکرون اطلاعات بایت به بایت فرستاده میشه. البته نوشتن برنامه واسه دو روش امکان پذیره ولی ینمه سخت و طولانیه برای همین هم تولید کنندگان اومدن واسه راحتی ما تراشه هایی رو با عنوان UART مخفف ( Universal asynchronous receiver/transmitter ) ساختن که این کار رو واسه ما انجام میده و فقط میمونه فرستادن و گرفتن اطلاعات.

تو روش انتقال سریال، داده ها چون فقط از یه سری 0 و 1 تشکیل میشه درکشون سخته واسه همین فرستنده و گیرنده از قوانین مشترکی برای ارسال و دریافت داده ها استفاده میکنن.


این قوانین شامل:
  • سرعت انتقال داده ها ( baud rate )
  • طول بیت داده ( bit length )
  • بیت های آغاز و پایان ( Start - Stop bit )
  • بیت توازن ( parity bit )
سرعت انتقال داده ها تو پورت سریال اون اول اولا حداکثر تا 9600bps بود که بعد ها با ورود پنتیوم تا 56K افزایش پیدا کرد. ولی فک کنم استانداردش همون 9600bps باشه چون من همه جا دیدم از 9600bps استفاده میکنن.
طول بیت هم میتونه بین 5 تا 9 بیت باشه و ابن بیتها بین بیت آغاز و پایان فرستاده میشن. ( اینم بگم که اول LSB فرستاده میشه ). تا اونجایی که من میدونم تو #C تو کتابخونه SerialPort حداکثر طول داده میتونه 8 بیت باشه. چون هم کدهای اسکی و هم پورتهای میکرو 8 بیتین واسه همین ما با همون 8 بیت کار میکنیم.
بیت آغاز همیشه یک بیته و اونم همیشه صفره ولی بیت پایان همیشه یکه و میتونه از یک یا دو بیت تشکیل بشه. از دو بیت واسه سیستمهای قدیمی که کند بودن استفاده میشد که تا اومدن بایت جدید زمان داشته باشه خودشو جمع و جور کنه که الانه همه از یه بیت پایان استفاده میکنن.
بیت توازن هم تو بعضی از سیستم ها واسه حفظ درستی داده استفاده میشه. این بیت توازن مدلهای مختلف داره که عبارتند از توازن-فرد، توازن-زوج، بدون-توازن و ... . روش کارش هم اینه که اگه توازن توازن-فرد ( odd-parity ) رو انتخاب کردیم تعداد کل یک های بیت ارسالیمون به اضافه بیت توازن، فرده. یعنی اگه تو دادمون دو تا یک وجود داشته باشه بیت توازنمون میشه 1 ولی اگه سه تا یک وجود داشته باشه میشه 0. تا تعادل برقرار بشه. ما تو این مبحث وارد بیت توازن نمیشیم و از همون توازن بدون-توازن ( none-parity ) استفاده میکنیم.
پس با این احتساب طول قالب داده ارسالیمون میشه 10 بیت ( یک بیت آغاز + هشت بیت داده + یک بیت پایان ). این وسط اینم بگم که زمانی که سیستم در حالت idle ( یعنی داده رد و بدل نمیکنه ) هستش سطح ولتاژش تو حالت 1 هستش.

به شکل زیر یه نیگا بندازین:
من اینجا یه برنامه نوشتم که میکرو کاراکتر H ( که اول کلمه Hadi هستش ) رو میفرسته و شکل سیگنال داده به این صورت هستش.
 کد اسکی کاراکتر 'H' در مبنای دهدهی 72 هستش که در مبنای دودویی میشه:

MSB 01001000 LSB

[تصویر:  2.png]



خب دوستان امیدوارم که خسته نشده باشید

بقیش بمونه واسه جلسه بعدی
Rolleyes
#4

جلسه سوم



خب حالا که با چگونگی تشکیل یه قالب داده در پروتکل UART و شکل سیگنالش آشنا شدیم میریم ببینیم چطوری میشه این سیگنال رو با پورت COM به کامپیوتر بفرستیم و یا سیگنالی که از پورت COM کامپیوتر میاد رو به UART بشناسونیم.

حالا دلیل اینکه میگم بشناسونیم چیه؟ مگه سیگنال RS232 فرق داره؟

در جواب باید بگم بله، فرق داره

RS232 در سال 1960 توسط EIA بوجود اومد بعدها مدلهای RS232B, RS232A و RS232C منتشر شد. ولی ما همون RS232 صداش میکنیم.

این RS232 چون قبل از استاندارد TTL درست شده بود سطح ولتاژهای ورودی و خروجیش با TTL نمیخونه.

سطح بیت 1 ( Hi ) تو RS232 بین 3V- تا 25V- هستش و سطح بیت 0 ( Low ) بین 3V تا 25V هستش. تازه ولتاژ بین 3V- تا 3V رو تعریف نکردن واسش.

واسه همین برای اتصال RS232 به یه سیستم میکروکنترلر باید از مبدل ولتاژ مثل MAX232 واسه تبدیل سطوح ولتاژ RS232 به TTL و برعکس استفاده کنیم.

عکس زیر سطح یک منطقی RS232 رو برای حالت idle نشون میده. همون طور که میبینیم سطح ولتاژش 10.4V- هستش. پس در واقع تو همون حالت Hi هستش که قبلا هم بهش اشاره کرده بودیم.


[تصویر:  3.png]


پس اینجا به این نتیجه میرسیم که اگه در حالت کلی تو RS232 سطح منطقی Hi ولتاژش منفیه و سطح منطقی Low ولتاژش مثبت پس سگینال کاراکتر 'H' هم باید برعکس اون سیگنال قبلی باشه که از UART بدست آورده بودیم.


[تصویر:  4.png]


در آخر هم اشاره ای کنیم به پایه های پورت COM کامپیوتر که با استاندارد RS232 کارمیکنه. از این 9 پایه ای که تو شکل میبینید ما فقط با دو پایش کار داریم.

پایه RX شماره 2 - ( Received Data ) جهت دریافت اطلاعات و پایه TX شماره 3 - ( Transmitted Data ) جهت انتقال اطلاعات.


[تصویر:  5.png]
خب دوستان امیدوارم که خسته نشده باشید

 بقیش بمونه واسه جلسه بعدی
Rolleyes
#5

جلسه چهارم


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


روی منوی File کلیک کنید و New Project رو از زیر منوی New انتخاب کنید. از پنجره باز شده روی Next کلیک کنید تا برسید به این صفحه:

[تصویر:  6.png]


وقتی فیلدهارو پر کردین اونقدر روی Next کلیک کنین که برسین صفحه آخر و روی Finish کلیک کنین.

حالا یه پنجره جلوتونه که فقط کد زیر توش نوشته شده، و باید اینجا کدامونو بنویسیم.

کد:
void main() {



}


 خب حالا کتابخونه UART رو توضیح میدم بعد میریم واسه نوشتن کد.


- کتابخانه UART -


اولش اینو بگم MikroC دو تا کتابخونه UART داره:

  1. کتابخونه UART نرم افزاری - زمانی ازش استفاده میشه که یا میکرومون UART داخلی نداره یا زمانی که نمیخواییم از UART داخلی استفاده کنیم. ( ما باهاش کاری نداریم )
  2. کتابخونه UART سخت افزاری
این کتابخونه شامل توابعی برای دریافت و ارسال داده از طریق مدار UART داخلی میکروه.


حالا این توابع کدومان؟
  • UARTx_Init
  • UARTx_Data_Ready
  • UARTx_Read
  • UARTx_Write
  • و ... ( فعلا اینا کارمونو راه مینداره، بعدا اگه به تابع دیگه نیاز باشه اونجا توضیح میدم )
جریان اون x قرمزه چیه؟

بعضی از میکروها یه دونه مدار UART داخلی دارن، مثل PIC16F877A

ولی بعضیا دو تا دارن مثل PIC18F8520

اگه میکرومون دو تا UART داشت بجای x عدد 1 رو برای UART اولی و عدد 2 رو برای UART دومی مینیویسیم. فعلا ما که میکرومون یه مدار UART داره فقط از عدد 1 استفاده میکنیم.


  • تابع UART1_Init
تابع UART1_Init سخت افزار UART رو با baud rate مناسب تنظیم میکنه. این تابع رو باید همون اول قبل از نوشتن تابع های دیگه بنویسیم. کد زیر UART رو با 9600bps تنظیم میکنه:

کد:
UART1_Init(9600);

  • تابع UART1_Data_Ready
از این تابع هم زمانی که بخواهیم بفهمیم که آیا UART بایتی رو دریافت کرده یا نکرده استفاده میکنیم. اگه دریافت کرده باشه عدد 1 و اگه نکرده باشه عدد 0 رو برمیگردونه.

واسه تشخیص دریافت یه بایت این کدو میشه نوشت:

کد:
if (UART1_Data_Ready() == 1) {

   ...

}

  • تابع UART1_Read
از این تابع هم واسه خوندن یه بایت از UART استفاده میشه، اگه داده ای نباشه عدد 0 رو برمیگردونه. حالا واسه مطمئن شدن میشه این تابع رو بعد از تابع قبلی بنویسیم. کد زیر مقدار بایت دریافت شده رو تو متغییر Data کپی میکنه:

کد:
char Data;

if (UART1_Data_Ready() == 1) {

   Data = UART1_Read();

}

  • تابع UART1_Write
واسه فرستادن یه بایت هم از تابع UART1_Write استفاده میشه.

بایت مورد نظر رو باید به صورت پارامتر به تابع بدیم. کد زیر کاراکتر H رو به UART ارسال میکنه:

کد:
UART1_Write('H');




خب دوستان امیدوارم که خسته نشده باشید

بقیش بمونه واسه جلسه بعدی
Rolleyes
#6

جلسه پنجم

 

حالا بیاین یه برنامه بنوسیم که وقتی میکرو کاراکتر 'A' رو دریافت کرد، پین 0 پورت B رو Hi کنه و در صورت دریافت کارکتر 'B' اونو Low کنه.

کد:
char Data;

void main() {

  TRISB = 0x00;
  PORTB = 0x00;
 
  UART1_Init(9600);
 
  while(1){

      if (UART1_Data_Ready() == 1) {
       
         Data = UART1_Read();
       
         if (Data == 'A'){

           PORTB.b0 = 0x01;
         
         }
       
         if (Data == 'B'){

           PORTB.b0 = 0x00;

         }
       
      }
  }
}



اول برنامه یه متغییر به اسم Data تعریف میکنیم.
بعد پورت B رو بعنوان خروجی تعریف میکنیم و مقدارش رو هم برابر 0 قرار میدیم.
بعد UART رو روی 9600bps تنظیم میکنیم.
بعد یه حلقه تعریف میکنیم و توی حلقه اول چک میکنیم اگه کاراکتری دریافت بشه اون کاراکتر رو توی متغییر Data کپی کنه.
بعد میاییم متغییر رو کنترل میکنیم اگه کاراکتر A بود پین 0 پورت B رو Hi مکنیم - اگه کاراکتر B بود پین 0 پورت B رو Low مکنیم.
حلقه دوباره تکرار میشه.


جهت ایجاد فایل Hex هم کافیه گزینه Build رو از منوی Build انتخاب کنیم.
اگه برناممون خطا نداشته باشه فایل Hex تو همون آدرسی که انتخاب کرده بودیم ایجاد میشه.

[ دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.
]



خب دوستان امیدوارم که خسته نشده باشید

بقیش بمونه واسه جلسه بعدی
Rolleyes
#7

جلسه ششم



خب دوستان میریسم به قسمت برنامه نویسی برای کامپیوتر تحت ویندوز
  • زبان: #C
  • محیط: Visual Studio 2010 - ( البته میشه از نسخه های قبلی و یا جدیدتر هم استفاده کرد )
  • ورژن دات نت: 4 NET Framework. - ( البته میشه از نسخه های قبلی و یا جدیدتر هم استفاده کرد فقط توجه داشته باشید برای اجرای تو کامپیوتر دیگه, حداقل نسخه ای که انتخاب کردین باید نصب باشه )

از اونجا که آموزش کامل #C اینجا مقدور نیست و از بحثمون هم خارجه من فقط چزایی که الان لازمه رو میگم.
برای اون دوستایی که با #C زیاد آشنا نیستن دو تا دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.
گذاشتم. یکیش 580 صفحه اون یکی 950 صفحه که اینجا از تهیه کننده هاشون تشکر میکنم.

پس از نصب و اجرای Visual Studio و انتخاب زبان #C جهت زبان پیشفرض به منوی File برین و گزینه Project رو از زیر منوی New انتخاب کنین تا این پنجره باز شه:

[تصویر:  7.png]

وقتی فیلدها رو پر کردین روی Next کلیک کنین. حالا یه فرم به اسم Form 1 جلوتون میبین. این فرم همون پنجره ی برنامتونه. واسه رفتن به قسمت کدها روش کلیک راست کنین و View Code رو انتخاب کنید.

بطور پیشفرض این کدها رو میبینید:

کد:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace SerialPort_1
{
   public partial class Form1 : Form
   {
      public Form1()
      {
         InitializeComponent();
      }
   }
}


همون اول کد زیر رو بعد از آخرین using اضافه کنید تا کلاس پورتها فراخوانی بشه.

کد:
using System.IO.Ports;


حالا نوبت مییرسه به تنظیم همون قوانین UART که قبلا در موردش بحث کرده بودم. با اضافه کردن کد زیر یه پورت به اسم "sp" ساخته میشه که درگاهش پورت COM1 و baud rate رو روی 9600bps و بیت توازن رو روی بدون-توازن و طول داده رو 8 بیت و در آخر بیت پایان رو روی بیت 1 تنظیم میکنه.

کد:
SerialPort sp = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);


حالا دوباره به قسمت دیزاین برگردین ( کلیک راست کنین و View Designer رو انتخاب کنید ) و از سمت چپ صفحه از قسمت ToolBox دو تا Button به فرم اضافه کنید.

روی هر کدوم کلیک کرده و از قسمت Properties ( سمت راست - پایین صفحه ) مقدار Text رو به " LED On " و " LED Off " تغییر بدین.

روی Button اولی ( LED On ) دوبار کلیک کنید و کد زیر رو در همون محلی اشاره گر کیبرد واستاده بنویسید. این کد اول پورتمون رو باز میکنه ( یعنی اجازه استفاده پورت رو به #C میده ) و بعدش کاراکتر A رو ( در واقع کد اسکیشو ) به پورت میفرسته و در آخر دوباره پورتو میبنده. ( به این باز کردن و بستن پورت دقت کنید. زمانی که با پورت کار ندارین ببندینش )

کد:
sp.Open();
sp.Write("A");
sp.Close();


این کد رو به همین طریق واسه Button دومی بنویسین.

کد:
sp.Open();
sp.Write("B");
sp.Close();


فقط همین. کلید F5 رو بزنید و نتیجه رو ببینید. پروژه رو ذخیره کنین. فایل اجرایی برنامه هم تو همون آدرسی که قبلا انتخاب کرده بودین تو پوشه Bin\Debug قرار داره.


این هم یه عکس از کدها و پنجره برناممون

[تصویر:  8-264-831.png]


[ دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.
]



خب دوستان امیدوارم که خسته نشده باشید

بقیش بمونه واسه جلسه بعدی
Rolleyes
#8

جلسه هفتم



خب حالا رسیدیم به مرحله جذاب و هیجان انگیز کار

( واسه دیدن عکسا تو سایز اصلی روشون کلیک کنین )

شماتیک مدار

دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.

[ دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.
]


این هم زمانی که تو پروتئوس اجرا میکنیم

دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.


دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.



توجه:

فقط یه مسئله رو اینجا توضیخ بدم. آیسی MAX232 که تو پروتئوسه، سیگنال خروجی رو معکوس میکنه ( اگه دقت کنین روی پایه 12 یه دایره کوچیک هستش ). حالا واسه اینکه دوباره به همون حالت اول برش گردونم از آیسی 7404 ( NOT ) استفاده کردم که توی عمل نیازی به معکوس کردن سیگنال نیست.




[ دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.
]



خب دوستان امیدوارم که خسته نشده باشید

بقیش بمونه واسه جلسه بعدی
Rolleyes
#9

جلسه هشتم

 
حالا بیاین یه برنامه بنویسیم که وقتی پین 0 پورت B رو Hi کردیم میکرو کاراکتر 'A' رو ارسال کنه.

کد:
void main() {

  TRISB = 0xFF;
  PORTB = 0x00;
 
  UART1_Init(9600);
 
  while(1){

      if (Button (&PORTB, 0,1,1)) {
       
         UART1_Write('A');
       
         while(PORTB.b0);
       
      }
  }
}


پورت B رو بعنوان ورودی تعریف میکنیم و مقدارش رو هم برابر 0 قرار میدیم.
بعد UART رو روی 9600bps تنظیم میکنیم.
بعد یه حلقه تعریف میکنیم و توی حلقه اول چک میکنیم اگه پین 0 پورت B یک ( Hi ) شد کاراکتر 'A' رو ارسال کنه.
جهت ایجاد فایل Hex هم کافیه گزینه Build رو از منوی Build انتخاب کنیم.
اگه برناممون خطا نداشته باشه فایل Hex تو همون آدرسی که انتخاب کرده بودیم ایجاد میشه.

[ دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.
]



خب دوستان امیدوارم که خسته نشده باشید

بقیش بمونه واسه جلسه بعدی
Rolleyes
#10

جلسه نهم



حالا میرسیم به جایی که باید یه برنامه واسه کامپیوتر بنویسیم که داده ای که از طرف میکرو ارسال میشه رو دریافت کنه و نسبت به اون یه کاری انجام بده.

اول روی فرممون دو تا Label اضافه میکنیم و نوشته هاشون رو مثل شکل تغییر میدیم. قصدمون اینه که هر وقت کاراکتر "A" رو دریافت کردیم نوشته Label2 به "Hi" تغییر کنه.

نوشتن برنامه دریافت داده تو #C با ارسال داده یه کمی فرق داره و باید برناممون طوری باشه که هر موقع داده ای دریافت شد بدون دخالت کاربر عکس العمل نشون بده. اگه یادتون باشه برای ارسال داده، کاربر باید روی دگمه کلیک میکرد یعنی زمان ارسال، دست کاربر بود. واسه همین هم همون اول برنامه پورت رو باز ( Open ) میکنیم.

واسه این کار ( عکس العمل برنامه ) ما از یه کامپوننت ( Component ) به نام SeriaPort استفاده میکنیم که اونو از پنجره ToolBox به فرم اضافه کنین و اسمشو به sp تغییر بدین.

ما تو برنامه قبلی ( ارسال داده ) توی یه سطر تنظیمات پورت UART رو انجام داده بودیم که حالا این تنظیمات رو روی همون کامپوننت SerialPort تو پنجره Properties انجام میدیم و دیگه نیازی به نوشتن کد نمیمونه.

پس از تنظیمات UART میرسیم به نوشتن کدی که هر موقع داده ای دریافت شد برناممون متوجه بشه. واسه این کار ما از رویداد DataReceived که یکی از سه رویداد ( Events ) کامپوننت SerialPort هست استفاده خواهیم کرد.

پس از کلیک روی کامپوننت SerialPort در زیر فرم و انتخاب Events ( یه آیکون به شکل رعد و برق ) تو پنجره Properties و دابل کلیک روی رویداد DataReceived یه متدی به کدهامون اضافه میشه که باید دستوری رو توش بنویسیم که داده دریافت شده رو توی یه متغییر ذخیره کنه و به یه متد دیگه واسه نمایش ( یا هر کار دیگه ) ارسال کنه. برای دسترسی به داده دریافت شده هم از تابع ReadExisting که یکی از توابع کامپوننت SerialPort هستش استفاده میشه.

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

کد:
strData = sp.ReadExisting();
this.Invoke(new EventHandler(ChangeLabel));
sp.Close();



اول داده دریافت شده رو توی یه متغییر به اسم strData که اول برنامه تعریف کردیم کپی میکنیم.

توسط تابع Invoke یک رونوشت از متغییرهای مورد استفاده در متد حاضر، جهت دسترسی در متد ChangeLabel مهیا میشه. ( البته هنوز متد ChangeLabel رو ننوشتیم ).

دلیل اینکه چرا از تابع Invoke استفاده میکنیم و چرا کارمون رو تو همین متد ادامه نمیدیم برمیگرده به بحث اولویت Thread ها، که خودش یه مبحث جداس.

در آخر هم با تابع Close پورتمون رو میبندیم. ( در مورد این قبلا بحث شده ).

حالا میرسیم به نوشتن متد ChangeLabel که توجه کنین حتما باید قبل از رویداد DataReceived نوشته بشه.

اینهم کدهای متد ChangeLabel که فقط توش بررسی میکنیم اگه داده دریافت شده برابر "A" باشه نوشته Label2 به "Hi" تبدیل بشه.

کد:
public void ChangeLabel(object sender, EventArgs e)
{
   if (strData == "A")
   {
       label2.Text = "Hi";
   }
}


به همین سادگی.



این هم یه عکس از کدها و پنجره برناممون

[تصویر:  9-774-309.png]


[ دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.
]



خب دوستان امیدوارم که خسته نشده باشید

بقیش بمونه واسه جلسه بعدی
Rolleyes
#11

جلسه دهم



خب حالا رسیدیم به مرحله جذاب و هیجان انگیز کار

( واسه دیدن عکسا تو سایز اصلی روشون کلیک کنین )

شماتیک مدار

دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.

[ دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.
]


این هم زمانی که تو پروتئوس اجرا میکنیم

دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.


دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.



توجه:

فقط یه مسئله رو اینجا توضیح بدم. آیسی MAX232 که تو پروتئوسه, سیگنال خروجی رو معکوس میکنه ( اگه دقت کنین روی پایه 14 یه دایره کوچیک هستش ). حالا واسه اینکه دوباره به همون حالت اول برش گردونم از آیسی 7404 ( NOT ) استفاده کردم که توی عمل نیازی به معکوس کردن سیگنال نیست.




[ دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.
]



خب دوستان امیدوارم که خسته نشده باشید

بقیش بمونه واسه جلسه بعدی
Rolleyes
#12

UART Terminal



( واسه دیدن عکس تو سایز اصلی روش کلیک کنین )

دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.

[ دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.
]



دوستان امیدوارم که بدردتون بخوره

ضمنا این برنامه نوشته خودمونه، پس هر جاش که دیدین نیاز به تغییر داره با ما درمیون بذارین
Rolleyes
مشترک شدن در این موضوع موضوع بسته شده است 


موضوعات مرتبط با این موضوع...
موضوع نویسنده پاسخ بازدید آخرین ارسال
  آموزش دستورات اسمبلی میکروکنترلرهای PIC به زبان فارسی هادی 36 5,246 ۱۳۹۵/۰۱/۰۸، ۰۷:۳۰ ب.ظ
آخرین ارسال: هادی


کاربرانِ درحال بازدید از این موضوع: 1 مهمان

انتخاب پوسته :

دسترسی سریع
درباره ما
انجمن سرزمین الکترونیک در یکم فروردین 1395 تاسیس شده، که همیشه سعی کرده با ظاهری متفاوت و سرعتی خوب رضایت کاربران را جلب کند، امیدواریم توانسته باشیم گامی کوچک در پیشرفت فناوری در ایران برداشته باشیم...
نیرو گرفته از MyBB با فارسی سازی مای بی بی ایران - طراحی شده در : ملت دیزاین
© تمامی حقوق برای انجمن سرزمین الکترونیک محفوظ می باشد .