اطلاعیه

Collapse
No announcement yet.

دریافت رشته از وقفه ی یوزارت

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    دریافت رشته از وقفه ی یوزارت

    سلام
    من دنبال کدی هستم که : :wow:
    میکروی اول همواره از طریق یوزارت یک رشته ارسال میکنه
    میکروی دوم باید اون رو دریافت کنه
    ((و توسط یک تابع دیگه در خط دوم !! ال سی دی نشون بده))
    ولی چون طول رشته ی ارسالی همواره متغیره ، پس باید حتما از طریق وقفه خونده بشه
    آیا کسی هست که بتونه کمک کنه یا کد آماده داشته باشه (کدویژن) ؟ :read:
    .
    .
    حداکثر طول رشته ای که فرستنده میفرسته 16 تاست !

    #2
    پاسخ : دریافت رشته از وقفه ی یوزارت

    سلام شما اول بیا تو فرستندت این منطق رو بزار که رشته ای رو که ارسال میکنه انتهاش دو تا بایت مشخص بفرسته مثلا 14 و 15 یا هر عدد دیگه ای
    بعد در گیرندت یه متغیر از نوع آرایه به طول 18 تا بگیر با یه متغیر از نوع CHAR برای اشاره به آرایه مقادیر هر دو متغییر رو صفر کن در شروع برنامت تو زیر برنامه وقفت
    مقدار در یافتی در UDR رو بریز تو آرایه ای که اشاره گر بهش اشاره میکنه بعد این شرط و چک کن ببین آیا آرایه ای که اشاره گر منهای یک بهش اشاره میکنه برابر 14 هست و بعدش آیا آرایه ای که اشاره گر بهش اشاره میکنه برابر 15 هست اگر بود مقدار آرایه ای که اشاره گر منهای یک بهش اشاره میکنه رو صفر کن تا آرایت ماهیت رشته بگیره (انتهاش مشخص شه 15 و 14 نمایش داده نشه ) رشته دریافت شده و رو نمایشگر نشونش بده و اشاره گر و آرایه رو برا دریافت بعدی صفر کن اگه نبود یک واحد به اشاره گر اضافه کن این روند ادامه پیدا می کنه تا رشته باشرط که در فرستنده گذاشتی دریافت شه
    جهان پیر است و بی بنیاد ازاین فرهاد کش فریاد
    که کرد افسون و نیرنگش ملول از جان شیرینم

    دیدگاه


      #3
      پاسخ : دریافت رشته از وقفه ی یوزارت

      سلام
      ممنونم
      سمت ارسال من یک رشته دارم و ارسال میشه
      باید موقع رشته کردنش دو تا کد بهش اضافه کنم !
      سمت دریافت هم اگه اون دو تا کد رو حذف کنم
      درسته ؟
      ولی چطوری با وقفه ؟

      دیدگاه


        #4
        پاسخ : دریافت رشته از وقفه ی یوزارت

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

        دیدگاه


          #5
          پاسخ : دریافت رشته از وقفه ی یوزارت

          نیازی نیست آخر رشته 2 تا کاراکتر اضافه کنی. چون اگه تصادفا این دو کاراکتر تو رشته باشن مشکل پیش میاد. باید تو فرستنده اول رشته یک کاراکتر اضافه کنی که توش طول رشته را قرار بدی.
          این روش هم پردازش کمتری را می طلبه و هم ارسال اطلاعات سریعتر و مقدار رشته کوتاهتر میشه.
          در زیر این نقاب چیزی بیشتر از گوشت هست. در زیر این نقاب یک ایده هست و ایده ها ضدگلوله هستند.

          1-به اندازه ی باورهای هر کسی ؛ با او حرف بزن …. بیشتر که بگویی ، تو را احمق فرض خواهد کرد …!!!
          2-تنها دو گروه نمى توانند افکار خود را عوض کنند: دیوانگان تیمارستان و مردگان گورستان.
          3-آدم ها مثل عکس ها هستند: زیاد بزرگشون کنی ، کیفیتشون میاد پایین!

          دیدگاه


            #6
            پاسخ : دریافت رشته از وقفه ی یوزارت

            ممنون م از دوستانی که پاسخ دادن
            مشکل م حل شد تقریبا
            این هم کدش !
            #include <mega32.h>
            #include <lcd.h>
            #include <delay.h>
            #include <stdio.h>
            #asm
            .equ __lcd_port = 0x1b ;
            #endasm
            ///
            ///
            //// global vars
            ///
            ///
            unsigned char l1lcd[20] = "Test from A ...";
            unsigned char l2lcd[20] ;
            unsigned char buffer ;
            unsigned char pos = 0 ;
            ///
            ///
            //// usart intrrupt
            ///
            ///
            interrupt [USART_RXC] void usart_rx_isr(void)
            {
            buffer = UDR ;
            if(pos < 16)
            {
            l2lcd[pos] = buffer ;
            pos++ ;
            }
            }
            //interrupt [USART_TXC] void usart_tx_isr(void)
            //{
            // //UDR = l1lcd ;
            // puts(l1lcd) ;
            //}

            ///
            ///
            //// main
            ///
            ///
            void main(void)
            {

            UCSRA = 0x00 ; // 00
            UCSRB = 0x98 ; // 98
            UCSRC = 0x86 ; // 86
            UBRRH = 0x00 ; // 00
            UBRRL = 0x2f ; // 2f

            lcd_init(16);
            lcd_clear();
            delay_ms(1000) ;
            lcd_gotoxy(0,0) ;
            lcd_putsf("Salaaaaam !!A "
            delay_ms(3000);
            lcd_clear() ;
            delay_ms(1000) ;

            #asm("sei&quot

            while (1)
            {
            puts(l1lcd) ;
            lcd_gotoxy(0,0) ;
            lcd_puts(l1lcd) ;
            lcd_gotoxy(0,1) ;
            lcd_puts(l2lcd) ;
            }
            }

            دیدگاه


              #7
              پاسخ : دریافت رشته از وقفه ی یوزارت

              چه کاریه؟
              خب اولش یک بایت بفرست که طول پیام رو مشخص کنه بعد پیام رو بفرست

              دیدگاه


                #8
                پاسخ : دریافت رشته از وقفه ی یوزارت

                سلام دوستان
                من یه مشکل خیلی مبتدی دارم
                لطفا راهنمایی کنید
                من رشته رو روی سریال ارسال میکنم
                مثلا : 15 یا A5
                بعد در گیرنده روی lcd نمایش میده
                ولی وقتی رشته رو داخل شرط میزاره فقط تا رشته های 0 تا 9 رو جواب میده.
                کد:
                [FONT=Yekan]        if (code[2]=='15'){ [/FONT]
                من دستور شرط رو درست نوشتم ؟؟؟؟
                مشکل از چیه
                من فقط میخوام برای رشته در کدویژن شرط بزارم همین
                اینم دستور دریافت اطلاعات از سریال :
                کد:
                code[2]=getchar();

                دیدگاه


                  #9
                  پاسخ : دریافت رشته از وقفه ی یوزارت

                  سلام
                  شما اگر میخوایی مقدار عددی کاراکتر تو آرایه رو مقایسه کنی برای عددهای بزرگتر از 9 باید از کد هگز اونا استفاده کنی (نمیشه بنویسی '15')
                  اگر میخوایی دو تا رشته رو با هم مقایسه کنی ینی میخوایی ببنینی مثلا رشته a که مثلا کلمه hello هست با رشته b برابر هست یا نه باید از دستور strcmp استفاده کنی که توضیحاتش در لینک زیر هست :

                  موفق باشی

                  دیدگاه


                    #10
                    پاسخ : دریافت رشته از وقفه ی یوزارت

                    سلام دوستان
                    از جناب M3R-E بابت راهنمایی خوبشون تشکر میکنم

                    یه سوال داشتم مگه برای دریافت اطلاعات از سریال از دستور getchar استفاده نمیشه ؟؟؟؟
                    کد:
                    [FONT=Yekan]  char code[80];                  [/FONT]    int result;
                        char example1[50];
                        char example2[50];
                        
                        
                        code[10]=getchar(); 
                    
                    
                                                     
                        strcpy(example1,"15");
                        strcpy(example2,code);
                    
                    
                        result = strcmp(example1, example2);
                    
                    
                        if (result == 0){ 
                            PORTB.1=1;
                        };
                    پس چرا جواب نمیده !!!!

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

                    روی lcd با کد زیر عدد 15 که به سریال فرستادم رو نمایش میده
                    کد:
                    lcd_putchar(code[10]);
                    ولی مقایسه نمیکنه !!!!

                    به نظرتون مشکل از کجاست ؟؟؟
                    من دارم با گوشی آندروید و بلوتوث این کد ها رو ارسال میکنم

                    با تشکر فراوان
                    جدیدترین ویرایش توسط alinavidy; ۰۹:۲۸ ۱۳۹۵/۰۵/۱۲.

                    دیدگاه


                      #11
                      پاسخ : دریافت رشته از وقفه ی یوزارت

                      سلام
                      exapmple1[0]=0x0f قرار بده احتمالا درست شه! (معادل هگز عدد 15) واسه یه کاراکتر دیگه نیازی به اون تابع stcpy نیست!
                      بعد چرا آرایه 80 تایی تعریف کردید؟؟
                      شما یه آرایه 2 بایتی هم تعریف کنید واسه این کار کافیه!
                      واسه این کار هم باید فکر یه روش بهتر باشید!


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

                      دیدگاه


                        #12
                        پاسخ : دریافت رشته از وقفه ی یوزارت

                        سلام
                        بازهم تشکر میکنم
                        دوست عزیز اگه بخوام مثلا با A5 مقایسه بشه باید چی کار کنم

                        ممنون

                        دیدگاه


                          #13
                          پاسخ : دریافت رشته از وقفه ی یوزارت

                          سلام
                          من اینو گذاشتم
                          exapmple1[0]=0x0f
                          ولی با هر چیزی مقایسه میکنه نتیجه صفر مشه!!!!!!

                          دیدگاه


                            #14
                            پاسخ : دریافت رشته از وقفه ی یوزارت

                            دوستان یه کمکی کنید

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

                            کد:
                            [FONT=Yekan]$regfile = "m32def.dat"[/FONT]$crystal = 8000000
                            '-------------------------------------------------------------------------------
                            $baud = 57600
                            '-------------------------------------------------------------------------------
                            Dim S1 As Byte
                            '-------------------------------------------------------------------------------
                            Config Portb.0 = Output
                            Config Portb.1 = Output
                            Config Portb.2 = Output
                            Config Portb.3 = Output
                            '-------------------------------------------------------------------------------
                            Enable Interrupts
                            Enable Urxc
                            On Urxc Serial_in
                            '-------------------------------------------------------------------------------
                            Do
                                Idle
                            Loop
                            
                            
                            End
                            '-------------------------------------------------------------------------------
                            Serial_in:
                            
                            
                             S1 = Udr
                            
                            
                               If S1 = "15" Then
                            
                            
                                     Portb.0 = 1                                        'rellay1 on
                                     Portb.2 = 1
                                                                            'led1 on
                               Elseif S1 = "2" Then
                            
                            
                                     Portb.0 = 0                                        'rellay1 off
                                     Portb.2 = 0
                                                                            'led1 off
                               Elseif S1 = "A5" Then
                            
                            
                                     Toggle Portb.1                                     'rellay2 on/off
                                     Toggle Portb.3
                                                                          'led2 on/off
                               End If
                            
                            
                            Return
                            [FONT=Yekan]'-------------------------------------------------------------------------------[/FONT]

                            دیدگاه


                              #15
                              پاسخ : دریافت رشته از وقفه ی یوزارت

                              شما کلا باید روش برنامه نویسیتون رو تغییر بدین!!
                              اگه از وقفه سریال استفاده کنید کارتون خیلی راحت تر میشه!
                              اگه نمیخواید از وقفه استفاده کنید یه تابع به شکل زیر بنویسید :
                              کد:
                              for (f1=0;f1<20;f1++) temp[f1]=0;
                              f1=0;
                                  while (   (t = getchar()) != 0 ) {
                                      temp[f1] =t;
                                      f1++;
                                      temp[f1]=0;
                                      _delay_ms(10);
                                  }
                              و مثلا هر 2 ثانیه 1 بار اجراش کنید
                              رشته دریافتی از پورت سریال درون متغیر temp قرار میگیره و میتونید با هر چیزی مقایسش کنید!فقط اینو در نظر داشته باشید که کاراکتر ارسال کنید و کد 0 تا 31 تو اون جدولی که واستون تو پست قبل گذاشتم نفرستید!
                              اون حلقه for ابتدای تابع هم واسه این هست که رشته قبل که دریافت شده رو کامل حذف کنه و رشته جدید دریافت بشه (اون عدد 20 رو به نسبت تعداد آرایه های متغییری که تعریف کردید تغییر بدید)
                              موفق باشید

                              اسم بیسیک رو دیگه جلو من نیارید که عمرم رو پاش تلف کردم فقط AVR STUDIO
                              جدیدترین ویرایش توسط M3R-E; ۱۱:۲۷ ۱۳۹۵/۰۵/۱۲.

                              دیدگاه

                              لطفا صبر کنید...
                              X