اطلاعیه

Collapse
No announcement yet.

ارسال ترتیبی اطلاعات با uart به visual studio

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

    ارسال ترتیبی اطلاعات با uart به visual studio

    سلام دوستان !
    سوالی که داشتم این بود که من 1 جایروسکوپ و شتابسنج 3 محوره دارم که بعد از سنسور فیوژن خروجی فیلترم که تو سه محور x,y,z مختصات زاویه ای دقیق جسمو بهم میده. من میخوام به ترتیب مقادیر float ذخیره شده در x , y , z برای کامپیوتر ارسال بشه و اونجا هم به ترتیب دریافت بشه (مثلا اول x بعد y بعد z ) و باز از اول پدیت بشه مقادیر توی کامپیوتر ! بخش اول ارسال مقادیره که دقیقا با این روش ارسال تریتیبی مشکل دارم که اصلا نمیدونم باید چیکار کنم و بخش دوم باید مقادیر رو با visual studio c++ دریافت کنم و مقادیر رو به مختصات جسمی که با کتابخونه opengl ایجاد کردم بدم ! آیا این روش ارسال ترتیبی روشه درستیه ؟ روش بهتریم هست ؟ اگه ممکنه راهنماییم کنید . مرسی

    #2
    پاسخ : ارسال ترتیبی اطلاعات با uart به visual studio

    کسی نیست جوابه مارو بده ؟؟؟ :(

    دیدگاه


      #3
      پاسخ : ارسال ترتیبی اطلاعات با uart به visual studio

      1- اعداد در کامپوتر با فرمت little endianآ‌ ذخیره میشن یعنی چی ؟ بایت با ارزش کمتر در حافظه با آدرس کوچکتر ذخیره میشه
      2- اعداد floatآ‌ دارای 4 بایت هستند که بایت با ارزش بالاترش که توش علامت هم ذخیره میشه طبق گفته بالا در بالاترین آدرس ذخیره شده
      3- اشاره گر به یه متغیر در واقع اشاره گر به خونه حافظه با آدرس کمتر هست (همون بایت کم ارزشه)
      شما چیکار میکنی
      یه اشاره گر به float* fptr و یکی هم یهunsigned char* uchptr تعریف میکنی
      آدرس x رو میریزی داخل اشاره گر fptr
      بعد نوع اشاره گر رو عوض میکنی اینجوری uchptr=(unsigned char*)fptr
      حالا محتویات uchptr رو ارسال میکنی putchar(*uchptr)
      بعد سه بار uchptr++ و بعد دوباره ارسال میکنی
      این تازه شد ارسال x با همین روش y,zآ‌ رو هم ارسال میکنی
      در کد زیر یه intآ‌ دوبایتی رو با همین روش ارسال کردیم

      chptr=(char*)&tempint;
      putchar(*chptr);
      chptr++;
      putchar(*chptr);

      در کامژیوتر بایتهای ارسالی رو یکی یکی دریافت میکنی و هر چهار تا رو به میچسبونی با شیفت و orآ‌ یا با ضرب کردن
      بایت چهرم ضربدر 2^24 بایت سوم در 2^16 بایت دوم در 2^8 و بایت چهرم هم خودش
      نتایج رو با هم جمع میکنی (فقط حواست باشه نتیجه باید در یک unsigned int چهار باتی ذخیره بشه)
      حالا به کامیوتر میگی که این چهار بایت unsigned intآ‌ نیست و یک float هست.(بوسیه همون اشاره گرها)
      راه دیگش هم همون استفاده از اشاره گرهاست و قرار دادن هر بایت در جای مخصوصش در متغیر float
      * حالا یه سوال هم داشتم شما برای اینکارت (یعنی بدست آودرن زاویه ) از چه سنسوری استفاده کردی و کدی که استفاده کردی آیا یه کد آمادست یا نوشتی؟

      دیدگاه


        #4
        پاسخ : ارسال ترتیبی اطلاعات با uart به visual studio

        سلام!
        مرسی از پاسختون و توضیحات مفیدتون
        من کد زیر رو با توجه به توضیحات شما نوشتم :
        کد:
        float *fptr; //float variable address 
        unsigned char *uchptr;//char variable address
        
        void IMU_transmit(){
        	float x;
        	fptr =&x;
        	uchptr=(unsigned char*) fptr;
        	for (int i=0;i<3;i++)
        	{
        		putchar(*uchptr);
        		uchptr++;
        	}
        }
        البته هنوز با کمپوننت سریال در c# آشنایی ندارم برای شیفت و or کردن و دریافت به ترتیب!
        سوالی که دارم آیا برای کار من این روش معقوله ؟ من با توجه به گفته های شما باید هر لحظه 12 بایتو (3 float که هر کدوم 4 بایت داره) ارسال کنم ! چطوری به سرعت بالا برسم که مد نظرمه و خطا هم نداشته باشم ؟ چطوری مطمئن بشم بیتهای دقیقا پشت سر هم ارسال میشن و پرشی اتفاق نمیفته ؟ و توی کامپیوتر هم راحت تفکیکشون کنم بدون خطا ؟؟ آیا روش بهتری هست ؟ نمیشه متغیر هر محور رو به صورت string ارسال کنم و برای هر string علامتی بزارم که توی کامپیوتر با شناسایی اون علامت با if به طور اتوماتیک 4 بایت بعدیو توی 1 متغیر ذخیره کنم و برای y,z هم 1 علامت مخصوص ؟ آیا این روش عملیه ؟ اگه امکان داره کمکم کنید چون واقعا کارم از حساسیت بسیار بالایی برخورداره نمیخوام هیچ بایتی جا به جا بشه یا از دستش بدم :(
        در مورد سواله دومتون بله من همه کدهارو خودم نوشتم از هیچ سورسی استفاده نکردم تمام الگوریتمها + opengl هم که آموزشهاش توی نت زیاده من از اونا استفاده کردم و تونستم شیئمو ایجاد کنم !
        با تشکر

        دیدگاه


          #5
          پاسخ : ارسال ترتیبی اطلاعات با uart به visual studio

          سلام.
          این کار بسیاز ساده است.
          کد برای ارسال در میکروکنترلر:
          این کد رو در قسمت while برنامه بنویسید:
          sprintf(buff,"z=%f,%f,%f",x,y,z);
          puts(buff);
          buff هم همان کاراکتر با طول بالا است.مثل
          char buff[20];
          برای دریافت هم در کامپیوتر می توانید از زبان C# استفاده کنید.و بعد از راه اندازی پورت سریال از دستور split برای تشخیص و جدا سازی استفاده کنید.به صورتی که برای مثال با دستور split اول کاراکتر z را تشخیص می دهیم و در ادامه با دریافت کاراکتر های ',' دیتاهای x , y, z را تشخیص دهید و به صورت جدا دریافت کنید.

          دیدگاه


            #6
            پاسخ : ارسال ترتیبی اطلاعات با uart به visual studio

            نوشته اصلی توسط mansoor zahedipour
            سلام.
            این کار بسیاز ساده است.
            کد برای ارسال در میکروکنترلر:
            این کد رو در قسمت while برنامه بنویسید:
            sprintf(buff,"z=%f,%f,%f",x,y,z);
            puts(buff);
            buff هم همان کاراکتر با طول بالا است.مثل
            char buff[20];
            برای دریافت هم در کامپیوتر می توانید از زبان C# استفاده کنید.و بعد از راه اندازی پورت سریال از دستور split برای تشخیص و جدا سازی استفاده کنید.به صورتی که برای مثال با دستور split اول کاراکتر z را تشخیص می دهیم و در ادامه با دریافت کاراکتر های ',' دیتاهای x , y, z را تشخیص دهید و به صورت جدا دریافت کنید.
            سلام مرسی از پاسختون!
            ممنون میشم در مورد sprintf یکم بیشتر توضیح بدین! من با atmel studio کار میکنم ! اینکلود کردنه stdio.h کافیه فکنم ولی ساختارشو نمیدونم دقیقا! بافر از نوع آرایاس ؟ چیو باید توش بریزم ؟ و چطوری؟؟؟ من متغیرم float عه و 4 بایت درسته ؟ پس طول رشتم میشه 4 بایت درسته ؟؟
            بعدشم در مورد c# دارم میدونم که رباط سریال خیلی سادست توی c# یکمم باش کار کردم و 1 ترمینال ساختم ولی متاسفانه بدلیل کمبود منابع opengl برای c# ترجیح دادم کدهای opengl رو توی c++ بنویسم و مجبورم رابط سریالم طبیعتا توی c++ بنویسم :( ! شما در موردش اطلاعات دارین ؟

            دیدگاه


              #7
              پاسخ : ارسال ترتیبی اطلاعات با uart به visual studio

              من مجبورم تاپیکو هی بیارم بالا خیلی زود گم و گور میشه :( ! دوستان لطفا کمک کنید :sad:

              دیدگاه


                #8
                پاسخ : ارسال ترتیبی اطلاعات با uart به visual studio

                این برای sprintf
                http://www.tutorialspoint.com/c_standard_library/c_function_sprintf.htm

                توی C++ در مورد ارتباط سریال اطلاع دقیق ندارم اما احتمالا مثل C# هست یعنی قاعدتا باید داخل system.io دنبال کلاسش یگردید.

                بعد از این هم که دیتا را دریافت کردید با sscanf می تونید متغیر ها را از داخلش خارج کنید.

                http://www.cplusplus.com/reference/cstdio/sscanf/

                دیدگاه


                  #9
                  پاسخ : ارسال ترتیبی اطلاعات با uart به visual studio

                  نوشته اصلی توسط sadeghmojtabaei
                  این برای sprintf
                  http://www.tutorialspoint.com/c_standard_library/c_function_sprintf.htm

                  توی C++ در مورد ارتباط سریال اطلاع دقیق ندارم اما احتمالا مثل C# هست یعنی قاعدتا باید داخل system.io دنبال کلاسش یگردید.

                  بعد از این هم که دیتا را دریافت کردید با sscanf می تونید متغیر ها را از داخلش خارج کنید.

                  http://www.cplusplus.com/reference/cstdio/sscanf/
                  مرسی ولی من با اون آرایه بافر مشکل دارم که مقدارش چطوری تایین میشه و اصلا واسه چی هست ؟؟؟
                  چطوری جدا جدا بفرستم و اونجام تشخیصش بدم ؟ :(

                  دیدگاه


                    #10
                    پاسخ : ارسال ترتیبی اطلاعات با uart به visual studio

                    بچه ها متاسفانه دستور sprintf هیچ کاراکتریو ارسال نمیکنه :( کدمو میزارم :
                    کد:
                    #include <avr/io.h>
                    #include <stdio.h>
                    #define F_CPU 7372800// Clock Speed
                    #define BAUD 2400
                    #define MYUBRR (F_CPU/16/BAUD)-1
                    
                    
                    void USART_Init( unsigned int ubrr)
                    {
                    
                    	/* Set baud rate */
                    	UBRRH = (unsigned char)(ubrr>>8);
                    	UBRRL = (unsigned char)ubrr;
                    	/* Enable receiver and transmitter */
                    	UCSRB = (1<<RXEN)|(1<<TXEN);
                    	/* Set frame format: 8data, 2stop bit */
                    	UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
                    }
                    
                    void USART_Transmit( unsigned char data )
                    {
                    	/* Wait for empty transmit buffer */
                    	while ( !( UCSRA & (1<<UDRE)) );
                    	/* Put data into buffer, sends the data */
                    	UDR = data;
                    }
                    
                    int main( void )
                    {
                    	DDRB |= 1<<PINB1;
                    	PORTB |=1<<PINB1;
                    	double arash;
                    	char buff[100];
                    	USART_Init ( MYUBRR );
                    	while(1){
                    	sprintf(buff,"z=%6.3f",arash);
                    	puts(buff);
                    	}
                    }
                    در صورت استفاده از usar_transmit میتونم کاراکتر بفرستم ولی با نوشتن دستور sprintf انگار همچی متوقف میشه و هیچی ارسال نمیشه :(
                    کسی میدونه مشکلش چیه ؟

                    دیدگاه


                      #11
                      پاسخ : ارسال ترتیبی اطلاعات با uart به visual studio

                      نوشته اصلی توسط arashdj72
                      بچه ها متاسفانه دستور sprintf هیچ کاراکتریو ارسال نمیکنه :( کدمو میزارم :
                      کد:
                      #include <avr/io.h>
                      #include <stdio.h>
                      #define F_CPU 7372800// Clock Speed
                      #define BAUD 2400
                      #define MYUBRR (F_CPU/16/BAUD)-1
                      
                      
                      void USART_Init( unsigned int ubrr)
                      {
                      
                      	/* Set baud rate */
                      	UBRRH = (unsigned char)(ubrr>>8);
                      	UBRRL = (unsigned char)ubrr;
                      	/* Enable receiver and transmitter */
                      	UCSRB = (1<<RXEN)|(1<<TXEN);
                      	/* Set frame format: 8data, 2stop bit */
                      	UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
                      }
                      
                      void USART_Transmit( unsigned char data )
                      {
                      	/* Wait for empty transmit buffer */
                      	while ( !( UCSRA & (1<<UDRE)) );
                      	/* Put data into buffer, sends the data */
                      	UDR = data;
                      }
                      
                      int main( void )
                      {
                      	DDRB |= 1<<PINB1;
                      	PORTB |=1<<PINB1;
                      	double arash;
                      	char buff[100];
                      	USART_Init ( MYUBRR );
                      	while(1){
                      	sprintf(buff,"z=%6.3f",arash);
                      	puts(buff);
                      	}
                      }
                      در صورت استفاده از usar_transmit میتونم کاراکتر بفرستم ولی با نوشتن دستور sprintf انگار همچی متوقف میشه و هیچی ارسال نمیشه :(
                      کسی میدونه مشکلش چیه ؟
                      سلام.
                      دوست عزیز شما متوجه منظور بنده در مورد دستور sprintf نشدید.این دستور فقط جهت مرتب کردن یک رشته به کار میره نه ارسال.همچنین در برنامه شما (arash) یک متغییر خال می باشد که مقداری ندارد.دستور sprintf به این صورت عمل می کنه (البته در برنامه شما) دیتای داخل متغییر arash رو می خونه و بعد از آن این دیتا رو به یک عدد اعشاری تبدیل میکنه و سپس یک رشته به این صورت ایجاد میکنه(بافرض اینکه arash برابر 5.2 است) رشته حاصل (z=5.2).سپس این رشته را داخل buff می ریزه و بعد اید رشته رو که درbuff ریخته شده است را به کمک دستور puts انتقال می دهد.بنده برای شما یک پیغام خصوصی گذاشتم جهت راهنمایی.

                      دیدگاه


                        #12
                        پاسخ : ارسال ترتیبی اطلاعات با uart به visual studio

                        سلام !
                        خوب من دستور puts رو هم توی حلقه while دارم ولی متاسفانه هیچی ارسال نمیشه ! من از atmel studio استفاده میکنم! آیا فقط با include کردن stdio.h این دستورا به درستی کار میکنن ؟
                        1 مطلب پیدا کردم 1 نگاهی بهش بندازین ! مربوط به winavr و atmel studio بود :
                        http://offkilterengineering.com/using-stdio-hs-printf-function-on-an-atmel-avr-microcontroller/
                        و البته اینم توضیحات کتابخونه که در بخش example همین توابعو تعریف کرده :
                        http://www.nongnu.org/avr-libc/user-manual/group__avr__stdio.html
                        ممنون میشم راهنمایی کنید !

                        دیدگاه


                          #13
                          پاسخ : ارسال ترتیبی اطلاعات با uart به visual studio

                          نوشته اصلی توسط arashdj72
                          سلام !
                          خوب من دستور puts رو هم توی حلقه while دارم ولی متاسفانه هیچی ارسال نمیشه ! من از atmel studio استفاده میکنم! آیا فقط با include کردن stdio.h این دستورا به درستی کار میکنن ؟
                          1 مطلب پیدا کردم 1 نگاهی بهش بندازین ! مربوط به winavr و atmel studio بود :
                          http://offkilterengineering.com/using-stdio-hs-printf-function-on-an-atmel-avr-microcontroller/
                          و البته اینم توضیحات کتابخونه که در بخش example همین توابعو تعریف کرده :
                          http://www.nongnu.org/avr-libc/user-manual/group__avr__stdio.html
                          ممنون میشم راهنمایی کنید !
                          دوست عزیز شما به نکته ای که بنده گفتم توجهی ندارید.در برنامه شما اطلاعات موجود در متغییر (arash) توسط puts چاپ می شود.و شما به این نکته توجه ندارید که این متغییر مقدار دهی نشده و خالی می باشد.برای همین چیزی در خروجی نمی بینید.
                          برنامه باید به این صورت باشد:
                          مثلا مقدار adc صفر را می خوانیم و داخل متغییری به نام arash ریخته می شود وسپس ارسال می شود.
                          تعریف متغییر ها:
                          کد:
                          float arash;
                          char buff[20];
                          کد داخل حلقه while
                          کد:
                          arash=read_adc(0);
                          sprintf(buff,"%f",arash);
                          puts(buff);
                          لطفا در تحلیل برنامه دقت کنید.

                          دیدگاه

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