اطلاعیه

Collapse
No announcement yet.

راه اندازی TCP/IP با استفاده از آیسی شبکه KS8721 (بورد آموزشی ECA)

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

    راه اندازی TCP/IP با استفاده از آیسی شبکه KS8721 (بورد آموزشی ECA)

    با سلام و عرض خسته نباشید خدمت تمامی دوستان و اساتید عزیز،
    بنده برای انجام پروژه ای نیاز به راه اندازی یک شبکه TCP/IP دارم تا بتونم دستگاهم رو به صورت Client به شبکه متصل کنم و از طریق پروتکل TCP (یا اگه نشد UDP) اطلاعاتی رو با کامپیوتر (Server) مبادله کنم.
    خب اول از همه رفتم سراغ مثال EasyWeb که خب تا جایی تونستم راه اندازی کنم که رشته ای رو بفرستم و بگیرم به یک پورت خاص (مثلاً 1001) و تقریباً مواردی که نیاز داشتم رو شامل میشد منهای این موضوع که دستگاه میشد Server و حالت Multiple هم از دست میرفت! پس این به درد من نخورد :|
    گزینه بعدی استفاده از TCP-net کتابخونه RL (سیستم عامل کیل) خود کمپایلر Keil بود که خب، با توجه به اینکه بوردهای شرکت کیل، MCBxxxx همه از تراشه شبکه DP83848Cvv استفاده می کنن، نمیشد از بورد آموزشی فروشگاه که تراشه شبکه KS8721 روش هست استفاده کرد. کمی باهاش ور رفتم تا شاید بتونم با اعمال تغییراتی بجای توابع و ثابت های مربوط به dp83848، از ثباتها و مقادیر گفته شده در دیتاشیت ks8721 و مثالهای بورد آموزشی IAR استفاده کنم، ولی خب، متأسفانه کتابخونه TCPnet متن بسته است و نمیشد بهش دسترسی داشته باشم و تغییرات زیادی نشد بدم.
    مقصد بعدی کتابخونه uIP بود، خب، اینم مثال وب سرور رو براش راه اندازی کردم و همچنین مثل مثال easyweb تونستم روی پورت مقداری بریزم، ولی باز این کتابخونه هم مشکلات (البته از دید پروژه تعریف شده واسه من اسمش میشه مشکل) خاص خودش رو داشت، مثل اینکه بسیار پایه ای و ساده بود، از udp و tcp به خوبی نمیشد استفاده کرد + این هم حالت multiple رو نداشت.
    با کمی جستجو برای پیدا کردن پشته شبکه مناسب، به برادر بزرگتر uIP، یعنی LwIP رسیدم که به گفته توضیحات و قابلیت های ذکر شده براش، توانایی انجام پروژه من رو داشت!
    LwIP هم به مثابه TCPnet که شرط لازم برای استفاده ازش، استفاده از RLکیل بود، اکثر پروژه هایی که از LwIP استفاده کرده بودن، از RTOS استفاده می کردن! [البته اگه به نتیجه برسم بدون RTOS نمیشه، استفاده می کنیم خب ]
    دنبال یه مثال بودم که از LwIP و LPC1768 استفاده کرده باشه، یکی دوتا پیدا شد ولی با توجه به بورد MCB17xx، آیسی شبکه dp83848 استفاده شده بود! پس در نتیجه بازم من موندم و حوضم :|

    حالا میخوام با کمی تغییرات ببینم میتونم توابع لازم رو واسه ks8721 استفاده کنم یه خیر؟ ولی میخواستم بدونم کسی از دوستان اینجا از lwip استفاده کرده؟ (حالا با هر آیسی شبکه ای)
    یا اگر کسی اطلاعات بدردبخوری داره ممنون میشم کمک کنه

    با تشکر فراوان

    پ.ن: راستی این مطلبم به درد بخوره: http://lwip.wikia.com/wiki/LwIP_with_or_without_an_operating_system

    «پشتکار» «پشتکار» «پشتکار»

    #2
    پاسخ : راه اندازی TCP/IP با استفاده از آیسی شبکه KS8721 (بورد آموزشی ECA)

    امروز یکم دیگه روی کتابخونه TCP-net کار کردم و تونستم ارتباط UDP برقرار کنم با کامپیوتر (با استفاده از نرم افزار Hercules) و رشته ای رو از میکرو به کامپیوتر ارسال کنم، با خودم گفتم بیام تغییراتی که اعمال کردم رو اینجا بگم تا هم دوستان تازه کار مثل من خیلی سردرگم نباشن و هم اینکه اساتید ببینن جایی رو اشتباه نکرده باشم.
    از اونجایی که پیکربندی سخت افزار (همون آیسی شبکه خودمون ماکروها و توابع پروتایپ مربوط به شبکه در فایل درایور EMAC مربوط به LPC آمده (که خدارو شکر متنش قابله تغییره )، پس بریم ببینیم که چی به چیه؟
    موارد آمده در فایل emac.h شامل:
    تعریف یک سری ماکرو برای بلاک Ethernet خود میکرو، ثبات های واحد MAC، و تعریف ثبات های آیسی شبکه
    که در این فایل، مقادیر مربوط به ثبات های آیسی شبکه متناسب با آیسی شبکه باید تغییر کنه، یه سری رجیسترها در آیسی شبکه (رجیسترهای پایه) بر اساس استانداردهای IEEE باید باشن و توی آیسی های مختلف مشابه اند، اما یک سری ثبات دیگه (رجیسترهای گسترده) ممکنه توی بعضی آیسی ها باشه تو بعضی دیگه نه! [مثلاً آیسی dp83848 یک ثبات موسوم به PHY Status Register داره که اتفاقا توی پیکربندی (که جلوتر میرسیم init_ethernet) اومده و KS8721این ثبات رو نداره!]
    موارد آمده در فایل emac.c شامل:
    توابع نوشتن و خوندن از رجیستر های آیسی شبکه (read_PHY و write_PHY) تابع معرفی شبکه (init_ethernet)
    خب، داخل تابع init_ethernet در قسمتی (خط 116 یا همونورا ) اومده رجیستر ID آیسی شبکه رو میخونه و چک میکنه ببینه با آدرس ID آیسی شبکمون یکی هست یا نه؟
    اینجا ما باید از قبل در فایل emac.h، در قسمت #define DP83848C_ID بجای ID آیسی 83848 از ID آیسی ks8721 استفاده کنیم و ماکرو رو متناسب با اون تغییر بدیم و در قسمت هایی که استفاده شده تغییرات رو اعمال کنیم.
    در خط بعدی (داخل شرط صحبت ID آیسی) اومده به صورت auto negotiation شبکه رو پیکرندی کرده (سرعت و نوع ارتباط) و من بجای اون دستی تنظیم کردم روی سرعت 100Mb/s و Full-duplex بوسیله این دستور:
    [code=c]write_PHY(PHY_REG_BMCR,0x2100); // Full Duplex - 100Mb/s[/code]
    همچنین پایینتر در قسمتی به نام Check the link status.، از ثبات PHY Status Register استفاده شده که قبلاً گفتم ks8721 فاقد این رجیستره و بنده این بلاک رو پاک کردم.
    موارد استفاده شده دیگه مربوط به ثبات خاصی نیست که بخواد فرق کنه.
    من با همین تغییرات اندک تونستم شبکه UDP رو با TCP-net راه اندازی کنم و اطلاعات رو به کامپیوتر ارسال کنم؛
    اما...
    طبق توابع نوشته شده در مثال Client از مجموعه مثال های RL مربوط به MCB1700، وقتی داده ی UDP از سرور (کامپیوتر) به میکرو ارسال میشه باید تابع callback فراخونی بشه، اما من هرکار کردم اینطور نشد :| و متأسفانه کتابخونه RL باز نیست که بشه داخل توابع رو دید چی به چیه!
    کسی نظری نداره؟ یا ایده ای به ذهنش نمیرسه؟ یا شاید کسی باشه جواب گرفته باشه!


    با تشکر از دوستان


    «پشتکار» «پشتکار» «پشتکار»

    دیدگاه


      #3
      پاسخ : راه اندازی TCP/IP با استفاده از آیسی شبکه KS8721 (بورد آموزشی ECA)

      با سلام؛
      بالاخره مشکلاتم با ks8721 حل شدو تونستم با برنامه ای ک از تغییر easy web نوشته بودم روی بورد خودم جواب بگیرم.
      ولی واسه قطعات و مقادیرشون از شماتیک بورد آموزشی اینجا کمک گرفتم و باز هم مشکل گرم شدن آیسی شبکه بود که به نظرم به دلیل عدم تقارن توی مقادیر مقاومت و جریان کشی خطوط ارسال و دریافت باشه :-\
      کسی نتونسته طوری ببنده مدارو ک داغ نشه آیسی اینقد!؟
      با تشکر

      «پشتکار» «پشتکار» «پشتکار»

      دیدگاه


        #4
        پاسخ : راه اندازی TCP/IP با استفاده از آیسی شبکه KS8721 (بورد آموزشی ECA)

        سلام دوستم.میشه یه لطفی کنی و یه مثال بذاری.من خیلی رو این بحث کار کردم ولی نتیجه نگرفتم.واسه dp مازول زدم و نشد.خیلی وقتمو گرفت. :angry: :angry:

        دیدگاه


          #5
          پاسخ : راه اندازی TCP/IP با استفاده از آیسی شبکه KS8721 (بورد آموزشی ECA)

          نوشته اصلی توسط mohammadttl
          سلام دوستم.میشه یه لطفی کنی و یه مثال بذاری.من خیلی رو این بحث کار کردم ولی نتیجه نگرفتم.واسه dp مازول زدم و نشد.خیلی وقتمو گرفت. :angry: :angry:
          سلام،
          خب اول باید دید سخت افزارتون درسته یا خیر؟
          با فرض اینکه از DP83848Cvv اصل استفاده میکنی و جنس قلابی بهت نفروختن؛ پس اکثر مثالهایی که برای راه اندازی اترنت با کیل وجود داره (easyweb، RL-ARM TCP-Net) باید برات جواب بدن.
          شما اول یه شماتیک اگه از مدارت نشون بدی خوبه! جناب رستمی تو یکی از تاپیک ها در یکی دوتا از پست ها بعضی از مواردی که باید در هنگام طراحی مدار برای سخت افزار شبکتون رعایت کنید رو نوشتن و بنده هم پیشنهاد میکنم بخونید.
          دوم اینکه اگه برای شبکه تون LED گذاشتید، اونها کار میکنن و اتصال وصل نشده؟
          سوم اینکه برنامه WireShark رو که یه شنونده به شبکس نصب کنید و پورت رو نگاه کنید ببینید اتصال برقرار میشه؟ اصن سعی ای برای برقراری انجام میده؟

          موفق باشید

          «پشتکار» «پشتکار» «پشتکار»

          دیدگاه


            #6
            پاسخ : راه اندازی TCP/IP با استفاده از آیسی شبکه KS8721 (بورد آموزشی ECA)

            سلام
            شما می تونید از مثال خود LPC OPEN استفاده کنید.
            یکی از مثالاش با freertos و lwip هستش
            ولی یه مشکلی داره که وقتی اجرا می شه می کرو هنگ می کنه. دلیلشم اینه که پایه های میکرو رو اولش برای شبکه تنظیم نکردن.
            من امتحان کردم با ks8721 جواب گرفتم (با کتابخانه سوکتش
            موفق باشید

            دیدگاه


              #7
              پاسخ : راه اندازی TCP/IP با استفاده از آیسی شبکه KS8721 (بورد آموزشی ECA)

              نوشته اصلی توسط alis_a
              سلام
              شما می تونید از مثال خود LPC OPEN استفاده کنید.
              یکی از مثالاش با freertos و lwip هستش
              ولی یه مشکلی داره که وقتی اجرا می شه می کرو هنگ می کنه. دلیلشم اینه که پایه های میکرو رو اولش برای شبکه تنظیم نکردن.
              من امتحان کردم با ks8721 جواب گرفتم (با کتابخانه سوکتش
              موفق باشید
              ممنون دوست عزیز بابت راهنماییتون،
              البته در پست اول هم قید کردم که نمیخواستم از سیستم عامل استفاده کنم (حتی بلادرنگش) و البته یکی دو مثال از Lwip بدون سیستم عامل هم پیدا کردم با میکروهای مختلف؛ ولی فعلا با استفاده از مثال easyweb خودم یه توابعی نوشتم که کارمو راه بندازه و چون سرگرم بقیه قسمتای پروژه شدم وقت نمیکنم به lwip برسم.
              اما اگه شما تجربه ای دارین خوشحال میشیم مارو هم بی نصیب نذارید.

              «پشتکار» «پشتکار» «پشتکار»

              دیدگاه


                #8
                پاسخ : راه اندازی TCP/IP با استفاده از آیسی شبکه KS8721 (بورد آموزشی ECA)

                عرض سلام خدمت دوستان گرامی

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

                میشه بگید شماتیک اتصال ای سی ks8721 به پایه های lpc1768 رو از کجا میتونم گیر بیارم.

                من این ای سی رو گرفتم و بردش رو هم بچه ها ساختن. الان میخوام این رو به پایه های هدر برد lpc1768 وصل کنم. منتها بعضی پایه ها رو نمیدونم به کدون پورت باید وصل کنم.

                مثلا یکیش rxdv و یکی دیگه هم crs و phy/int هست

                ممنون میشم راهنماییم کنید

                دیدگاه


                  #9
                  پاسخ : راه اندازی TCP/IP با استفاده از آیسی شبکه KS8721 (بورد آموزشی ECA)

                  phy int کار مهمی نمی کنه وقتی یه تغییری ایجاد شه اینتراپت ایجاد می کنه. مثلا اگر کابل قطع شه یا وصل شه و... اگر خواستید می تونید به پایه های اینتراپت وصلش کنید ولی فک نکنم اصلا نیساز شه( من تاحالا استفاده نکردم :biggrin: )

                  در مورد RXDV اینو اشتباه نام گذای کردم به همون CRS میکرو وصل کنید.

                  دیدگاه


                    #10
                    پاسخ : راه اندازی TCP/IP با استفاده از آیسی شبکه KS8721 (بورد آموزشی ECA)

                    میشه یه بزرگواری کنید و نقشه اتصال پایه های میکرو به ای سی رو بذارید اینجا

                    الان ۲ ساعتی هست که دارم میگردم.
                    من بر اساس شماتیکی که بچه ها اینجا جواب گرفتن دادم برد رو ساختن

                    از ای سی 8721 هم استفاده میکنم.
                    منتها کابل لن رو که میزنم بین سیستم و برد اصلا اتفافی نمیفته و کامپیوتر میگه که اتصالی برقرار نیست

                    حقیقتش موندم باید چه کار بکنم

                    دیدگاه


                      #11
                      پاسخ : راه اندازی TCP/IP با استفاده از آیسی شبکه KS8721 (بورد آموزشی ECA)

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

                      من خوشبختانه موفق شدم با راهنمایی های ایشون خط رو راه اندازی کنم و الان مثل ایزی وب به حوبی داره کار میکنه.

                      اما مساله مهم من اینه که من میخوام پروتکل مودباس رو از طریق تی سی پی پیاده کنم.
                      داده های من اماده است و من فقط نیاز دارم که اونها رو از طریق پروتکل تی سی پی ارسال کنم.

                      بنابراین نیاز به وب سرور و ارسال صفحه اچ تی ام ال ندارم.

                      میخوام ببینم توابع این که ارسال و دریافت روی پروتکل تی سی پی رو انجام میدن چطورین. ایا خودم مستقیما میتونم این کار رو بکنم.

                      ممنون میشم در این مورد من رو راهنمایی کنید

                      دیدگاه


                        #12
                        پاسخ : راه اندازی TCP/IP با استفاده از آیسی شبکه KS8721 (بورد آموزشی ECA)

                        ببینید من واسه دستگاه هام حالت اکتیو گذاشتم. یعنی همه کلاینتن و به سرور اصلی متصل میشن (سرور برای کار من pc بود)
                        من با استفاده از همین مثال ایزی وب و تحلیل توابعش توابع خودم رو نوشتم و کار منو راه میندازه خدارو شکر
                        یه جای دیگه ازم خواستن دستگاه ها پسیو باشن توی شبکه و سرور هروقت خاص بهشون متصل بشه و دیتارو بگیره! و باز هم همون برنامه رو استفاده کردم.
                        موفق باشی

                        * هر وقت برسم پای سیستمم توابعی ک استفاده کردمو توضیح میدن واستون ولی همونطور ک گفتم خودتون تحلیل کنید مثال easy webرو همه چی دستگیرتون میشه

                        «پشتکار» «پشتکار» «پشتکار»

                        دیدگاه


                          #13
                          پاسخ : راه اندازی TCP/IP با استفاده از آیسی شبکه KS8721 (بورد آموزشی ECA)

                          نوشته اصلی توسط کنجکاو!
                          ببینید من واسه دستگاه هام حالت اکتیو گذاشتم. یعنی همه کلاینتن و به سرور اصلی متصل میشن (سرور برای کار من pc بود)
                          من با استفاده از همین مثال ایزی وب و تحلیل توابعش توابع خودم رو نوشتم و کار منو راه میندازه خدارو شکر
                          یه جای دیگه ازم خواستن دستگاه ها پسیو باشن توی شبکه و سرور هروقت خاص بهشون متصل بشه و دیتارو بگیره! و باز هم همون برنامه رو استفاده کردم.
                          موفق باشی

                          * هر وقت برسم پای سیستمم توابعی ک استفاده کردمو توضیح میدن واستون ولی همونطور ک گفتم خودتون تحلیل کنید مثال easy webرو همه چی دستگیرتون میشه
                          ممنون
                          الان یک سوال دارم. الان ما فقط داریم با مثال ایزی وب دیتا ارسال میکنیم.
                          میخوام ببینم ایا میشه در این مثال دیتا هم دریافت کرد.

                          فرض کنید که من از یه دیتایی رو روی اترنت برای میکرو ارسال میکنم و میکرو با توجه به دیتایی که من به عنوان کامند براش ارسال کردم یه صفحه ای رو میسازه و بعد ارسال میکنه

                          این قضیه دریافت دیتا رو من باید چطور هندل کنم.
                          و اینکه بر اساس اون شماتیکی که شما به من دادید (در مورد اتصالات بین میکرو و ای سی ۸۷۲۱)آ‌الانپ پایه اینتراپت به جایی وصل نیست.

                          با این پایه باید چه کنیم ؟

                          دیدگاه


                            #14
                            پاسخ : راه اندازی TCP/IP با استفاده از آیسی شبکه KS8721 (بورد آموزشی ECA)

                            سلام،
                            بعله میشه دریافت هم داشت.

                            همینطور که داخل متن برنامه EasyWeb می بینیم:
                            [code=c]
                            while (1) // repeat forever
                            {
                            if (!(SocketStatus & SOCK_ACTIVE)) TCPPassiveOpen(); // listen for incoming TCP-connection
                            DoNetworkStuff(); // handle network and easyWEB-stack
                            // events
                            HTTPServer();
                            }
                            [/code]

                            شرط اول چک میکنه سوکت فعاله یا نه؟ (متصل هست یا نه)، در صورتی که اتصالی هنوز برقرار نشده باشه توسط فرامین TCPPassiveOpen() یا TCPActiveOpen() ارتباط رو برقرار می کنه!
                            Passive: واسه حالتیه که میخوای دستگاهت حالت وب سروری داشته باشه یا اینکه سرور باشه یا سرور خودش بیاد بهش متصل بشه از این استفاده می کنی. در این صورت فقط IP و پورت دستگاه مهمه و توی به IP و پورت دستگاه مقصد کاری نداری. هرچی بهت وصل بشه واسش اطلاعات ارسال میشه. (برای مثال توی یک کاربردی من یه برنامه نوشته بودم که هر از چندگاهی بیاد به دستگاه هام سر بزنه و ازشون فیدبک بگیره (دستگاه ها نمیتونستن از خودشون بدون اجازه چیزی بفرستن (Slave - Master))، برای همین نیازی نبود برای برنامه کامپیوتریم باید به مثلاً 20تا کلاینت متصل بشم و وارد مسائل Threading و مدیریت کلاینت ها بشم! بلکه با استفاده از مد پسیو هربار هر کدومو که لازم داشتم بهش متصل میشدم و اطلاعات رو می گرفتم.)
                            Active: وقتیه که بخوای حالتی رو بگیری که به یک دستگاه یکتا، مشخص متصل بشه! (دقیقاً برعکس حالت قبلیه دیگه)، فقط اگه از این بخوای استفاده کنی باید Remote IP و TCPRemotePort رو هم مقداردهی کنی. مثلاً:
                            [code=c]
                            *(unsigned char *)RemoteIP = 24; // uncomment those lines to get the
                            *((unsigned char *)RemoteIP + 1) = 8; // quote of the day from a real
                            *((unsigned char *)RemoteIP + 2) = 69; // internet server! (gateway must be
                            *((unsigned char *)RemoteIP + 3) = 7; // set to your LAN-router)

                            TCPLocalPort = 2025;
                            TCPRemotePort = TCP_PORT_QOTD;

                            TCPActiveOpen();

                            while (SocketStatus & SOCK_ACTIVE) // read the quote from memory
                            { // by using the hardware-debugger
                            DoNetworkStuff();
                            }
                            [/code]

                            خب، در هر صورت ارتباطی یک تابعی به نام DoNetworkStuff موجوده که داخل حلقه بی نهایت برنامه هی تکرار میشه!
                            که میاد تایم بدی ها رو چک میکنه و فریم ها رو بررسی میکنه و خطا میده یا درست در نظرش می گیره و با توابع پایه تر مشخص میکنه ارتباط برقرار هست یا خیر و SocketStatus رو مقدار دهی می کنه.

                            و حالا بپردازیم به تحلیل سریع HTTPServer:
                            [code=c]
                            void HTTPServer(void)
                            {
                            if (SocketStatus & SOCK_CONNECTED) // check if somebody has connected to our TCP
                            {
                            if (SocketStatus & SOCK_DATA_AVAILABLE) // check if remote TCP sent data
                            TCPReleaseRxBuffer(); // and throw it away
                            if (SocketStatus & SOCK_TX_BUF_RELEASED) // check if buffer is free for TX
                            {
                            if (!(HTTPStatus & HTTP_SEND_PAGE)) // init byte-counter and pointer to webside
                            { // if called the 1st time
                            HTTPBytesToSend = sizeof(WebSide) - 1; // get HTML length, ignore trailing zero
                            PWebSide = (unsigned char *)WebSide; // pointer to HTML-code
                            }

                            if (HTTPBytesToSend > MAX_TCP_TX_DATA_SIZE) // transmit a segment of MAX_SIZE
                            {
                            if (!(HTTPStatus & HTTP_SEND_PAGE)) // 1st time, include HTTP-header
                            {
                            memcpy(TCP_TX_BUF, GetResponse, sizeof(GetResponse) - 1);
                            memcpy(TCP_TX_BUF + sizeof(GetResponse) - 1, PWebSide, MAX_TCP_TX_DATA_SIZE - sizeof(GetResponse) + 1);
                            HTTPBytesToSend -= MAX_TCP_TX_DATA_SIZE - sizeof(GetResponse) + 1;
                            PWebSide += MAX_TCP_TX_DATA_SIZE - sizeof(GetResponse) + 1;
                            }
                            else
                            {
                            memcpy(TCP_TX_BUF, PWebSide, MAX_TCP_TX_DATA_SIZE);
                            HTTPBytesToSend -= MAX_TCP_TX_DATA_SIZE;
                            PWebSide += MAX_TCP_TX_DATA_SIZE;
                            }

                            TCPTxDataCount = MAX_TCP_TX_DATA_SIZE; // bytes to xfer
                            InsertDynamicValues(); // exchange some strings...
                            TCPTransmitTxBuffer(); // xfer buffer
                            }
                            else if (HTTPBytesToSend) // transmit leftover bytes
                            {
                            memcpy(TCP_TX_BUF, PWebSide, HTTPBytesToSend);
                            TCPTxDataCount = HTTPBytesToSend; // bytes to xfer
                            InsertDynamicValues(); // exchange some strings...
                            TCPTransmitTxBuffer(); // send last segment
                            TCPClose(); // and close connection
                            HTTPBytesToSend = 0; // all data sent
                            }

                            HTTPStatus |= HTTP_SEND_PAGE; // ok, 1st loop executed
                            }
                            }
                            else
                            HTTPStatus &= ~HTTP_SEND_PAGE; // reset help-flag if not connected
                            }
                            [/code]

                            خب در خطوط اولیه مشخصه که داره بررسی میکنه ارتباط برقرار هست که اصن بخواد چیزی بگیره یا بفرسته یا نه؟
                            در صورت باز بودن و متصل بودن سوکت میره سراغ اینکه ببینه دیتایی از سمت دستگاه مقصد اومده یا نه؟ (این همون قسمتیه که شما لازم داری)
                            توسط این شرط:
                            [code=c]if (SocketStatus & SOCK_DATA_AVAILABLE)[/code]
                            در صورت برقراری شرط فوق یعنی اومدن دیتا میتونی اونو توی بافر TCP_RX_BUF بررسی کنی!!! (اینم دریافت )
                            فقط یادت باشه بعد از بررسی بافر دریافتت و اصطلاحا برداشتن اطلاعاتت از بافر حتماً SOCK_DATA_AVAILABLE رو باید پاک کنی
                            با استفاده از دستور زیر: (متنشم آوردم)
                            [code=c]
                            void TCPReleaseRxBuffer(void)
                            {
                            SocketStatus &= ~SOCK_DATA_AVAILABLE;
                            }
                            [/code]

                            خب در ادامه میبینی که چندتا شرط مربوط به سایز بایت های ارسالی و شرایط ارسال صفحه HTTP اومده که قسمت دومش رو نیازی نداریم. بجاش کد زیر رو توضیح میدم واست:
                            [code=c]
                            if (SocketStatus & SOCK_CONNECTED){
                            BufferByteToSend = sizeof(myBuffer) - 1;
                            BufferToSend = (unsigned char *)myBuffer;
                            if (BufferByteToSend > MAX_TCP_TX_DATA_SIZE) // transmit a segment of MAX_SIZE
                            {
                            memcpy(TCP_TX_BUF, BufferToSend, MAX_TCP_TX_DATA_SIZE);
                            BufferToSend -= MAX_TCP_TX_DATA_SIZE;
                            BufferToSend += MAX_TCP_TX_DATA_SIZE;

                            TCPTxDataCount = MAX_TCP_TX_DATA_SIZE; // bytes to xfer
                            TCPTransmitTxBuffer(); // xfer buffer
                            }
                            else if (BufferByteToSend) // transmit leftover bytes
                            {
                            memcpy(TCP_TX_BUF, BufferToSend, BufferByteToSend);
                            TCPTxDataCount = BufferByteToSend; // bytes to xfer
                            TCPTransmitTxBuffer(); // send last segment
                            BufferByteToSend = 0; // all data sent
                            LPC_GPIO2->FIOPIN ^= 1 << 0;
                            }
                            }
                            [/code]
                            دوباره بررسی متصل بودن سوکت، محاسبه تعداد بایت های ارسالی و بررسی اینکه بیشتر از حد بافر ارسال هست یا نه؟ و در نهایت ارسال بافر TCP_TX_BUF توسط تابع TCPTransmitTxBuffer()!!!

                            تموم

                            ببخشید که خیلی هول هولی جواب دادم چون واقعاً چند وقتیه سرم شلوغ شده. با کمی دیگه بررسی و تغییر توی کدها میتونین خیلی شرایط دیگه برای خودتون درست کنید.

                            موفق باشید

                            «پشتکار» «پشتکار» «پشتکار»

                            دیدگاه


                              #15
                              پاسخ : راه اندازی TCP/IP با استفاده از آیسی شبکه KS8721 (بورد آموزشی ECA)

                              ممنونم کنجکاو عزیز از توضیحاتت.

                              الان من یه چند تا سوال دارم. ببین الان دستگاه میکرو سروره و یه کامپیوتر هم بهش وصل میشه . در حالت میکرو سرور فرموده بودید که میشه حالت active

                              حالا این کامپیوتر یه دیتایی رو ارسال میکنه برای میکرو به عنوان دستور که خب دستور میتونه تعدادی ارگومان هم داشته باشه . بنابراین اینجا دستوری که از طرف کامپیوتر برای میکرو ارسال میش طولش متغیر هست . حالا اون طرف میکرو باید دستور رو بگیره.

                              اولین سوالم اینه که ایا وقتی میکرو رو حالت اکتیو باشه میتونه سند و رسیو کنه ؟ یا اینکه نه. مثلا برای ارسال میره رو مد اکتیو و اگه بخواد دریافت کنه باید حتما بیاد رو مود پسیو ؟

                              دوم اینکه ایا چه در حالت اکتیو و چه پسیو ، میکرو میتونه ارسال و دریافت پکت بکنه، ایا میشه همزمان هم سند کرد و هم رسیو ؟ یا اینکه در یک لحظه فقط یکی انجام میشه.

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

                              فعلا این سوالات برای من پیش اومد.

                              دیدگاه

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