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


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

Idea


İmage


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



Idea
support.wle.ir
#2
Lightbulb 
Rolleyes سلام دوستان Rolleyes


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


مواد لازم:

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



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


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


Cc


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

ضمنا هرگونه استفاده محتوايی و کپی برداری حتی با ذکر منبع نیز ممنوع اسـت
support.wle.ir
#3
Lightbulb 
Rolleyes سلام دوستان Rolleyes

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

İmage


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


ارتباط سریال هم دو روش داره:


  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 هستش Big Grin ) رو میفرسته و شکل سیگنال داده به این صورت هستش.

کد اسکی کاراکتر 'H' در مبنای دهدهی 72 هستش که در مبنای دودویی میشه:


MSB 01001000 LSB

İmage




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


بقیش بمونه واسه پست بعدی


Rolleyes
support.wle.ir
#4
Lightbulb 
İmage سلام دوستان İmage

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

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

در جواب باید بگم بله, فرق داره :D


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

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

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

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

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


İmage


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


İmage



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

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


İmage

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


بقیش بمونه واسه پست بعدی


İmage
support.wle.ir
#5
Lightbulb 
İmage سلام دوستان İmage

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

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

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

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


İmage



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

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


کد:
void main() {



}




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


- کتابخانه UART -


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

  • کتابخونه UART نرم افزاری - زمانی ازش استفاده میشه که یا میکرومون UART داخلی نداره یا زمانی که نمیخواییم از UART داخلی استفاده کنیم. ( ما باهاش کاری نداریم )
  • کتابخونه UART سخت افزاری

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

حالا این توابع کدومان؟


  1. UARTx_Init
  2. UARTx_Data_Ready
  3. UARTx_Read
  4. UARTx_Write
  5. و ... ( فعلا اینا کارمونو راه مینداره, بعدا اگه به تابع دیگه نیاز باشه اونجا توضیح میدم )

جریان اون 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');





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


بقیش بمونه واسه پست بعدی


İmage
support.wle.ir
#6
Lightbulb 
İmage سلام دوستان İmage

حالا بیاین یه برنامه بنوسیم که وقتی میکرو کاراکتر '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 تو همون آدرسی که انتخاب کرده بودیم ایجاد میشه.



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




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


بقیش بمونه واسه پست بعدی


İmage
support.wle.ir
#7
Lightbulb 
İmage سلام دوستان İmage

خب دوستان میریسم به قسمت برنامه نویسی برای کامپیوتر تحت ویندوز

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


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

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



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


İmage


وقتی فیلدها رو پر کردین روی 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 تنظیم میکنه.

( اگه از مبدل USB به RS232 استفاده میکنین میتونین درگاه پورت COM رو خودتون انتخاب کنین )

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




حالا از سمت چپ صفحه از قسمت 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 قرار داره.



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

İmage



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




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


بقیش بمونه واسه پست بعدی


İmage
support.wle.ir
#8
Lightbulb 
İmage سلام دوستان İmage


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



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


شماتیک مدار

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




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




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

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


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



توجه:

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




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



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


بقیش بمونه واسه پست بعدی


İmage
support.wle.ir
#9
Lightbulb 
İmage سلام دوستان İmage

حالا بیاین یه برنامه بنویسیم که وقتی پین 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 تو همون آدرسی که انتخاب کرده بودیم ایجاد میشه.



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




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


بقیش بمونه واسه پست بعدی


İmage
support.wle.ir
#10
Lightbulb 
İmage سلام دوستان İmage
 
حالا میرسیم به جایی که باید یه برنامه واسه کامپیوتر بنویسیم که داده ای که از طرف میکرو ارسال میشه رو دریافت کنه و نسبت به اون یه کاری انجام بده.

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

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

واسه این کار ( عکس العمل برنامه ) ما از یه کامپوننت ( Component - فارسیش نمیدونم چی میشه İmage ) به نام 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";
    }
}




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



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

İmage



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




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


بقیش بمونه واسه پست بعدی


İmage
[/align]
support.wle.ir
مشترک شدن در این موضوع موضوع بسته شده است 


پرش به انجمن:

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

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

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

پوسته‌ی انجمن: