اطلاعیه

Collapse
No announcement yet.

دستور printf در پورتهای سریال متعدد

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

    دستور printf در پورتهای سریال متعدد

    سلام
    در میکرو کنترلر هایی که مثل atmega162 یا atmega2560 چند تا پورت سریال دارند چطور میشه از printf استفاده کرد؟ دستور putchar وputchar1 در کدویژن هستند اما آیا واسه printf هم همچین مشابهی وجود داره؟ آیا دستورهایی مثل putchar3 هم داریم؟
    Don't hesitate to ask any question ..

    #2
    پاسخ : دستور printf در پورتهای سریال متعدد

    momkene kasi javab bede?
    mamnoon
    Don't hesitate to ask any question ..

    دیدگاه


      #3
      پاسخ : دستور printf در پورتهای سریال متعدد

      جناب آقای کسرایی!
      بعضی کامپایلر ها امکانی دارن که بشه توسط یک تابع تعریف شدنی مشخص کرد که خروجی کجا تولید (یا ارسال) بشه. اما اگر این مورد رو روی کامپایلرتون نمیدونین چطوره و مجبورین این کارو انجام بدین؛ راحتترین کار اینه که از تابع vsprintf استفاده کنین و خروجی رو که در یک رشته تولید کردین به پورت مربوطه ارسال کنین. یا حتی بهتر از اون یک فایل تعریف کنین و با استفاده از fprintf یا vfprintf با اون کار کنین.

      در WinAVR اگه به فایل stdio رجوع کنین میبینین که یک راه قشنگ قید کرده. یک فایل رو جوری تعریف کرده که بشه توسط توابع ورودی خروجی رشته ای stream با اون کار کرد:

      یه چیزی مثل این.


      کد:
      #include <stdio.h>
      
      static int uart0_putchar(char c, FILE *stream);
      static int uart1_putchar(char c, FILE *stream);
      static int uart0_getchar(FILE *stream);
      static int uart1_getchar(FILE *stream);
      
      static FILE uart0 = FDEV_SETUP_STREAM(
      	uart0_putchar,
      	uart0_getchar,
      	_FDEV_SETUP_RW);
      static FILE uart1 = FDEV_SETUP_STREAM(
      	uart1_putchar,
      	uart1_getchar,
      	_FDEV_SETUP_RW);
      
      static int uart0_putchar(char c, FILE *stream)
      {
        if (c == '\n')
         uart0_putchar('\r', stream);
        loop_until_bit_is_set(UCSR0A, UDRE);
        UDR0 = c;
        return 0;
      }
      
      static int uart0_getchar(FILE *stream)
      {
        ....
      }
      
      int main(void)
      {
       init_uart();
       fprintf(&uart0, "Hello, world!\n");
      
       return 0;
      }

      دیدگاه


        #4
        پاسخ : دستور printf در پورتهای سریال متعدد

        سلام
        من usart1 میکروی mega128 رو با کمی تغییر در کد تونستم راه بندازم (البته در کدویژن) به روش زیر:
        با استفاده از کد ویزارد اینتراپت usart0 را فعال میکنیم و وقتی کد ویزارد کدها رو ایجاد کرد . کدهایی رو که درون تابع putchar1 قرار دارد کپی میکنی بجای کدهایی که درون تابع putchar قرار دارند میذاری

        دیدگاه


          #5
          پاسخ : دستور printf در پورتهای سریال متعدد

          نوشته اصلی توسط esmaeil21
          کدهایی رو که درون تابع putchar1 قرار دارد کپی میکنی بجای کدهایی که درون تابع putchar قرار دارند میذاری
          من درست متوجه منظورتون نشدم چرا ptchar1رو باید توی putchar بذاریم؟ مگه خود putchar1 رو نمیشه استفاده کرد؟
          یه سوال دیگه ... من چند تا ورژن کدویژن دارم که اکثرا قدیمی هستند اصلا putchar1 ندارند تو help هم نبود . کدوم ورژن اینو داره و تو کدوم کتابخانه هست؟
          Don't hesitate to ask any question ..

          دیدگاه


            #6
            پاسخ : دستور printf در پورتهای سریال متعدد

            فرقی نمیکنه هر ورژنی که هست.
            در کدویزارد آیکون usart1 رو انتخاب کن و سپس قسمت transmitter رو تیک بزن و در usart0 هر دو گزینه رو تیک بزن
            حالا اون توابع که گفتم رو کدویزارد میسازه.
            با قرار دادن کدها در putchar هنگامی که این تابع خوانده می شود اطلاعات از usart1 ردوبدل میشود و میتوانید از دستور printf استفاده کنید.

            دیدگاه

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