با سلام من در یک برنامه از دستور getchar استفاده میکنم مشکل اینجاست که وقتی چیزی دریافت نمیکنه تو همین خط میمونه و دستورات حلقه while اجرا نمیشه ،چه جوری میشه اگر چند ثانیه چیزی نگرفت برنامه به کار خودش ادامه بده
اطلاعیه
Collapse
No announcement yet.
مشکل با دستور getchar
Collapse
X
-
پاسخ : مشکل با دستور getchar
با سلام تایم اوت را اینجوری گذاشتم اما کار نمیکنه و همونجا میمونهنوشته اصلی توسط mojalanقبل از فراخوانی getchar بهتر از وجود داده در ÷ورت مطمئن بشید
تابع getchar رو خودتون دست بزنید و داخلش تایم اوت بذارید
char getchar(void)
{
char data;
//static unsigned char ModemOff=0;
while (rx_counter0==0)
{
// if(FlagRecieveSMSUart==1)NUM++;
// sprintf(Ctemp, " %02u ",NUM);
// DrawStringAt(8, 10, Ctemp, WHITE, BLUE);
// if(NUM>500)
// {
// NUM=0;
// //FlagRecieveSMSUart=0;
// rx_counter0=1;
// ExitFlag=1;
//
// }
دیدگاه
-
پاسخ : مشکل با دستور getchar
داخل تابع getchar به این صورته
این یعنی تا زمانی که کاراکتر دریافت نکنه از جاش تکون نمی خوره. شما باید از همین استفاده کنید منتها به جای while ش if بزارین تا اونجا گیر نکنه. یعنی به عبارتی اگه چیزی داخل بافر سریال بود وارد حلقه if بشه اگر نبود بقیه برنامرو بخونه.کد:while(!(UCSR0A & (1<<RXC0))
یعنی یچیزی مثل این:
کد:char in; if(UCSR0A & (1<<RXC0)){ in=UDR0; //...... } //edame barname
دیدگاه
-
پاسخ : مشکل با دستور getchar
این دقیقا شبیه getchar عمل میکنه که یک کاراکتر رو کامل میگیره منتها همونطورکه تو کد بالا نوشتم حتما بعدش باید رجیستر UDR0 خونده بشه. در نظر داشته باشین که این کد واسه میکروهای بیشتر از یک Usart هست.نوشته اصلی توسط زوارمن از وقفه استفاده میکنم،
if(UCSR0A & (1<<RXC0))
این درسته اما اگر از این استفاده کنم حتما تمامه دیتاهاما میگیره؟
این کدها مشابه هم عمل میکنه با این تفاوت که در دومی میکرو رو منتظر نگه نمی دارهکد:in=getchar();
کد:if(UCSR0A & (1<<RXC0)){ in=UDR0; }
دیدگاه
-
پاسخ : مشکل با دستور getchar
یعنی شما میگی به جای getchar() از این استفاده کنم؟تو همون روتین وقفه بنویسم؟نوشته اصلی توسط mohammadfa91این دقیقا شبیه getchar عمل میکنه که یک کاراکتر رو کامل میگیره منتها همونطورکه تو کد بالا نوشتم حتما بعدش باید رجیستر UDR0 خونده بشه. در نظر داشته باشین که این کد واسه میکروهای بیشتر از یک Usart هست.
این کدها مشابه هم عمل میکنه با این تفاوت که در دومی میکرو رو منتظر نگه نمی دارهکد:in=getchar();
کد:if(UCSR0A & (1<<RXC0)){ in=UDR0; }
دیدگاه
-
پاسخ : مشکل با دستور getchar
نه دیگه وقفه چرا؟ گفتم ازین روش استفاده کنید که نیازی به استفاده از وقفه نباشه دیگه. تو حلقه while اصلی میتونید ازش استفاده کنید فقط دقت کنید که تو حلقه while اصلا از delay استفاده نکنید.نوشته اصلی توسط زواریعنی شما میگی به جای getchar() از این استفاده کنم؟تو همون روتین وقفه بنویسم؟
دیدگاه







دیدگاه