اطلاعیه

Collapse
No announcement yet.

اتصال یک ماژول به یک میکرو از طریق USART

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

    اتصال یک ماژول به یک میکرو از طریق USART

    سلام

    واقعیتش یه ماژولی هست که اطلاعات محیط (دما و رطوبت و ...) رو جمع آوری میکنه و به میکرو ارسال میکنه. قبلا یه نفر برای میکرو برنامه نوشته بوده و استفاده میشده ازش اما موقعی که رفته میکرو رو هم با خودش برده و الان به من گفتن یه برنامه نویس که بتونیم از این ماژول استفاده کنیم. و من هیچی از usart نمی دونم.
    یه دیتاشیت از ماژول پیدا کردم که چیزایی که مشخصه توش ایناست
    UART Mode : 8 data bits,, 1 stop bit, no parity no flow control
    Baud rate : 9600
    Data Format:

    Encoding : ASCII
    Format : String
    Terminator : carriage return
    data type : floating point
    decimal places : 3
    smallest string : 4 characters
    largest string : 40 characters

    Sending Commands to device : 2 parts (Command (ASCII data string) , carriage return <cr>)
    مثلا یکی از دستوراتش Sleep هست که تو توضیحاتش نوشته :

    ASCII : Sleep <cr> (1
    HEX : 53 6C 65 65 70 0D
    DEC: 83 108 101 101 112 13
    برای دریافت هم همچین چیزی هست. کسی میتونه کمک کنه؟ من اصلا هیچی ازش سردر نمیارم
    من تا حالا با usart میکرو کار نکردم . با کدویزارد یوزارت رو فعال کردم اما بعدش نمی دونم باید چیکار کنم

    #2
    پاسخ : اتصال یک ماژول به یک میکرو از طریق USART

    نوشته اصلی توسط farzaneh72 نمایش پست ها
    سلام

    واقعیتش یه ماژولی هست که اطلاعات محیط (دما و رطوبت و ...) رو جمع آوری میکنه و به میکرو ارسال میکنه. قبلا یه نفر برای میکرو برنامه نوشته بوده و استفاده میشده ازش اما موقعی که رفته میکرو رو هم با خودش برده و الان به من گفتن یه برنامه نویس که بتونیم از این ماژول استفاده کنیم. و من هیچی از usart نمی دونم.
    یه دیتاشیت از ماژول پیدا کردم که چیزایی که مشخصه توش ایناست
    UART Mode : 8 data bits,, 1 stop bit, no parity no flow control
    Baud rate : 9600
    Data Format:

    Encoding : ASCII
    Format : String
    Terminator : carriage return
    data type : floating point
    decimal places : 3
    smallest string : 4 characters
    largest string : 40 characters

    Sending Commands to device : 2 parts (Command (ASCII data string) , carriage return <cr>)
    مثلا یکی از دستوراتش Sleep هست که تو توضیحاتش نوشته :

    ASCII : Sleep <cr> (1
    HEX : 53 6C 65 65 70 0D
    DEC: 83 108 101 101 112 13
    برای دریافت هم همچین چیزی هست. کسی میتونه کمک کنه؟ من اصلا هیچی ازش سردر نمیارم
    من تا حالا با usart میکرو کار نکردم . با کدویزارد یوزارت رو فعال کردم اما بعدش نمی دونم باید چیکار کنم
    سلام
    بهتره وقفه دریافت سریال رو فعال کنید. وقتی وقفه زده میشه، یک کاراکتر دریافت میکنید و در انتهای بافر قرارش میدید. اگر کاراکتر دریافتی <CR> با کد اسکی 0x0D بود، میفهمید دستور تمام شده و به برنامه اصلی با یک پرچم اطلاع میدید.
    توی برنامه اصلی با داشتن رشته دریافت شده که داخل بافر قرار داره، کار دیکد کردن پیام رو باید انجام بدید. کافیه الگویی که برای دریافت پیام توی دیتاشیت گفته شده رو پیدا کنید و عکس اون انجام بدید.
    برای بهتر شدن عملکرد پیشنهاد میدم ۲ تا بافر در نظر بگیرید و وقتی که برنامه اصلی در حال پردازش یکی از بافرها هستش، وقفه سریال بافر دیگه رو پر کنه.
    مشخصات سریال ماژول هم که ذکر شده* باید واحد سریال رو بر اساس همون تنظیم کنید.
    اگر سوال دیگه ای داشتید در خدمتم

    دیدگاه


      #3
      پاسخ : اتصال یک ماژول به یک میکرو از طریق USART

      نوشته اصلی توسط hossein.m98 نمایش پست ها
      سلام
      بهتره وقفه دریافت سریال رو فعال کنید. وقتی وقفه زده میشه، یک کاراکتر دریافت میکنید و در انتهای بافر قرارش میدید. اگر کاراکتر دریافتی <CR> با کد اسکی 0x0D بود، میفهمید دستور تمام شده و به برنامه اصلی با یک پرچم اطلاع میدید.
      توی برنامه اصلی با داشتن رشته دریافت شده که داخل بافر قرار داره، کار دیکد کردن پیام رو باید انجام بدید. کافیه الگویی که برای دریافت پیام توی دیتاشیت گفته شده رو پیدا کنید و عکس اون انجام بدید.
      برای بهتر شدن عملکرد پیشنهاد میدم ۲ تا بافر در نظر بگیرید و وقتی که برنامه اصلی در حال پردازش یکی از بافرها هستش، وقفه سریال بافر دیگه رو پر کنه.
      مشخصات سریال ماژول هم که ذکر شده* باید واحد سریال رو بر اساس همون تنظیم کنید.
      اگر سوال دیگه ای داشتید در خدمتم
      سلام. ممنون از راهنمایی تون
      من اول میخوام بتونم همین دستور sleep که گفتم رو ارسال کنم برای ماژول و بعد از اینکه تونستم ارسال کنم روی دریافتش کار کنم.
      اصلا نمیدونم چطوری Sleep رو باید بفرستم برای ماژول.کار اون <cr> چیه؟ حدود ده تا دستور داره اگر یکی اش رو متوجه بشم بقیش رو خودم می نویسم.
      ممکنه کد این قسمتش رو برام بنویسید؟

      دیدگاه


        #4
        پاسخ : اتصال یک ماژول به یک میکرو از طریق USART

        نوشته اصلی توسط farzaneh72 نمایش پست ها
        سلام. ممنون از راهنمایی تون
        من اول میخوام بتونم همین دستور sleep که گفتم رو ارسال کنم برای ماژول و بعد از اینکه تونستم ارسال کنم روی دریافتش کار کنم.
        اصلا نمیدونم چطوری Sleep رو باید بفرستم برای ماژول.کار اون چیه؟ حدود ده تا دستور داره اگر یکی اش رو متوجه بشم بقیش رو خودم می نویسم.
        ممکنه کد این قسمتش رو برام بنویسید؟
        بستگی داره چجور ارسال بخوایید بکنید.
        اگر رجیستری بخوایید، کاراکتر به کاراکتر داخل رجیستر داده سریال میذارید (UDR) و منتظر میمونید پرچم اتمام ارسال یک بشه. اما برای همین کار توی کدویژن تابع آماده هم هست که اگر اشتباه نکنم اسمش puts باشه که یک رشته رو میگیره و ارسال میکنه.
        شما کافیه یک رشته بسازید و بدید به puts. کاراکتر هم در واقع همون r\ هستش که باید انتهای رشته قرار بدید تا ماژول بفهمه دستور کجا تموم میشه. من پشت سیستم نیستم الآن ولی یه چیزایی اینجا مینویسم، شاید به کارتون بیاد:
        کد:
        char str[20];
        sprintf(str, "Sleep\r");
        puts(str);
        جدیدترین ویرایش توسط hossein.m98; ۱۵:۵۳ ۱۳۹۹/۰۹/۰۹.

        دیدگاه


          #5
          پاسخ : اتصال یک ماژول به یک میکرو از طریق USART

          نوشته اصلی توسط hossein.m98 نمایش پست ها
          بستگی داره چجور ارسال بخوایید بکنید.
          اگر رجیستری بخوایید، کاراکتر به کاراکتر داخل رجیستر داده سریال میذارید (UDR) و منتظر میمونید پرچم اتمام ارسال یک بشه. اما برای همین کار توی کدویژن تابع آماده هم هست که اگر اشتباه نکنم اسمش puts باشه که یک رشته رو میگیره و ارسال میکنه.
          شما کافیه یک رشته بسازید و بدید به puts. کاراکتر هم در واقع همون r\ هستش که باید انتهای رشته قرار بدید تا ماژول بفهمه دستور کجا تموم میشه. من پشت سیستم نیستم الآن ولی یه چیزایی اینجا مینویسم، شاید به کارتون بیاد:
          کد:
          char str[20];
          sprintf(str, "Sleep\r");
          puts(str);
          سلام خیلی ممنونم ازتون . فکر نمیکردم بشه به این سادگی. ولی جواب داد این کد.
          حالا مثل این تابع برای دریافت از ماژول هم هست؟ مثلا خروجی ماژول وقتی دستور Temp رو بهش میدیم دمای داخل اون مخزن هست که به این شکل میده مثلا
          34.50<cr>
          OK*
          فکر می کنم OK* هم جز< جواب ماژوله

          دیدگاه


            #6
            پاسخ : اتصال یک ماژول به یک میکرو از طریق USART

            نوشته اصلی توسط farzaneh72 نمایش پست ها
            سلام خیلی ممنونم ازتون . فکر نمیکردم بشه به این سادگی. ولی جواب داد این کد.
            حالا مثل این تابع برای دریافت از ماژول هم هست؟ مثلا خروجی ماژول وقتی دستور Temp رو بهش میدیم دمای داخل اون مخزن هست که به این شکل میده مثلا
            34.50<cr>
            OK*
            فکر می کنم OK* هم جز< جواب ماژوله
            دریافت قضیش کمی پیچیده تره و به همین آسونی معمولا نمیشه هندلش کرد. میدونم که کدویژن یه تابع برای دریافت کاراکتر تکی داره اما رشته فکر نکنم داشته باشه. رشته رو باید خودتون هندل کنید که بهترین راهش همون وقفه ای هستش که گفتم.
            در هر صورت برای دریافت میتونید از getchar استفاده کنید. البته اگر اسمش واقعا همین باشه:
            کد:
            char ch = getchar();

            دیدگاه


              #7
              پاسخ : اتصال یک ماژول به یک میکرو از طریق USART

              نوشته اصلی توسط hossein.m98 نمایش پست ها
              دریافت قضیش کمی پیچیده تره و به همین آسونی معمولا نمیشه هندلش کرد. میدونم که کدویژن یه تابع برای دریافت کاراکتر تکی داره اما رشته فکر نکنم داشته باشه. رشته رو باید خودتون هندل کنید که بهترین راهش همون وقفه ای هستش که گفتم.
              در هر صورت برای دریافت میتونید از getchar استفاده کنید. البته اگر اسمش واقعا همین باشه:
              کد:
              char ch = getchar();
              ممنون خیلی لطف کردین

              دیدگاه


                #8
                پاسخ : اتصال یک ماژول به یک میکرو از طریق USART

                نوشته اصلی توسط hossein.m98 نمایش پست ها
                دریافت قضیش کمی پیچیده تره و به همین آسونی معمولا نمیشه هندلش کرد. میدونم که کدویژن یه تابع برای دریافت کاراکتر تکی داره اما رشته فکر نکنم داشته باشه. رشته رو باید خودتون هندل کنید که بهترین راهش همون وقفه ای هستش که گفتم.
                در هر صورت برای دریافت میتونید از getchar استفاده کنید. البته اگر اسمش واقعا همین باشه:
                کد:
                char ch = getchar();
                حق با شماست ظاهرا دریافت خیلی سخت تره.
                من میخوام اون عددی که ماژول برمیگردونه رو روی ال سی دی نمایش بدم.
                ممنون میشم اگر فرصتی داشتین کدش رو برام بنویسید. شرمنده ها
                جدیدترین ویرایش توسط farzaneh72; ۱۷:۵۹ ۱۳۹۹/۰۹/۰۹.

                دیدگاه


                  #9
                  پاسخ : اتصال یک ماژول به یک میکرو از طریق USART

                  نوشته اصلی توسط farzaneh72 نمایش پست ها
                  حق با شماست ظاهرا دریافت خیلی سخت تره.
                  من میخوام اون عددی که ماژول برمیگردونه رو روی ال سی دی نمایش بدم.
                  ممنون میشم اگر فرصتی داشتین کدش رو برام بنویسید. شرمنده ها
                  من به دلایلی که برای خودم دارم معمولا توی انجمن برای کسی اینجور کدی نمینویسم. مگر در مواردی که کاربرد آموزشی داشته باشه و بدونم کاربر ازش چیزی یاد میگیره. جوری هم مینویسم که خودش مجبور بشه تکمیلش کنه. بیشتر ترجیحم به اینه که اگر قراره کمکی کنم، به جای ماهی دستش دادن، ماهیگیری یادش بدم. مثل همون توضیحاتی که توی ارسال اول براتون فرستادم.
                  با تمام این تفاسیر، من نه میدونم الگوی پیام ها چیه، نه میدونم نوع ماژول چیه. با این اوضاع بر فرض که وقتم داشته باشم، نمیتونم کدشو بنویسم.

                  دیدگاه


                    #10
                    پاسخ : اتصال یک ماژول به یک میکرو از طریق USART

                    نوشته اصلی توسط hossein.m98 نمایش پست ها
                    من به دلایلی که برای خودم دارم معمولا توی انجمن برای کسی اینجور کدی نمینویسم. مگر در مواردی که کاربرد آموزشی داشته باشه و بدونم کاربر ازش چیزی یاد میگیره. جوری هم مینویسم که خودش مجبور بشه تکمیلش کنه. بیشتر ترجیحم به اینه که اگر قراره کمکی کنم، به جای ماهی دستش دادن، ماهیگیری یادش بدم. مثل همون توضیحاتی که توی ارسال اول براتون فرستادم.
                    با تمام این تفاسیر، من نه میدونم الگوی پیام ها چیه، نه میدونم نوع ماژول چیه. با این اوضاع بر فرض که وقتم داشته باشم، نمیتونم کدشو بنویسم.
                    بله ممنون متوجهم. واقعیتش من هر چیز زیادی ازش نمی دونم فقط میدونم خروجی ماژول اینطوریه
                    Receiving Commands from device : 2 parts (ASCII data string(command) , carriage return <cr>)
                    مثلا برای دما خروجی این مدلی میشه
                    34.50<cr>
                    فکر می کنم با gets بتونم یه رشته رو بگیرم از ورودی
                    بازم ممنون اگر راهنمایی کنید خودم بتونم انجامش بدم

                    دیدگاه


                      #11
                      پاسخ : اتصال یک ماژول به یک میکرو از طریق USART

                      نوشته اصلی توسط farzaneh72 نمایش پست ها
                      بله ممنون متوجهم. واقعیتش من هر چیز زیادی ازش نمی دونم فقط میدونم خروجی ماژول اینطوریه
                      Receiving Commands from device : 2 parts (ASCII data string(command) , carriage return <cr>)
                      مثلا برای دما خروجی این مدلی میشه
                      34.50<cr>
                      فکر می کنم با gets بتونم یه رشته رو بگیرم از ورودی
                      بازم ممنون اگر راهنمایی کنید خودم بتونم انجامش بدم
                      چه وقتی این داده رو میفرسته؟ یعنی در جواب دستور خاصیه یا با یک فرکانس خاص و به شکل اتوماتیکه؟

                      دیدگاه


                        #12
                        پاسخ : اتصال یک ماژول به یک میکرو از طریق USART

                        نوشته اصلی توسط hossein.m98 نمایش پست ها
                        چه وقتی این داده رو میفرسته؟ یعنی در جواب دستور خاصیه یا با یک فرکانس خاص و به شکل اتوماتیکه؟
                        ببینید یه تعداد دستور مشخص داره که هر کدوم رو براش بفرستید مقدار اون پارامتر رو میده. به خود ماژول چند تا سنسور وصله (سنسور دما و رطوبت و ...)
                        مثلا دستور Temp دما رو میده با دو رقم اعشار
                        دستور Hum برای رطوبته ، دستور Sleep کلا خاموش میشه ، دستور Awake روشن میشه و ...
                        شما اگر همون دما را بعنوان مثال بگین چطوری میتونم روی ال سی دی نمایش بدم ممنون میشم.یعنی چطوری بخونمش ؟

                        دیدگاه


                          #13
                          پاسخ : اتصال یک ماژول به یک میکرو از طریق USART

                          نوشته اصلی توسط farzaneh72 نمایش پست ها
                          ببینید یه تعداد دستور مشخص داره که هر کدوم رو براش بفرستید مقدار اون پارامتر رو میده. به خود ماژول چند تا سنسور وصله (سنسور دما و رطوبت و ...)
                          مثلا دستور Temp دما رو میده با دو رقم اعشار
                          دستور Hum برای رطوبته ، دستور Sleep کلا خاموش میشه ، دستور Awake روشن میشه و ...
                          شما اگر همون دما را بعنوان مثال بگین چطوری میتونم روی ال سی دی نمایش بدم ممنون میشم.یعنی چطوری بخونمش ؟
                          این که داده اعشاریه کمی کار رو سختش میکنه! راه های استانداردی مثل استفاده پیشرفته از تابع sscanf هستش که نه بلدم، نه میدونم توی کدویژن پشتیبانی میشه یا نه.
                          اما راه ساده ای که الآن به نظرم میرسه اینه که شما باید دو قسمت قبل و بعد از اعشار رو به صورت عدد های صحیح استخراج کنید و بعد با ضرب و جمع تبدیلشون کنید به ممیز شناور. برای این کار لازمه تعداد ارقام بعد از اعشارم بدست بیارید که کار سختی نیست.
                          برای دریافت رشته دما هم این کد ساده ترین حالتشه:

                          char str[20];
                          char buffer[20];
                          sprintf(str, "Temp\r");
                          puts(str)


                          buffer[0] = 0;
                          for (i = 0; str[i] != '\r'; i++)
                          buffer[i] = getchar();


                          buffer[++i] = '\0';

                          برای استخراج دو قسمت صحیح و اعشاری داده کمی خلاقیت به خرج بدید میتونید با چندتا حلقه کارشو انجام بدید.
                          جدیدترین ویرایش توسط hossein.m98; ۰۰:۲۴ ۱۳۹۹/۰۹/۱۰.

                          دیدگاه


                            #14
                            پاسخ : اتصال یک ماژول به یک میکرو از طریق USART

                            نوشته اصلی توسط hossein.m98 نمایش پست ها
                            این که داده اعشاریه کمی کار رو سختش میکنه! راه های استانداردی مثل استفاده پیشرفته از تابع sscanf هستش که نه بلدم، نه میدونم توی کدویژن پشتیبانی میشه یا نه.
                            اما راه ساده ای که الآن به نظرم میرسه اینه که شما باید دو قسمت قبل و بعد از اعشار رو به صورت عدد های صحیح استخراج کنید و بعد با ضرب و جمع تبدیلشون کنید به ممیز شناور. برای این کار لازمه تعداد ارقام بعد از اعشارم بدست بیارید که کار سختی نیست.
                            برای دریافت رشته دما هم این کد ساده ترین حالتشه:

                            char str[20];
                            char buffer[20];
                            sprintf(str, "Temp\r");
                            puts(str)


                            buffer[0] = 0;
                            for (i = 0; str[i] != '\r'; i++)
                            buffer[i] = getchar();


                            buffer[++i] = '\0';

                            برای استخراج دو قسمت صحیح و اعشاری داده کمی خلاقیت به خرج بدید میتونید با چندتا حلقه کارشو انجام بدید.
                            سلام
                            خیلی با این کد سرو کله زدم اما جواب نداد.
                            الان من میتونم دستور رو برای ماژول بفرستم اما جوابی که ماژول میده (مثلا دما با دو رقم اعشار) رو نمی تونم بخونم و روی ال سی دی نشون بدم
                            کسی میتونه کمکم کنه و کدی برام بنویسه که بتونم رو ال سی دی مقدار دریافت شده از ماژول رو نشون بدم؟

                            دیدگاه


                              #15
                              پاسخ : اتصال یک ماژول به یک میکرو از طریق USART

                              نوشته اصلی توسط farzaneh72 نمایش پست ها
                              سلام
                              خیلی با این کد سرو کله زدم اما جواب نداد.
                              الان من میتونم دستور رو برای ماژول بفرستم اما جوابی که ماژول میده (مثلا دما با دو رقم اعشار) رو نمی تونم بخونم و روی ال سی دی نشون بدم
                              کسی میتونه کمکم کنه و کدی برام بنویسه که بتونم رو ال سی دی مقدار دریافت شده از ماژول رو نشون بدم؟
                              شما اون ماژول رو با مبدل USB به سریال به کامپیوتر متصل کنید و با نرم افزار ترمینال سریال، دستوراتش و پاسخی که میده دقیق چک کنید. اینکه صرفا بخوایید رشته پاسخ رو توی LCD نمایش بدید کار پیچیده ای نیست.

                              دیدگاه

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