ورود به حساب ثبت نام جدید فراموشی کلمه عبور
برای ورود به حساب کاربری خود، نام کاربری و کلمه عبورتان را در زیر وارد کرده و روی «ورود به سایت» کلیک کنید.





اگر فرم ورود برای شما نمایش داده نمیشود، اینجا را کلیک کنید.









اگر فرم ثبت نام برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.









اگر فرم بازیابی کلمه عبور برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.






جهت تبلیغ در وب سایت ECA کلیک کنید.

کاربران برچسب زده شده

نمایش نتایج: از 1 به 5 از 5
  1. #1
    2009/10/21
    تهران
    2,507
    210

    تعبیر4 بایت داده دریافتی از پورت سریال بعنوان long int یا float

    سلام. 4 بایت داده یه متغیر float رو به ترتیب از کم ارزشترین بایتش با AVR فرستادم برای کامپیوتر از طریق usart. تو کامپیوتر هم این داده ها رو گرفتم و شیفتشون دادم تا 4 بایت کامل بشه و با مکافات (روش من درآوردی) تبدیل کردم به متغیر float . از اساتید میخواستم روش صحیح انجام این کار رو نشون بدن . روشهایی که خودم بدست آوردم :
    1- استفاده از اشاره گر *float وقتی 4 بایت رو چیدم پشت سر هم (که بنظر میرسه کامپایلر بطور پیش فرض متغیر موقتی حاصل رو بصورت longi int در نظر میگیره) و استفاده از اون مثل

    float fvar;
    float* fptr;
    fptr=(float*)&(ch[3]<<24 | ch[2]<<16 | ch[2]<< 8 | ch[0 ]);
    fvar=*f;

    2- استفاده از ساختار union که یه long int و یه دونه هم float توش باشه و کار کردن با اونا
  2. #2
    2010/05/09
    930
    37

    پاسخ : تعبير4 بايت داده دريافتي از پورت سريال بعنوان long int يا float

    با سلام
    با ساختار union از متغير float و آرايه 4 تايي از char مي توانيد 4 بايت مجزا داشته باشيد.
    هر بايت را به دو نصفه 4 بيتي تبديل نموده و ascii آنها را ( که از 0و1و2و...8و9,A,B,C,D,E,F تشکيل شده)
    در تعداد 8 کد اسکي ارسال کنيد و در کامپيوتر مجددا آنها را به طريق معکوس بازسازي کنيد.
    به اين ترتيب کدها در محدوده قابل نمايش کاراکتر ست اسکي قرار مي گيرند و کدهاي کنترلي را مي توانيد به ابتدا و انتهاي رشته ارسالي اضافه کنيد.
    مثل:CR, LF , STX , ETX...
    با سپاس
    گشتی در لاله زار
    http://www.eca.ir/forum2/index.php?topic=76138.0

    http://www.eca.ir/forum2/index.php?topic=76141
  3. #3
    2009/10/21
    تهران
    2,507
    210

    پاسخ : تعبیر4 بایت داده دریافتی از پورت سریال بعنوان long int یا float

    با سلام وسپاس از پاسختون
    من این 4 بایت رو که یه متغیر floart داخل حافظه میکرو AVR هست رو از کم ارزشترین بایت ارسال میکنم (فکر میکنم این جور ارسال کردن یه فرم استاندارد باشه) و توی کامپیوتر هم بعد از دریافت وشیفت اونها، حالا یه 4 بایتی دارم که کامپایلر بطور پیش فرض اونو long int تصور میکنه . اگه با type cast بخوام تبدیل به float کنم فقط قسمت اعشار به اون long int موقتی اضافه میشه که این خواسته من نیست. من باید به کامپایلر بفهمونم که بابا این چهر بایت یه عدد float هست. البته این کار رو هم انجام دادم . خواسته من اینه که میخوام بدونم آیا این روشی که استفاده کردم یه روش خوب (از نظر برنامه نویسی) هست یا نه؟
  4. #4
    2008/09/02
    اصفهان
    1,897
    37

    پاسخ : تعبیر4 بایت داده دریافتی از پورت سریال بعنوان long int یا float

    اگر صرفا منظور گرفتن جواب باشه اونهم روی یک پلاتفرم از پیش مشخص شده و ثابت روش union روش خوبی هست. فقط باید حواستون جمع باشه که از فرم packing مناسب برای اون union استفاده بشه. مثلا در کامپایلر visual studio باید از دستوری مثل این استفاده کنین:

    #pragma pack(push,1)
    union
    {
    float f;
    unsigned char b[sizeof(float)];
    }u;
    #pragma pack(pop)


    در همچین مواقعی راههایی مثل این یکی هم براحتی جواب میده:

    char c[4];

    ....
    f = *((float *)c);


    اما متاسفانه اینها راههای درستی نیستن چون در یک فرم عام باعث دردسر هایی ممکنه بشن. مخصوصا روش آخری. برای راه کلی بهتره از memcpy استفاده کنین:


    char c[4];
    float f;

    memcpy( &f, c, sizeof(f) );


    علت هم اینجاست که در بعضی پلاتفرم ها (خصوصا RISC ها) دسترسی چهار بایتی به آدرسی که قابل تقسیم به چهار نباشه باعث بروز خطای دسترسی میشه.
  5. #5
    2009/10/21
    تهران
    2,507
    210

    پاسخ : تعبیر4 بایت داده دریافتی از پورت سریال بعنوان long int یا float

    نقل قول نوشته اصلی توسط reza_agha
    اگر صرفا منظور گرفتن جواب باشه
    ممنون از جوابتون. من از برنامه جواب گرفتم . انگیزم از ایجاد تاپیک این بود که اگه روش استانداردی برای این کار هست رو پیدا کنم تا با اون روش کار کنم. خودم از روش تبدیل آدرس به آدرس float استفاده کردم.
نمایش نتایج: از 1 به 5 از 5

موضوعات مشابه

  1. پاسخ: 1
    آخرين نوشته: 2016/05/26, 15:38
  2. دریافت 3 بایت از پورت سریال
    توسط alimn2012 در انجمن میکروکنترلرهای AVR
    پاسخ: 6
    آخرين نوشته: 2016/03/28, 13:27
  3. ارسال یک بایت در پورت سریال
    توسط atrobot در انجمن C , C++ , C#
    پاسخ: 1
    آخرين نوشته: 2015/05/15, 00:14
  4. float & long int
    توسط ATI RADEON در انجمن میکروکنترلرهای AVR
    پاسخ: 6
    آخرين نوشته: 2011/07/29, 19:12
  5. اطلاعات دریافتی از پورت سریال
    توسط حمیدرضا رضایی در انجمن Labview
    پاسخ: 11
    آخرين نوشته: 2011/05/23, 17:52

کلمات کلیدی این موضوع

علاقه مندي ها (Bookmarks)

علاقه مندي ها (Bookmarks)

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •