اطلاعیه

Collapse
No announcement yet.

نحوه ارسال بیت checksum ؟

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

    نحوه ارسال بیت checksum ؟

    سلام
    کسی میدونه چطور بیت checksum رو تو یه فرمتی از اطلاعاتی که داریم میفرستیم باید ارسال کرد و اونطرف چطوری این بیتو چک کرد که ایا فرمت دریافتی دارای خطا بوده یا نه؟
    ذکات علم یاد دادنه ....

    #2
    پاسخ : نحوه ارسال بیت checksum ؟

    - در چه سطحی از دقت می خوای
    - حجم اطلاعات ارسالیت کمه یا زیاده

    - یه توضیحی در مورد دستگاه های send و recive و فاصلشون و پروتکل ارتباطیشون بده
    برای اینکه بهترین کار ممکن رو برات توضیح بدم میگم.

    دیدگاه


      #3
      پاسخ : نحوه ارسال بیت checksum ؟

      معمولا چک سام یک بایت هست (اگه یک بیت باشه میگن بیت توازن یا همون parity)
      روش کا ر هم اینطوریه که معمولا یه بایت بعنوان چک سام به آخر داده ها اضافه میکنن و همراه پک داده ها ارسال میشه.
      اما بایت چک سام رو به دو طریق (معمولا و نه همیشه) درست میکنن.
      1- ماحصل XOR بایتهای داده بصورت دوبدو از ابتدای داده ها تا بایت قبل از چک سام
      2- جمع تمام بایتهای داده تا قبل از بایت چک سام بدون در نظر گرفتن بیتهای نقلی(یعنی همون یه بایت)

      دیدگاه


        #4
        پاسخ : نحوه ارسال بیت checksum ؟

        - در چه سطحی از دقت می خوای
        - حجم اطلاعات ارسالیت کمه یا زیاده

        - یه توضیحی در مورد دستگاه های send و recive و فاصلشون و پروتکل ارتباطیشون بده
        ببینید یه میکرو داریم که یه سری اطلاعاتو (ارتباط سریال usart فاصله حدود 15 الی 20 متر )حدود 20الی 30 بایتو قراره بفرسته به یه برنامه PC و اگه درست بود در پاسخ نرم افزار باید یه سری دیگه اطلاعات دیگه و همچنین تصدیق دیتای دریافتی رو برای میکرو بفرسته
        حالا باید چیکار کنم بایتایم که میفرستم یه جور نیستن و دائما دارن تغیر میکنن

        اما بایت چک سام رو به دو طریق (معمولا و نه همیشه) درست میکنن.
        1- ماحصل XOR بایتهای داده بصورت دوبدو از ابتدای داده ها تا بایت قبل از چک سام
        میشه یه مثال کوچلو بزنید درست متوجه نشدم

        2- جمع تمام بایتهای داده تا قبل از بایت چک سام بدون در نظر گرفتن بیتهای نقلی(یعنی همون یه بایت)
        ایا موقعی که بایتا تو هر فریم ارسال تغیر کنه بازم صادقه
        ذکات علم یاد دادنه ....

        دیدگاه


          #5
          پاسخ : نحوه ارسال بیت checksum ؟

          مثلا شما از روش جمع داری استفاده میکنی و داده هات هم 3 بایت هست. معمولا یک بایت در ابتدای پک بعنوان header اضافه میکنن که یه بایت خاص هست مثلا 0x7Eیا 0x55 یا 0xaa که هر سه تای این بایتهای یه حالت خاصی هستند اگه تبدیلشون کنی به باینری.
          3 بایت داده و یه بایت header بغلاوه یک بایت چک سام میشه 5 بایت .
          حالا فرض کن داده هات اینا هستند 0x02, 0x05, 0x03 که مجموعشون میشه 0x0a حال برای ارسال اینطوری میفرستی 0x7E 0x02 0x05 0x03 0x0a
          اگه داد ه هات تغییر کنن باید چک سام هم تغییر کنه لذا داخل برنامت باید یه روتین برای محاسبه چک سام داشته باشی.
          در حالتی که از روش XOR استفاده میکنی کافیه داده هات رو دو بدو با هم XOR کنی و یا هر روش دیگه ای که دوست داری. اینطوری در مقصد میفهمی که داد های دریافتی ایراد دارند و دوباره باید ارسال بشند. اگه بخوای که در مقصد بتونی رفع خطا هم داشته باشی باید از روشهای کدینگ که کار و حجم داده رو زیاد تر میکنن استفاده کنی

          دیدگاه


            #6
            پاسخ : نحوه ارسال بیت checksum ؟

            با سلام

            ببینید معمولا از روش دوم برای ارسال چک سام استفاده میشه.
            برای اینکه با تغییر تعداد بایت ها مشکلی تو محاسبه Check Sum و مقایسه اون تو مقصد پیش نیاد معمولا یک بایت ثابت و مشخص به عنوان Header و یک بایت ثابت و مشخص دیگر به عنوان Tailer در نظر میگیرند که این بایت ها در فریم دیتا حضور ندارند.

            به عنوان مثال در ارتباط بین ماژولهای ساخت خودمون یک استریم بایت به عنوان دستور یا دیتا ارسال میآ‌کنیم که با بایت 05به عنوان Header آغاز میآ‌شوند و با بایت 04به عنوان Tailer پایان میآ‌یابند. بایت Check Sum بعد از 04 میآ‌آید و در محاسبه Header و Tailer نیز محاسبه میآ‌شود.
            برای اینکه بایت های دیتا هرگز با Header و Tailer اشتباه نشوند و قابل تمیز باشند یک روش استفاده از کد اسکی به جای خود عدد و حرف است.













            حالا فرض کنید به روش Defult برای Check Sum اون رو محاسبه و ارسال میآ‌کنیم.
            تو گیرنده اینو تشخیص داده و از Header تا Tailer برای محاسبه مجدد Check Sum و مقایسه اون با بایت دریافت شده استفاده میآ‌کنیم

            دیدگاه


              #7
              پاسخ : نحوه ارسال بیت checksum ؟

              خیلی ممنون از توضیحاتتون شرمنده کردین :redface:

              تو روش xor بعد از اینکه دیتا ها رو با هم xor کردیم جوابشو میزاریم تو checksum و تو گیرنده هم دیتا هارو با هم xor میکنیم و جوابشو با checksum مقایسه میکنیم تا اینجا درسته؟
              حالا به فرض اگه خود checksum هم خطا داشته باشه باید چیکار کرد ؟ یعنی کل دیتا رو نباید قبول کرد و مثل این میمونه که یه بایتی از اطلاعات دارای خطا هستش درسته؟
              ذکات علم یاد دادنه ....

              دیدگاه


                #8
                پاسخ : نحوه ارسال بیت checksum ؟

                نوشته اصلی توسط majid.4206
                خیلی ممنون از توضیحاتتون شرمنده کردین :redface:

                تو روش xor بعد از اینکه دیتا ها رو با هم xor کردیم جوابشو میزاریم تو checksum و تو گیرنده هم دیتا هارو با هم xor میکنیم و جوابشو با checksum مقایسه میکنیم تا اینجا درسته؟
                حالا به فرض اگه خود checksum هم خطا داشته باشه باید چیکار کرد ؟ یعنی کل دیتا رو نباید قبول کرد و مثل این میمونه که یه بایتی از اطلاعات دارای خطا هستش درسته؟
                من توصیه می کنم از روش Defult ای که توضیح دادم , یعنی جمع معمولی استفاده کنی

                به مثال دقت کن

                در مورد سوال دومت باید بگم بله
                اگه Check Sum هم مشکل دار بشه کل فریم قابل قبول نیست و باید مجدد ارسال بشه

                دیدگاه


                  #9
                  پاسخ : نحوه ارسال بیت checksum ؟

                  من توصیه می کنم از روش Defult ای که توضیح دادم , یعنی جمع معمولی استفاده کنی
                  ببخشید میشه بفرمائید چرا ؟ و ایا مزیتی نصبت به XOR کردن داره؟
                  ذکات علم یاد دادنه ....

                  دیدگاه


                    #10
                    پاسخ : نحوه ارسال بیت checksum ؟

                    دوست من در حالت کلی مهم اینه که شما تشخیص بدی که خطا اتفاق افتاده یانه.یعنی به هر روشی می تونی اینکار رو بکنی. هر کسی هر جور دوست داره می تونه اینکارو بکنه.مهم اینه که فرستنده و گیرنده زبون هموم بفهمن!! :rolleyes:
                    اماااااااااااااااااااااااااااااا : مسئله اصلی اینه که یه عده قبل من و شما اومدن اینو استاندارد کردن! یعنی تمامی این مسائل رو بررسی کردن. اگه یه مراجعه به روش های انتقال دیتا به روش سریال مثل modbus,canbus یا .... بندازی می بینی که تقریبا بهتر از اون استانداردها نمیشه کار کرد. در این روش ها معمولا 16 بیت به نام CRC در آخر رشته قرار می دهن که روش به دست آوردن و معکوس بدست آوردنش خیلی جالبه! در روش های کدینگ شما نیاز به یه اپراتور داری که در اکثر روش ها اپراتور XOR رو انتخاب می کنن. یکی از دلیلاش پیاده سازی راحت و سخت افزار کمتره که اینجا مسئله ای نیست. با استفاده از CRC چون خود دو بایت CRC هم در نهایت جزء دیتای ورودی در گیرنده چک میشه شما حتی می تونی اطلاعاتت رو رمز گذاری هم بکنی . در مجموع معمولا همه از XOR استفاده می کنن و طول اون رو 2 بایت می گیرن.
                    اگه دوستان مایلن در مورد CRC-16 CRC-32 MD5 و .... که خیلی واسه اهلش کاربردیه گفتگو کنیم

                    دیدگاه


                      #11
                      پاسخ : نحوه ارسال بیت checksum ؟

                      نوشته اصلی توسط majid.4206
                      ببخشید میشه بفرمائید چرا ؟ و ایا مزیتی نصبت به XOR کردن داره؟
                      ببینید دوست عزیز

                      حرف دوستمون آقای Saeid_ica در مورد رواج روش XOR در مورد محاسبه CRC درسته

                      اما یه علت داره و اون هم اینه در اکثر تجهیزات مثل روتر ها که محاسبه CRC خیلی ضروریه و حجم زیادی از عملیات های کار رو در بر میآ‌گیرد به صورت سخت افزاری(با گیت های منطقی یا با FPGA) پیاده سازی میآ‌شود و در پیاده سازی سخت افزاری ساختن XOR راحت تر است و تعداد المانهای کمتری نیاز دارد.

                      اما حال شما که محاسبات را توسط ALU انجام میآ‌دهید از این رو مشکلی ندارید.
                      برای اینکه روش Defult مفهوم تر است و میشود به صورت دستی صحت عملکرد آن را چک کرد این روش توصیه میشود.

                      دیدگاه


                        #12
                        پاسخ : نحوه ارسال بیت checksum ؟

                        نوشته اصلی توسط saeid_ica
                        دوست من در حالت کلی مهم اینه که شما تشخیص بدی که خطا اتفاق افتاده یانه.یعنی به هر روشی می تونی اینکار رو بکنی. هر کسی هر جور دوست داره می تونه اینکارو بکنه.مهم اینه که فرستنده و گیرنده زبون هموم بفهمن!! :rolleyes:
                        اماااااااااااااااااااااااااااااا : مسئله اصلی اینه که یه عده قبل من و شما اومدن اینو استاندارد کردن! یعنی تمامی این مسائل رو بررسی کردن. اگه یه مراجعه به روش های انتقال دیتا به روش سریال مثل modbus,canbus یا .... بندازی می بینی که تقریبا بهتر از اون استانداردها نمیشه کار کرد. در این روش ها معمولا 16 بیت به نام CRC در آخر رشته قرار می دهن که روش به دست آوردن و معکوس بدست آوردنش خیلی جالبه! در روش های کدینگ شما نیاز به یه اپراتور داری که در اکثر روش ها اپراتور XOR رو انتخاب می کنن. یکی از دلیلاش پیاده سازی راحت و سخت افزار کمتره که اینجا مسئله ای نیست. با استفاده از CRC چون خود دو بایت CRC هم در نهایت جزء دیتای ورودی در گیرنده چک میشه شما حتی می تونی اطلاعاتت رو رمز گذاری هم بکنی . در مجموع معمولا همه از XOR استفاده می کنن و طول اون رو 2 بایت می گیرن.
                        اگه دوستان مایلن در مورد CRC-16 CRC-32 MD5 و .... که خیلی واسه اهلش کاربردیه گفتگو کنیم
                        سلام دوست عزیز
                        لطف میکنی راجع به این کد crc16 توضیح بدی؟من میخام با پروتکل مدباس rtu یه سری اطلاعات بگیرم و بفرستم و الان مشکلم اینه که چطور crc16 رو محاسبه کنم ؟
                        ممنون

                        دیدگاه

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