PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : کمک در مورد واحد usart



amiray
19-07-2013, 13:49
با سلام
نماز و روزه هاتون قبول
من تو استفاده از usart یکم مشکل دارم . مشکلمم اینه که من با همه دستور های این واحد میتونم اطلاعات رو ارسال کنم ولی وقتی میام با استفاده از دستور printf برای ارسال و دریافت هر نوع داده ای استفاده کنم جواب نمیده. حالا خواستم ببینم که کسی میتونه راهنمایی کنه که من چطوری یه عدد رو بفرستمو اون یکی میکرو با scanf دریافت کنه.
تو کتاب مظاهریان هم نوشته که با این دستو میشه یه عدد رو فرستاد


printf("%d",trans);

و با این دستور دریافت کرد


trans=scanf("%d");

ولی من هر کار کردم کار نکرد.
من قبلا اعداد رو با getchar در یافت میکردم چون اعدادم کوچیکه ولی الان میخوام یه عدد چهار رقمی رو ارسال و دریافت کنم:x
ممنون میشم کمک کنین خیلی اظطراریه
با تشکر:wink:

Ma3ood
19-07-2013, 15:03
طریقه صحیح برای گرفتن رشته اعداد



scanf("%4d",&trans)

amiray
19-07-2013, 16:23
طریقه صحیح برای گرفتن رشته اعداد
کد:
scanf("%4d",&trans)


با تشکر از جوابتون
باری فرستادن باید priintf رو چه طوری بنویسم.

roohlla
19-07-2013, 17:28
بهتر از است از sprintf استفاده کنید و رشته ای که توسط این تابع آماده میشه رو روی usart ارسال کنید. همینطو می تونید از sscanf برای آنالیز یه دیتای دریافتی استفاده کنید.

Ma3ood
19-07-2013, 18:42
برای ارسال چهار رقم از دستور زیر استفاده کنید


printf("%4d",trans);

amiray
19-07-2013, 18:54
برای ارسال چهار رقم از دستور زیر استفاده کنید
کد:

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

amiray
20-07-2013, 10:49
کسی نیست جواب بده؟؟cry::

safavism
20-07-2013, 13:49
با سلام
با دستورwaitkey از پورت سریال میکرو دیتا دریافت میشه حالا اگه بخوام این اطلاعات رو به حالت اول برگردونم و دوباره بفرستم رو یه usart نرم افزاری باید به لحاظ نرم افزادی باید چکار کنم از همه دستورها استفاده کردم ولی نشد..به عبارت دیگه من قبل از اینکه دیتا رو به میکرو بدم بوسیله max به هایپر ترمینال وصل میشم و اطلاعات رو مشاهده میکنم حالا همین اطلاعات رو از tx به rx میکرو میدم و دیتا را میگیرم و رو ال سی دی نمایش میدم ..میخواستم همین اطلاعات گرفته شده دوباره به حالت اول برگردونم و بفرستم رو یه tx دیگه همین میکرو ، که نرم افزاری تعریف شده بعد دوباره رو هاپپر ترمینال مشاهده کنم ولی از هر دستوری استفاده کردم نشد نمیدونم مشکل کجاست اجغ وجغ رو هایپر ترمینال ظاهر میشه مطمئنم که از لحاظ سخت افزاری مشکل نداره..

ali_arak
21-07-2013, 00:18
با سلام
برای اینکه اجغ وجغ نباشه باید نرخ انتقال رو توی هایپر ترمینال تنظیم کنی البته اول باید با توجه به فرکانسی که استفاده می کنی مقدار رجیستر UBRRL رو مقدار دهی کنی UBRR=(F/16 BAUD) -1

برای سوال دوست اول من یه زمانی یه پروژه با دو میکرو ساختم جواب داد در مورد میکرو فرستنده
UCSRB=0x08 پورت سریال در حالت فرستنده
UCSRC=0x86 مد آسنکرون 8 بیتی بدون پریتی
UBRRH=0x00
UBRRL=0x67 نرخ انتقال 4800 با فرکانس 8مگاهرتز 67=1- (4800*16 / 8000000)
????=data دیتا که قرار است ارسال شود مقدار دهی میشود
putchar (data دیتا به خروجی سریال ارسال میشود
delay_ms(200 تاخیر 200 میلی ثانیه

در مورد میکرو گیرنده
پورتی که به ال سی دی متصل است تعیین میکنیم
UCSRB = 0x10 فعال کردن پورت سریال در حالت گیرنده
بقیه رجیسترها طبق فرستنده
()data_r=getchar خواندن دیتا از پورت سریال
بعد دیتا رو به ال سی دی ارسال می کنیم
(البته متغییرها که اول برنامه تعریف می کنیم)
یه مثال برای هایپر ترمینال هم گذاشتم

Ma3ood
21-07-2013, 01:51
کسی نیست جواب بده؟؟cry::

شما از دستوراتی مثل gets هم برای دریافت میتونی استفاده کنی
در مورد اینکه طول رشته تغییر میکنه میتونی در ابتدا در مبدا و یا مقصد تعداد اعداد را به دست بیاری و همراه با طول رشته مثلا در اغاز اون بفرستی تا بدونی چند عدد باید دریافت بشه

xp10
21-07-2013, 16:03
سلام
منم با usart مشکل دارم
مشکلم هم اینه که من وقتی با دستور puts یه رشته مثلا amir رو میفرستم و در گیرنده با دستور gets رشته رو دریافت میکنم فقط دوحرف am ارسال میشود و lcd این دو حرف رو نشون لطفا کمک کنید
برنامه گیرنده



#include <mega8.h>
#include <alcd.h>
#include <stdio.h>
#include <delay.h>
void main(void)
{
unsigned char str[20];
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
lcd_init(16);

gets(str,20);
lcd_puts(str);
}

برنامه فرستنده

#include <mega8.h>
#include <stdio.h>
#include <delay.h>
void main(void)
{
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
puts("amir");
}

amiray
23-07-2013, 18:04
سلام منم مشکل دوستمون xp10 دارم من وقتی میخوام یه رشته ای رو ارسال کنم میام اونو یکی یکی ارسال میکنم بعد اون طرف یکی یکی میگیرم به هم وصل میکنم. و وقتی با دستور puts میفرستم فقط دو تا کاراکتر رو میفرسته و بقیه نشون داده نمیشه. من فکر کنم قبلا این مشکل رو نداشتم امکان داره از کامپایلر باشه؟ چون ورژن جدید کدویژن رو استفاده میکنم.
یا اصلا این دستور کلا اینطوری کار میکنه؟
من اصلا نمیتونم یه عدد چهار رقمی رو هم یکجا با usart ارسال کنم
من اونو هم به صورت چهار تا کاراکتر ارسال میکنم بعد کد اسکی رو منهای 48 میکنم بعد به هم وصل میکنم.
اگه بشه یه رشته رو یه جا ارسال کرد این مشکل منم حل میشه.
لطفا کمک کنید.
با تشکر

ali_arak
23-07-2013, 22:53
با سلام
شما مي توانيد از تابع sprintf استفاده کني اين تابع به جاي ارسال خروجي سريال داده هاي فرمت بندي شده را در يک ارايه sram قرار ميدهد ودر انتهاي ارايه کاراکتر تهي را قرار مي دهد در اين صورت مي توان توسط تابع puts ارايه فرمت بندي شده را به خروجي سريال ارسال کرد
با تابع scanf مي توان يک رشته را کامل دريافت کرد تا اينکه رشته به n\ ختم شود
در کل با تابع sprintf ميتونيد اين مشکل را حل کنيد البته اين تابع چند پارامتر دارد
با تابع printf هم اين مشکل به راحتي حل مي شود
یه کتاب هم هست یه کم در این مورد توضیح داده You can see links before reply

ciscozagros
06-01-2014, 08:29
من یه مشکل دارم رشته ای که دریافت میکنم اگه بخوام داخل دستور سوئیچ یا if بذارم ارور میده

1nafar
06-01-2014, 14:24
سلام
دستور puts رشته ها رو کاراکتر به کاراکتر به پورت com ارسال میکنه .
در سمت گیرنده ، کد 10 به معنی پایان خط و کد 13 به معنای کلید enter ( پایان ارسال ) هست .
در این حالت اگه در کد های ارسالی عدد 13 یا 10 یافت بشه ، گیرنده به اشتباه فکر میکنه ارسال اطلاعات از سمت فرستنده به پایان رسیده .
به عنوان مثال کارکتر های مربوط به رشته ی amir رو به باینری تبدیل کنید :
Binary ↔ ASCII text converter (You can see links before reply)
همون طور که مشاهده کنید کد 13 در کارکتر سوم وجود داره :
01100001 01101101 01101001 01110010
به همین دلیل هست که در راهنمای اغلب کامپایلر ها ( مثل ccs pic c ) نوشته :


In general printf() is more useful than puts().

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

1nafar
06-01-2014, 14:26
من یه مشکل دارم رشته ای که دریافت میکنم اگه بخوام داخل دستور سوئیچ یا if بذارم ارور میده
سلام
برنامه ای رو که نوشتید بزارید ، مطالب درج شده در لینک های موجود در امضای من رو مطالعه کنید .