اطلاعیه

Collapse
No announcement yet.

USART

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

    #31
    پاسخ : USART

    من از کامپیوتر 16 بایت میفرستم ولی میکرو فقط یک بایت میگیره (بایت اول رو)

    کد دریافتم اینه :

    کد:
     TO=0;
     BufLen=0;
     while(1){ 
     if((*AT91C_US0_CSR) & AT91C_US_RXRDY){
      RBUF[BufLen]=*AT91C_US0_RHR;
      BufLen++;
     }else TO++;
     if(TO>=(184320)) 
      break;
     }
    ولی در ارسال از میکرو به کامپیوتر مشکلی ندارم

    دیدگاه


      #32
      پاسخ : USART

      sam7s64 بافری به صورت سخت افزاری برای بایت های دریافتی نداره؟
      دستور scanf رو هم برای خوندن رشته امتحان کردم که اونم کار نکرد
      چطور مینونم یه رشته رو دریافت کنم؟
      من کد بالا رو استفاده کردم و TO هم برای تایم اوت در نظر گرفتم که حدود 50 میلی ثانیه میشه تا یک ثانیه هم زیادش کردم فرقی نکرد و فقط یک بایت دریافت میکنه

      دیدگاه


        #33
        پاسخ : USART

        نوشته اصلی توسط gbg
        sam7s64 بافری به صورت سخت افزاری برای بایت های دریافتی نداره؟
        دستور scanf رو هم برای خوندن رشته امتحان کردم که اونم کار نکرد
        چطور مینونم یه رشته رو دریافت کنم؟
        من کد بالا رو استفاده کردم و TO هم برای تایم اوت در نظر گرفتم که حدود 50 میلی ثانیه میشه تا یک ثانیه هم زیادش کردم فرقی نکرد و فقط یک بایت دریافت میکنه
        نه فک نکنم چون وقتی دیتا میاد اگه نخونی دیتا از دستت میره. ولی شاید داشته باشه و فعال نباشه (مطمئن نیستم)
        من به دستور نوشتم به صورت زیر که رشته رو دریافت میکنه. مثل scanf هست ولی اسپیس رو به عنوان انتهای رشته دریافتی در نظر نمیگیره
        کد:
        void getstr(char *str)
        {
          char ch = 0;
          ch = getkey();
          while((ch == 10) || (ch == 13) || (ch == 0))
            ch = getkey();
          
          while((ch != 10) && (ch != 13))
          {
            *str++ = ch;
            ch = getkey();
          }
          *str = 0;
        }
        این کد تا رشته رو دریافت نکنه همچنان منتظر میمونه
        زندگی یعنی امید و حرکت
        کارهایتان را آغاز کنید، توانایی انجام دادنش را بدست خواهید آورد
        سوالاتی که در انجمن قابل طرح شدن هستند در پیام خصوصی جواب داده نمی شود.
        برای تشکر از دکمه تشکر کنار هر پست استفاده کنید، پست هایی که فقط حاوی تشکر هستند پاک می شوند.
        به دلیل کار بر روی پایاننامه و دفاع، مدتی نیستم!

        دیدگاه


          #34
          پاسخ : USART

          من رشته ام طولش نا مشخه و با 10 و 13 هم تموم نمیشه
          رشته باینری هستش
          بخاظر همین تا زمانی که ارسال میشه باید بخونم
          شاید هم بایت آخر رو میگیره چون بایت اول و آخر مثل هم هستن
          ولی طول رشته خونده شده 1 هستش

          دیدگاه


            #35
            پاسخ : USART

            نوشته اصلی توسط gbg
            من رشته ام طولش نا مشخه و با 10 و 13 هم تموم نمیشه
            رشته باینری هستش
            بخاظر همین تا زمانی که ارسال میشه باید بخونم
            شاید هم بایت آخر رو میگیره چون بایت اول و آخر مثل هم هستن
            ولی طول رشته خونده شده 1 هستش
            ببین
            آخر رشته ارسالی باید یه پایان دهنده باشه و پایان دهنده هم یا LF هست یا CR که کدشون 10 و 13 هست
            توی دستورات متلب یه چیزی به نام ترمیناتور داره و به صورت پیش فرض وقتی پورت سریال رو میسازی LF هست. پس شما توی برنامت LF روارسال میکنی
            پیشنهادم اینه که مرحله به مرحله بری جلو
            اول تک کاراکتر بده دوتا غیر یکسان و بعد رشته مورد نظرت رو ارسال کن
            مراحل اول برای اینه که فقط یاد بگیری نه برای همیشه
            زندگی یعنی امید و حرکت
            کارهایتان را آغاز کنید، توانایی انجام دادنش را بدست خواهید آورد
            سوالاتی که در انجمن قابل طرح شدن هستند در پیام خصوصی جواب داده نمی شود.
            برای تشکر از دکمه تشکر کنار هر پست استفاده کنید، پست هایی که فقط حاوی تشکر هستند پاک می شوند.
            به دلیل کار بر روی پایاننامه و دفاع، مدتی نیستم!

            دیدگاه


              #36
              پاسخ : پاسخ : USART

              نوشته اصلی توسط علی ایمانی فر
              ببین
              آخر رشته ارسالی باید یه پایان دهنده باشه و پایان دهنده هم یا LF هست یا CR که کدشون 10 و 13 هست
              توی دستورات متلب یه چیزی به نام ترمیناتور داره و به صورت پیش فرض وقتی پورت سریال رو میسازی LF هست. پس شما توی برنامت LF روارسال میکنی
              پیشنهادم اینه که مرحله به مرحله بری جلو
              اول تک کاراکتر بده دوتا غیر یکسان و بعد رشته مورد نظرت رو ارسال کن
              مراحل اول برای اینه که فقط یاد بگیری نه برای همیشه
              تست کردم فقط بایت اول رو میگیره
              با اسکپ که چک می کنم اگه یک بایت بفرستم سریع چشمک میزنه ولی وقتی که چندتا میفرستم بیشتر میشه

              دیدگاه


                #37
                پاسخ : پاسخ : USART

                نوشته اصلی توسط gbg
                تست کردم فقط بایت اول رو میگیره
                با اسکپ که چک می کنم اگه یک بایت بفرستم سریع چشمک میزنه ولی وقتی که چندتا میفرستم بیشتر میشه
                از تابعی که من دادم استفاده کردی؟
                یه آرایه تعریف کن به عنوان ورودی بهش بده باید کامل بخونه
                راستی چه جوری داده ها رو ارسال میکنی؟
                با چه دستوری؟
                اگه میشه برنامه متلب و میکرو رو بزار چک کنم
                زندگی یعنی امید و حرکت
                کارهایتان را آغاز کنید، توانایی انجام دادنش را بدست خواهید آورد
                سوالاتی که در انجمن قابل طرح شدن هستند در پیام خصوصی جواب داده نمی شود.
                برای تشکر از دکمه تشکر کنار هر پست استفاده کنید، پست هایی که فقط حاوی تشکر هستند پاک می شوند.
                به دلیل کار بر روی پایاننامه و دفاع، مدتی نیستم!

                دیدگاه


                  #38
                  پاسخ : USART

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

                  دیدگاه


                    #39
                    پاسخ : USART

                    نوشته اصلی توسط gbg
                    نه از کد شما استفاده نکردم
                    با همون کد خودم تست کردم
                    بعد با متلب ننوشتم با دلفی نوشتم
                    من فک میکنم مشکلت با کدی هست که برای میکرو نوشتی
                    گفتی کامپایلرت IAR هست؟
                    زندگی یعنی امید و حرکت
                    کارهایتان را آغاز کنید، توانایی انجام دادنش را بدست خواهید آورد
                    سوالاتی که در انجمن قابل طرح شدن هستند در پیام خصوصی جواب داده نمی شود.
                    برای تشکر از دکمه تشکر کنار هر پست استفاده کنید، پست هایی که فقط حاوی تشکر هستند پاک می شوند.
                    به دلیل کار بر روی پایاننامه و دفاع، مدتی نیستم!

                    دیدگاه


                      #40
                      پاسخ : USART

                      الان حل شد
                      مشکل کد بودش
                      با کیل نوشته بودم
                      ممنون

                      دیدگاه


                        #41
                        پاسخ : USART

                        من یک کد نوشتم که یک استرینگ رو از پورت سریال دریافت کنه و مثل مشکل کاربر gbg فقط یک کاراکتر دریافت می کنه.البته گاهی هم مثلا وقتی یه استرینگ با چهارتا کاراکتر میفرستم،به طور نا منظم یکی دوتاشو نشون میده.کد زیر رو در کامپایلر iar نوشتم:
                        کد:
                        unsigned char * getstring_usart0(void)
                        {
                         static unsigned char received[16] = " ";//an array of recieved bytes
                         unsigned char counter = 0;
                         unsigned char data;
                        
                         while ((AT91C_BASE_US0->US_CSR&0x1)!=0x1)//while data is ready,build the array
                         {
                          data = AT91C_BASE_US0->US_RHR&0xff;
                          received[counter] = data;
                          counter++;
                         }
                         return received;
                        }
                        تو بدنه اصلی هم اینطوری صدا زدمش:
                        کد:
                          unsigned char s = *getstring_usart0();
                          lcd_gotoxy(0,0);
                          lcd_putchar(s);
                        مشکل کد شما چه طور درست شد؟

                        دیدگاه


                          #42
                          پاسخ : USART

                          من برنامه رو دوباره نوشتم.و ایندفعه با وقفه کار کردم.همه کاراکتر های ورودی نمایش داده میشه،فقط مساله اینجاست که در نهایت که میام دو بار putstring می کنم،اگر ورودی سریال abc باشه،بهم aabbcc نمایش داده میشه،که یعنی بازم کاراکتری داره دریافت میکنه و string تشکیل نداده.چه طور میشه استرینگ دریافت کرد :angry:
                          کد زیر رو نوشتم:

                          کد:
                          void getstring_usart0_irq_handeler (void)
                          { 
                          
                            unsigned char str[16] = " ";//an array of recieved bytes
                            unsigned char counter = 0; 
                            while ((AT91C_BASE_US0->US_CSR&0x1)!=0x1);
                            while(str[counter]!='\0')
                            {
                            unsigned char data = AT91C_BASE_US0->US_RHR&0xff;
                            str[counter] = data;
                            counter++;
                            }
                            putstring_usart0(str);
                            putstring_usart0(str);
                          }
                          اینم putstring

                          کد:
                          void putstring_usart0(unsigned char d[])
                          {
                           unsigned char counter = 0;
                           while(d[counter]!='\0')
                           putchar_usart0(d[counter++]);
                          }

                          دیدگاه


                            #43
                            پاسخ : USART

                            نوشته اصلی توسط gizmo89
                            من برنامه رو دوباره نوشتم.و ایندفعه با وقفه کار کردم.همه کاراکتر های ورودی نمایش داده میشه،فقط مساله اینجاست که در نهایت که میام دو بار putstring می کنم،اگر ورودی سریال abc باشه،بهم aabbcc نمایش داده میشه،که یعنی بازم کاراکتری داره دریافت میکنه و string تشکیل نداده.چه طور میشه استرینگ دریافت کرد :angry:
                            کد زیر رو نوشتم:

                            کد:
                            void getstring_usart0_irq_handeler (void)
                            { 
                            
                              unsigned char str[16] = " ";//an array of recieved bytes
                              unsigned char counter = 0; 
                              while ((AT91C_BASE_US0->US_CSR&0x1)!=0x1);
                              while(str[counter]!='\0')
                              {
                              unsigned char data = AT91C_BASE_US0->US_RHR&0xff;
                              str[counter] = data;
                              counter++;
                              }
                              putstring_usart0(str);
                              putstring_usart0(str);
                            }
                            اینم putstring

                            کد:
                            void putstring_usart0(unsigned char d[])
                            {
                             unsigned char counter = 0;
                             while(d[counter]!='\0')
                             putchar_usart0(d[counter++]);
                            }
                            سلام
                            به این دوتا تابع توجه کن
                            اولی برای دریافت کاراکتر هست
                            دومی با استفاده از اولی رشته دریافت میکنه
                            کد:
                            //-------------------------------------------------------------------------------------
                            // recieve Character
                            //-------------------------------------------------------------------------------------
                            int getkey (void) {          
                             if (mode==0) {
                             while (!((*AT91C_US0_CSR) & AT91C_US_RXRDY));  // Wait for Empty Rx Buffer
                             return (*AT91C_US0_RHR );
                              } 
                            else{ 
                             while (!((*AT91C_US1_CSR) & AT91C_US_RXRDY));  // Wait for Empty Rx Buffer
                             return (*AT91C_US1_RHR );
                              }           // recieve Character
                            }
                            
                            
                            //-------------------------------------------------------------------------------------
                            // Recieve String (end with CR or LF)
                            //-------------------------------------------------------------------------------------
                            void getstr(char *str)
                            {
                            	char ch = NULL;
                            	ch = getkey();
                            	while((ch == 10) || (ch == 13) || (ch == NULL))
                            		ch = getkey();
                            	
                            	while((ch != 10) && (ch != 13))
                            	{
                            		*str++ = ch;
                            		ch = getkey();
                            	}
                            	*str = NULL;
                            }
                            اولی توی هدر Usart.h بود و دومی رو هم خودم نوشتم و با ARM و AVR جواب گرفتم ازش
                            زندگی یعنی امید و حرکت
                            کارهایتان را آغاز کنید، توانایی انجام دادنش را بدست خواهید آورد
                            سوالاتی که در انجمن قابل طرح شدن هستند در پیام خصوصی جواب داده نمی شود.
                            برای تشکر از دکمه تشکر کنار هر پست استفاده کنید، پست هایی که فقط حاوی تشکر هستند پاک می شوند.
                            به دلیل کار بر روی پایاننامه و دفاع، مدتی نیستم!

                            دیدگاه


                              #44
                              پاسخ : USART

                              اگه اشتباه نکنم این تابعی که شما نوشتین،یه آرایه کاراکتری رو دریافت می کنه و با کاراکترهای دریافتی پرش می کنه.درسته؟
                              بصورت اینتراپتی اگر بخوایم عمل کنیم،میشه یه مقدار برگشتی داشت؟
                              یا مثلا باید یه آرایه گلوبال داشته باشیم که هر وقت وقفه گرفتن رشته میاد،به روش شما پر بشه!؟

                              دیدگاه


                                #45
                                پاسخ : USART

                                نوشته اصلی توسط gizmo89
                                اگه اشتباه نکنم این تابعی که شما نوشتین،یه آرایه کاراکتری رو دریافت می کنه و با کاراکترهای دریافتی پرش می کنه.درسته؟
                                بصورت اینتراپتی اگر بخوایم عمل کنیم،میشه یه مقدار برگشتی داشت؟
                                یا مثلا باید یه آرایه گلوبال داشته باشیم که هر وقت وقفه گرفتن رشته میاد،به روش شما پر بشه!؟
                                بله درسته
                                این دستور کاملا مثله scanf هست منتهی space و tab رو به عنوان انتهای رشته نمیشناسه در واقع من این تابع رو برای sim900 نوشتم چون خیلی جاها توی پاسخهای ارسالیش space داره و scanf پاسخ رو نصفه در یافت میکنه و باید دوباره یا بیشتر ازش استفاده کنیم
                                من یه برنامه برای قسمت وقفه پورت USART نوشته بودم میگردم پیداش میکنم براتون میزارم :job:
                                زندگی یعنی امید و حرکت
                                کارهایتان را آغاز کنید، توانایی انجام دادنش را بدست خواهید آورد
                                سوالاتی که در انجمن قابل طرح شدن هستند در پیام خصوصی جواب داده نمی شود.
                                برای تشکر از دکمه تشکر کنار هر پست استفاده کنید، پست هایی که فقط حاوی تشکر هستند پاک می شوند.
                                به دلیل کار بر روی پایاننامه و دفاع، مدتی نیستم!

                                دیدگاه

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