توابع blocking در کتابخانه stdio.h

با سلام ،
آیا راهی برای جلوگیری از blocking بودن توابعی مثل gets وجود داره؟
من حتی در if (! PINx.n) ، که استفاده میکنم ، به محض اینکه شرط برقرار میشه (دکمه فشرده میشه) ، وارد if میشه ،ولی زمانی که دستم رو از رو دکمه برمیدارم ، از if بیرون نمیاد ، تا موقعی که data بگیره ، باعث میشه کل کد block بشه ، مثلا ممکنه یه نفر اشتباهی دستش به دکمه بخوره.
من در حین تمرین rfid ،با این مشکل مواجه شدم .
من تا جلسه 4 از فصل avr رو دیدم.

با تشکر.

سلام دوست عزیز، مشکل کد شما استفاده نکردن از while برای خوندن کل بافر ورودی سریال هست. وقتی که روی سریال اطلاعاتی دریافت میشه، باید با این روش کل اون بافر رو بخونید. while(serial.available()) برای همین منظور استفاده میشه.
نکته بعدی اینکه در تابع rx شما اگر چیزی برای خوندن نداشتید هم باید یک چیزی return کنید که تابع tx بفهمه که چیزی دریافت نشده و نباید چیزی ارسال کنه.

با سلام ،
من جلسه بعد رو دیدم و متوجه شدم در رابطه با این موضوع ، آموزش دادین.

فقط یه سوال برام پیش اومده، من برای این که فانکشنی که مینویسم ،کد رو block نکنه ، از if استفاده کردم ، و یه فرق کوچک به کدی که شما آموزش دادین ، دادم.
به جای اینکه بنویسم تا زمانی که UDRE ،صفر هست (پر هست) ، صبر کن، نوشتم اگر 1 بود (خالی بود) برو توif .
برای ریسیو هم به همین شکل ، اگر RXC یک بود (چیزی اومده) برو تو if .
ولی کد درست کار نمیکرد ، آخرین مقداری که به tx میدادم رو ، همیشه چاپ میکرد(بعضی وقتا مقادیر عجیب و غریب) ،انگار که همیشه UDRE ، برابر با 1 .

حدسی که خودم میزنم ، سرعت بالای کلاک میکرو هستش ،که اگه مقادیر رجیستر UDRعوض شدند ، باید سریع مقادیر رو بخونیم که با while قابل انجام.
باتشکر.

میشه لطفا کدتون رو اینجا ارسال کنید؟ متوجه مشکلتون با نرم افزار putty هم نشدم. putty به دلیل ساده بودنش معمولا از realterm بهتر جواب میده حتی.

@Mehrad#4836
با سلام
از شما تشکر میکنم که خیلی حرفه ای تدریس میکنید ، الان متوجه شدم که شما از قصد تمرین rfid رو گفتین حتما انجام بدین چون میدونستین نمیشه و باعث میشه ما به مشکل بخوریم و در جلسات بعدی، راهکار برای حل این مشکل رو تدریس میکنید.
در واقع من جلسه بعد رو دیدم و مشکل من الان با اینتراپت سریال کامل حل شد ، حتی بهتر از قبل . و با این نوع تدریس ،من هرگز این مبحث رو نمیتونم فراموش کنم (حتی اگه بخوام).

با این وجود کنجکاوم، مشکل کدی که نوشتم رو بدونم :

[upl-file uuid=5f129c7a-0e8b-4710-a635-b3fad36dfa78 size=971B]rx-and-tx.c[/upl-file]

خیلی ممنونم.


سلام دوست عزیز، مشکل کد شما در اون delay هست که داخل loop اصلی برنامه گذاشتید. وقتی که شما روی سریال چیزی براتون ارسال میشه، اگر بلافاصله اون رو نخونید، داده های جدید جایگزین اون میشه. علاوه بر این وقتی که اولین کاراکتر رو خوندید، باید بدون وقفه، بقیه کاراکتر ها رو هم بخونید تا داده ای از دست نره. اون delay باعث شده که عملکرد کد شما قابل پیشبینی نباشه و معلوم نیست کی به سریال سر میزنه و بعد از اینکه اولین کاراکتر رو خوند، بعدی رو کی می خونه و ...

@Mehrad#4791
با سلام
استاد من delay رو برداشتم ولی مشکل به همان گونه که بالاتر گفتم وجود دارد.

برام جالبه که کد رو مثل عکس پایین با while مینویسم ،کد کار میکند ولی while رو که بردارم ،کد مشکل دارد.

یه مشکلی ام وجود داره که نمیدونم ربطی به این مشکل داره یا نه ، ولی میگم شاید کمک کننده باشه : من زمانی ام که حتی با while کد رو مینویسم ،در نرم افزار putty ،کاراکتری را که فشار میدادم ، نمایش نمیده ، و با RealTerm که کد درست کار میکنه و مقادیر رو نمایش میده ، کلا نرم افزار putty زمانی کار میکند که از قبل کاراکتری رو بهش پاس بدم ،مثلا (‘a’).

با تشکر.