• رایانه کارت حافظه را نمی بیند: SD، miniSD، microSD. چه باید کرد؟ کارت SD به عنوان حافظه داخلی اندروید

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

    گزینه 1: مشخص کردن آدرس نصب

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

    گزینه 2: مسیر نصب را از قبل تعیین کنید

    اگر نسخه سیستم عامل اندروید روی رایانه لوحی زودتر از 2.2 باشد، برنامه باید از پچ app2sd پشتیبانی کند. چنین مواردی در تنظیمات وجود نخواهد داشت. برای تمام نسخه های جدید، این الگوریتم برای حل مشکل مناسب است.

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

    بخش "Default Burn Disk" را پیدا کنید که چندین منبع برای نصب برنامه ها به شما ارائه می دهد. در میان آنها، "SD-card" را انتخاب کنید. روی این مورد کلیک کنید، دایره ای در مقابل آن مشاهده خواهید کرد. اکنون نصب برنامه ها روی کارت حافظه تبلت به صورت پیش فرض است.

    گزینه 3: استفاده از برنامه های شخص ثالث

    به احتمال زیاد این روش به شما کمک خواهد کرد. اما او مطالبه می کند. شما می‌توانید از این طریق متوجه شوید که آیا حقوق ریشه روی رایانه لوحی دارید یا خیر. ما برنامه های ویژه ای مانند FolderMount یا GL را به SD دانلود می کنیم که به انتقال داده های بازی و برنامه به کارت حافظه SD کمک می کند. دستورالعمل های ویدیویی را در زیر مشاهده کنید:

    گزینه 3

    برنامه ای را روی رایانه لوحی خود نصب کنید که به شما امکان می دهد آدرس نصب را انتخاب کنید. قبل از نصب مستقیم برنامه، کادر محاوره ای ظاهر می شود که در آن آدرس نصب را مشخص می کنید.

    این راحت ترین گزینه ارائه شده است. زیرا نصب اجباری "پیش فرض" در همه موارد مطلوب نیست. ابزارهایی مانند InstallManager، MagicUneracer به سازماندهی پر کردن اقتصادی و منطقی حافظه تبلت کمک خواهند کرد. ضمناً همین برنامه ها برنامه هایی را با تمام فایل های کمکی نیز حذف می کنند.

    اگر برنامه روی کارت SD نصب نشده باشد

    مورد "برنامه ها" را در "تنظیمات" باز کنید. در لیست برنامه ها، برنامه ای را که می خواهید به کارت قابل جابجایی منتقل کنید، انتخاب کنید. روی نماد برنامه کلیک کنید و منوی باز می شود. ببینید آیا گزینه "حرکت" دارد یا خیر. در صورت وجود، دکمه گزینه را فشار داده و کارت حافظه را انتخاب کنید. این روش نیازی به نصب نرم افزار اضافی ندارد، می توانید خودتان آن را انجام دهید.

    اکنون تقریباً هر دستگاهی در سیستم عامل اندروید از کارت حافظه (microSD) پشتیبانی می کند. با این حال، گاهی اوقات مشکلاتی در ارتباط با تشخیص آن در دستگاه وجود دارد. ممکن است دلایل متعددی برای بروز چنین مشکلی وجود داشته باشد و دستکاری های خاصی برای حل آنها لازم باشد. در مرحله بعد، روش هایی را برای تصحیح چنین خطایی در نظر خواهیم گرفت.

    قبل از ادامه دستورالعمل های زیر، توصیه می کنیم موارد زیر را انجام دهید:

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

    علاوه بر چنین مشکلات تشخیصی، خطایی رخ می دهد که درایو فلش آسیب دیده است. برای راهنمایی دقیق در مورد نحوه تعمیر آن، مطالب ما را در لینک زیر بخوانید.

    اگر نکات قبلی هیچ نتیجه ای به همراه نداشت و رسانه ذخیره سازی هنوز توسط گوشی هوشمند یا تبلت شناسایی نشد، به روش های زیر توجه کنید. ما آنها را به ترتیب سختی مرتب کرده ایم تا بتوانید بدون زحمت زیاد هر کدام را به ترتیب اجرا کنید.

    روش 1: حذف داده های کش

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

    دستورالعمل های دقیق در مورد نحوه تغییر حالت Recovery در سیستم عامل اندروید و روش های دیگر حذف کش را می توانید در مقالات زیر مشاهده کنید.

    روش 2: خطاهای کارت حافظه را بررسی کنید

    به عنوان بخشی از این روش، تعدادی از مراحل ساده را دنبال کنید:


    اگر اسکن خطاها کمکی نکرد، باید اقدامات جدی تری انجام شود.

    روش 3: رسانه را قالب بندی کنید

    برای انجام این روش، همچنین باید کارت SD را با استفاده از آداپتورها یا آداپتورهای مخصوص به رایانه یا لپ تاپ متصل کنید.

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

    اگر مشکلی در قالب بندی دارید، توصیه می کنیم مقاله دیگر ما را در لینک زیر بخوانید. در آنجا هفت راه برای حل این مشکل پیدا خواهید کرد و به راحتی می توانید آن را برطرف کنید.

    اغلب، حذف داده ها از کارت در مواردی که پس از اتصال به تجهیزات دیگر شناسایی نمی شود، کمک می کند. فقط باید دستورالعمل های بالا را دنبال کنید، سپس بلافاصله رسانه را در گوشی هوشمند یا تبلت خود قرار دهید و عملکرد آن را بررسی کنید.

    روش 4: یک حجم خالی ایجاد کنید

    گاهی اوقات به دلیل اینکه کارت دارای بخش مخفی است، حافظه آن برای ذخیره اطلاعات از گوشی هوشمند کافی نیست. از جمله، در این مورد، مشکلات با تشخیص وجود دارد. برای رفع آنها، باید کارت را به رایانه شخصی متصل کنید و مراحل زیر را دنبال کنید:

    1. از طریق منو "شروع"رفتن به "صفحه کنترل".
    2. در اینجا یک دسته را انتخاب کنید "مدیریت".
    3. در میان لیست همه اجزا، پیدا کنید و روی آن دوبار کلیک کنید "مدیریت کامپیوتر".
    4. در پنجره باز شده باید انتخاب کنید "مدیریت دیسک".
    5. در اینجا به شماره دیسکی که درایو فلش شما است نگاه کنید و همچنین مقدار کل حافظه را یادداشت کنید. این اطلاعات را برای استفاده بعدی یادداشت یا به خاطر بسپارید.
    6. ترکیب کلید Win+Rاسنپ ​​را اجرا کنید "اجرا کن". cmd را تایپ کرده و روی آن کلیک کنید "خوب".
    7. در پنجره باز شده دستور diskpart را وارد کرده و کلیک کنید وارد.
    8. اعطای مجوز برای اجرای ابزار.
    9. اکنون به سراغ برنامه کار با پارتیشن های دیسک رفته اید. او یکسان دارد "خط فرمان"چشم انداز. در اینجا باید لیست دیسک را وارد کرده و دوباره روی آن کلیک کنید وارد.
    10. لیست دیسک ها را بررسی کنید، درایو فلش خود را در آنجا پیدا کنید، سپس دیسک 1 را انتخاب کنید، جایی که 1 – شماره دیسک محیط مورد نیاز.
    11. فقط پاک کردن تمام داده ها و پارتیشن ها باقی مانده است. این روش با استفاده از دستور پاک انجام می شود.
    12. منتظر بمانید تا فرآیند تکمیل شود و می توانید پنجره را ببندید.

    اکنون به این دست یافته ایم که کارت SD کاملاً تمیز است: تمام اطلاعات، پارتیشن های باز و پنهان از آن حذف شده است. برای عملکرد عادی باید یک ولوم جدید در گوشی ایجاد شود. به این صورت انجام می شود:

    1. چهار مرحله اول دستورالعمل قبلی را تکرار کنید تا دوباره به منوی مدیریت دیسک بازگردید.
    2. رسانه قابل جابجایی مورد نیاز را انتخاب کنید، روی علامت با حافظه آن راست کلیک کرده و انتخاب کنید "ایجاد جلد جدید".
    3. New Simple Volume Wizard در مقابل شما باز می شود. برای شروع روی آن کلیک کنید "به علاوه".
    4. نیازی به تعیین اندازه حجم ندارید، بگذارید تمام فضای آزاد را اشغال کند، بنابراین درایو فلش با یک دستگاه تلفن همراه بهتر کار می کند. پس فقط به مرحله بعدی بروید.
    5. هر حرف رایگان را به حجم اختصاص دهید و کلیک کنید "به علاوه".
    6. اگر فرمت پیش فرض نباشد، باید قالب بندی انجام شود FAT32. سپس این فایل سیستم را انتخاب کنید، اندازه خوشه را ترک کنید "پیش فرض"و برید جلو.
    7. پس از اتمام مراحل، اطلاعات مربوط به پارامترهای انتخاب شده در مقابل شما نمایش داده می شود. آنها را بررسی کنید و کار را انجام دهید.
    8. اکنون در منو "مدیریت دیسک"حجم جدیدی را مشاهده می کنید که تمام فضای منطقی کارت حافظه را اشغال می کند. این بدان معنی است که فرآیند با موفقیت به پایان رسید.

    فقط باید درایو فلش USB را از رایانه شخصی یا لپ تاپ جدا کنید و آن را در دستگاه تلفن همراه قرار دهید.

    اگر دستگاه شما حافظه داخلی کافی ندارد، می توانید از کارت SD به عنوان حافظه داخلی استفاده کنیدبرای گوشی اندرویدی شما این ویژگی که Adoptable Storage نام دارد، به سیستم عامل اندروید اجازه می دهد تا یک رسانه ذخیره سازی خارجی را به عنوان حافظه داخلی دائمی فرمت کند. اطلاعات روی کارت SD نصب شده رمزگذاری شده است و نمی توان از آن در دستگاه دیگری استفاده کرد.

    کارت SD گزینه بسیار مناسبی برای ذخیره عکس، آهنگ و فیلم است. حتی اگر مقدار زیادی حافظه داخلی در گوشی هوشمند اندرویدی خود دارید، همیشه می‌توانید برای ذخیره ویدیوهای طولانی که با دوربین با کیفیت بالا گرفته شده‌اید، به فضای ذخیره‌سازی زیادی نیاز داشته باشید.

    مهم دانستن است

    یک اشکال وجود دارد، تراشه SD ممکن است هنگام ضبط ویدیوی با کیفیت بالا عقب بماند.

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

    ذخیره سازی چیست؟

    فضای ذخیره سازی حافظه اصلی گوشی هوشمند شما است، اما در صورت لزوم، می توان آن را با استفاده از کارت SD افزایش داد. این در اندروید به آن Adoptable Storage می گویند.این به شما امکان می دهد از کارت microSD قابل جابجایی نصب شده بر روی تلفن Android خود به عنوان حافظه اصلی خود استفاده کنید. بنابراین، می توانید به راحتی مشکل نحوه تبدیل کارت SD را به حافظه اصلی اندروید و رفع کمبود فضا در صورت داشتن حجم داخلی کمی حل کنید.

    ویژگی های استفاده از کارت به عنوان حافظه اصلی

    تعدادی ویژگی مهم وجود دارد که باید در این روش در نظر گرفته شود.

    مفید خواهد بود

    هنگام استفاده از درایو، چه یک درایو فلش SD یا یک درایو USB، مهم است که به یاد داشته باشید که این دستگاه در چه فرمتی است و آیا سیستم عامل اندروید از آن پشتیبانی می کند یا خیر، و چهار نوع فرمت فایل اصلی وجود دارد: FAT32 یا exFAT. ext4 یا f2fs.

    چگونه حافظه گوشی را به کارت حافظه اندروید تغییر دهیم؟ سوال کاملا درست نیست، جایگزین کردن کامل آن غیرممکن است، همانطور که بود فقط می توانید حجم اضافی را "افزایش" کنید.

    استفاده از کارت SD به عنوان حافظه اصلی می تواند راه حلی عالی برای دوستداران موسیقی و سریال های تلویزیونی در راه رفتن به محل کار یا در یک سفر طولانی باشد. اما، همانطور که اغلب اتفاق می افتد، گسترش حافظه همیشه متکی به هزینه دستگاه مورد نیاز است،زیرا آنها هم از نظر سرعت و حجم و هم از نظر عملکرد قابل انطباق ذخیره اطلاعات با هم تفاوت دارند. در اینجا چند تفاوت ظریف وجود دارد که می توان آنها را از زوایای مختلف در نظر گرفت - هم در جهت منفی و هم در جهت مثبت:

    چگونه از کارت SD به عنوان حافظه داخلی در اندروید استفاده کنیم؟

    آیا حافظه داخلی کافی برای ذخیره تمام داده های خود دارید؟

    چگونه حافظه داخلی گوشی را با کارت sd خارجی در اندروید جایگزین کنیم؟ پیکربندی کارت SD برای کار به عنوان حافظه داخلی در اندروید در واقع یک فرآیند نسبتاً ساده است. هیچ چیز پیچیده ای در این مورد وجود ندارد و خودتان در ادامه خواهید دید.

    این امکان وجود دارد که عملکرد Adoptable Storage توسط دستگاه شما پشتیبانی نشود، حتی اگر گوشی هوشمند دارای اندروید 6.0 یا بالاتر باشد (این اتفاق می افتد، همه اینها به مدل و مارک تلفن هوشمند بستگی دارد). ممکن است سازنده دستگاه این ویژگی را غیرفعال کرده باشد. با این حال، روش های خط فرمان وجود دارد که به شما امکان می دهد از یک درایو فلش برای ذخیره داده ها استفاده کنید.

    مراحل اصلی قالب بندی در زیر ذکر شده است.


    در صفحه بعدی، آخرین فرصت را دارید تا تصمیم بگیرید که آیا می خواهید نظر خود را تغییر دهید یا خیر.

    مهم دانستن است

    فراموش نکنید که یک نسخه پشتیبان از داده ها تهیه کنید، پس از قالب بندی اطلاعات بدون هیچ ردی ناپدید می شوند!


    پس از تکمیل فرآیند قالب‌بندی، می‌توانید از کارت SD قابل جابجایی به عنوان یک مکان دائمی «موقت» یا «قابل جابجایی» استفاده کنید. اما به خاطر داشته باشید که مانند قبل از این کار، جایگزینی و بیرون راندن داغ دیگر در دسترس نخواهد بود. از همین رو درایو فلش را بدون استفاده از گزینه Eject خارج نکنید.علاوه بر این، می توانید عملاً مکان پذیرفته شده توسط سیستم عامل را حذف کنید، که بر این اساس، توصیه نمی شود، زیرا این می تواند باعث ایجاد خطاهای خاصی در دستگاه شود. اکنون می دانید که چگونه کارت حافظه را به حافظه اصلی اندروید تبدیل کنید.

    کارت‌های SD و microSD می‌توانند قابلیت‌های پروژه‌های آردوینو را که با مقادیر زیادی داده کار می‌کنند، به میزان قابل توجهی گسترش دهند: ثبت‌کننده‌های داده، ایستگاه‌های هواشناسی، سیستم‌های خانه هوشمند. بردهای آردوینو مجهز به حافظه داخلی نسبتاً کوچکی هستند که تنها تا 4 کیلوبایت شامل فلش مموری و EEPROM می شود. این حافظه برای نوشتن مقادیر زیاد داده کافی نخواهد بود، به خصوص اگر برد دائماً خاموش یا خاموش باشد. اتصال کارت SD آردوینو به عنوان یک درایو خارجی به شما امکان می دهد فضای ذخیره سازی هر اطلاعاتی را چند برابر کنید. درایوهای SD قابل جابجایی ارزان، آسان برای اتصال و استفاده آسان هستند. اتصال صحیح کارت SD به آردوینو در مقاله مورد بحث قرار خواهد گرفت.

    کار با حافظه SD در آردوینو چندان دشوار نیست. ساده ترین راه اتصال یک ماژول آماده و استفاده از کتابخانه استاندارد است. ما با این گزینه شروع خواهیم کرد.

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

    ماژول جهانی یک برد معمولی است که روی آن یک اسلات کارت، مقاومت ها و یک تنظیم کننده ولتاژ قرار می گیرد. دارای مشخصات فنی زیر است:

    • محدوده ولتاژ کاری 4.5-5 ولت؛
    • پشتیبانی از کارت SD تا 2 گیگابایت؛
    • جریان 80 میلی آمپر؛
    • سیستم فایل FAT 16.

    ماژول کارت SD عملکردهایی مانند ذخیره، خواندن و نوشتن اطلاعات روی کارت را اجرا می کند که برای عملکرد عادی دستگاه بر اساس میکروکنترلر لازم است.


    طبیعتا ماژول های کارت حافظه ارزان قیمت نیز معایبی دارند. به عنوان مثال، ارزان‌ترین و رایج‌ترین مدل‌ها فقط از کارت‌های تا 4 گیگابایت پشتیبانی می‌کنند، و تقریباً همه ماژول‌ها به شما امکان می‌دهند فایل‌هایی تا اندازه دو گیگابایت را روی کارت SD ذخیره کنید - این محدودیت سیستم فایل FAT است که در اکثر مدل‌ها استفاده می‌شود.

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

    بردهای آردوینو برای کار با SD

    برای کار با کارت SD، چندین برد مختلف وجود دارد:

    • آردوینو اترنت - این برد مجهز به ماژول مخصوص خروجی داده است. پین 4 برای خروجی CS استفاده می شود. برای عملکرد صحیح باید از دستور SD.begin(4) استفاده شود.
    • Adafruit Micro-SD یک برد توسعه است که هنگام کار با کارت های Micro-SD استفاده می شود.
    • Sparkfun SD - نصب شده در بالای آردوینو، CS از پین 8 برای خروجی استفاده می کند. نسخه جدید برد دارای اتصال 3.3 ولت و یک اینورتر شش بیتی داخلی است.

    اتصال SD و microSD به آردوینو

    دو نوع کارت وجود دارد - microSD و SD. آنها از نظر اتصال، ساختار و برنامه یکسان هستند، اما فقط در اندازه متفاوت هستند. قبل از استفاده، توصیه می شود کارت SD را فرمت کنید. معمولا کارت های جدید از قبل فرمت شده و آماده استفاده هستند، اما اگر از کارت قدیمی استفاده می کنید، بهتر است آن را در سیستم فایل آردوینو فرمت کنید. برای انجام این روش، کتابخانه SD باید روی رایانه نصب شود، ترجیحاً FAT16. برای فرمت کردن در ویندوز، باید روی نماد کارت کلیک کنید و روی "Format" کلیک کنید.

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

    پایه های دیجیتال به این صورت متصل می شوند: برای برد Arduino Nano یا Uno، پایه MOSI به D11، MISO به D12، SCK به D13، CS به 4، VCC به +5 V، .GND به GND متصل می شود. این برد دارای کانکتورهایی برای اتصال به ولتاژ 3.3 و 5 ولت می باشد. منبع تغذیه خود کارت 3.3 ولت است، بنابراین استفاده از میکروکنترلر با همان منبع تغذیه راحت تر است، در غیر این صورت به مبدل های سطح ولتاژ نیاز دارید. در رایج ترین بردهای آردوینو، چنین خروجی وجود دارد.

    هنگام اتصال یک کارت SD، باید مطابقت پین های SPI برای انواع مختلف بردهای آردوینو را در نظر بگیرید:

    کتابخانه آردوینو برای کار با SD و microSD

    برای راحتی کار با درایوهای داده خارجی، کتابخانه های آماده در Arduino IDE موجود است. در بیشتر موارد نیازی به دانلود یا نصب چیزی نخواهید داشت.

    برای گنجاندن یک کتابخانه در یک طرح، از عبارت include استفاده کنید:

    #عبارتند از #عبارتند از

    کتابخانه SPI برای عملکرد صحیح دستگاه های متصل شده از طریق SPI مورد نیاز است.

    عملکردهای کتابخانه برای خواندن و نوشتن داده ها در کارت مورد نیاز است. این کتابخانه می تواند کارت های SD و SDHC را پشتیبانی کند.

    نام ها با فرمت 8.3 نوشته می شوند، یعنی 8 کاراکتر برای نام، 3 کاراکتر برای پسوند. مسیر فایل با اسلش "/" نوشته می شود.

    نمونه های کتابخانه SD جاسازی شده

    Arduino IDE دارای نمونه های داخلی برای یادگیری سریع عملکردهای کتابخانه است:

    • اطلاعات کارت استخراج اطلاعات ذخیره شده در کارت SD است. با کمک آن می توانید دریابید که کارت در کدام سیستم فایل فرمت شده است، میزان فضای آزاد، چه داده هایی ثبت شده است.
    • Yun Datalogger - به شما امکان می دهد تا داده های گزارش را از سه حسگر روی کارت ضبط کنید.
    • Datalogger - داده های دریافتی از سنسور را روی کارت ثبت و ذخیره می کند.
    • Dump File - داده ها را از کارت بخوانید، آن را به پورت سریال منتقل کنید.
    • فایل ها - داده ها را ایجاد و حذف می کند. یک تابع file.write() وجود دارد که داده های نوشته شده را در یک بافر قرار می دهد. انتقال اطلاعات به نقشه هنگام فراخوانی توابع flush() یا close() اتفاق می افتد، بنابراین مهم است که پس از هر باز شدن فایل، آن را ببندید، در غیر این صورت داده ها از بین می روند.
    • Read Write - فایل ها را از کارت می نویسد و می خواند.

    توابع کتابخانه SD

    کتابخانه آردوینو SD شامل توابع مختلفی است که می توان از آنها برای دستکاری داده ها استفاده کرد. توابع کلاس SD:

    • Begin() - تابع کتابخانه را مقداردهی اولیه می کند، یک تماس برای سیگنال اختصاص می دهد.
    • exists() - برای بررسی اینکه آیا نقشه اطلاعات لازم را دارد یا خیر طراحی شده است.
    • mkdir() - به شما امکان می دهد پوشه مورد نظر را روی کارت حافظه ایجاد کنید.
    • rmdir() - با این تابع می توانید یک پوشه را حذف کنید. مهم است که پوشه ای که باید حذف شود خالی باشد.
    • open() - به شما امکان می دهد فایلی را باز کنید که باید بنویسید یا بخوانید. اگر فایل مورد نیاز روی نقشه نباشد، ایجاد می شود.
    • remove() - هر فایلی را حذف می کند.

    در پاسخ به همه این توابع، یکی از مقادیر باید درست باشد - در صورت تکمیل موفقیت آمیز عملیات و نادرست در صورت شکست.

    ایجاد، ویرایش و حذف فایل ها.

    برای کار با فایل ها در آردوینو یک کلاس File وجود دارد. این شامل توابعی است که برای نوشتن و خواندن اطلاعات از کارت طراحی شده است:

    • available() - بررسی می کند که آیا فایل حاوی بایت هایی است که برای خواندن در دسترس هستند یا خیر. پاسخ مقدار فضایی است که برای خواندن در دسترس است.
    • close() - فایل را می بندد، قبل از اینها بررسی می کند که آیا داده ها در کارت ذخیره شده اند یا خیر.
    • flush() - این تابع به شما امکان می دهد مطمئن شوید که داده ها روی کارت نوشته شده است.
    • name() - یک اشاره گر به نام برمی گرداند.
    • peek() - بایت های داده را می خواند، در حالی که نشانگر را به کاراکتر بعدی منتقل نمی کند.
    • position() - موقعیت فعلی اشاره گر را در فایل پیدا می کند.
    • print() - داده ها را به یک فایل جداگانه خروجی می دهد.
    • println() - داده ها را در یک فایل چاپ می کند تا جایی که یک بار بازگشت و یک خط خالی ظاهر می شود.
    • seek() - موقعیت موقعیت فعلی را در فایل تغییر می دهد.
    • size() - اطلاعات مربوط به اندازه داده ها را نمایش می دهد.
    • read() - اطلاعات را می خواند.
    • write() - در یک فایل می نویسد.
    • isDirectory() - با استفاده از این روش بررسی می کند که آیا فایل یک دایرکتوری است، یعنی یک دایرکتوری یا یک پوشه.
    • openNextFile() - نام فایل بعدی را نمایش می دهد.
    • () rewindDirectory - به اولین فایل در دایرکتوری باز می گردد.

    برای اینکه برد به درستی کار کند، باید مطمئن شوید که خروجی SS پیکربندی شده است.

    طرحی از نمونه کار با کتابخانه آردوینو SD

    در زیر طرحی نشان داده شده است که نمونه ای از کار با ماژول کارت حافظه را نشان می دهد.

    /* ثبت اطلاعات با استفاده از کارت های SD نمونه ای از ذخیره سازی داده ها از درگاه های آنالوگ بر روی کارت SD. داده ها در فایل به صورت مجموعه ای از خطوط با جداکننده فیلد به شکل نماد "," ذخیره می شود ** CLK - پین 13 ** CS - پین 4 */ #include #عبارتند از const int PIN_CHIP_SELECT = 4; void setup() ( Serial.begin(9600); Serial.print("Initializing SD card..."); // این پین باید به صورت OUTPUT pinMode (10، OUTPUT) تعریف شود؛ // تلاش برای مقداردهی اولیه ماژول اگر ( !SD.begin(PIN_CHIP_SELECT)) ( Serial.println("کارت ناموفق بود، یا وجود نداشت"); // اگر مشکلی پیش آمد، خارج شوید: return; ) Serial.println("کارت اولیه شد."); ) حلقه خالی () (// رشته ای با داده هایی که در فایل قرار می دهیم: String logStringData = ""؛ // داده ها را از پورت ها بخوانید و در رشته بنویسید (int i = 0; i< 5; i++) { int sensor = analogRead(i); logStringData += String(sensor); if (i < 4) { logStringData += ","; } } // Открываем файл, но помним, что одновременно можно работать только с одним файлом. // Если файла с таким именем не будет, ардуино создаст его. File dataFile = SD.open("datalog.csv", FILE_WRITE); // Если все хорошо, то записываем строку: if (dataFile) { dataFile.println(logStringData); dataFile.close(); // Публикуем в мониторе порта для отладки Serial.println(logStringData); } else { // Сообщаем об ошибке, если все плохо Serial.println("error opening datalog.csv"); } }

    ایجاد یک فایل و انتخاب نام برای کارت SD آردوینو

    ایجاد یک فایل یکی از رایج ترین کارها هنگام کار با کارت های SD در آردوینو است. همانطور که در طرح قبلی دیدیم، برای ایجاد یک فایل، به سادگی آن را باز کنید. اگر بخواهیم بررسی کنیم که چنین فایلی وجود دارد یا خیر، می‌توانیم از تابع exists() استفاده کنیم:

    • SD.exists("datalog.csv");

    در صورت وجود فایل، تابع TRUE را برمی گرداند.

    یکی از روش‌های رایج در هنگام ایجاد پروژه‌های ثبت داده، تقسیم فایل‌های بزرگ به فایل‌های کوچک‌تر است که به‌روزرسانی و باز کردن آن در رایانه راحت‌تر است. به عنوان مثال، به جای یک فایل datalog.csv بسیار بزرگ در کارت SD، می توانید با اضافه کردن یک عدد به انتها، چندین فایل کوچک داشته باشید: datalog01.csv، datalog02.csv و غیره.
    در اینجا یک نمونه طرح برای کمک به انجام کار آورده شده است:

    نام فایل char = "datalog00.csv"; // نام اولیه برای (uint8_t i = 0; i< 100; i++) { filename = i / 10 + "0"; filename = i % 10 + "0"; if (! SD.exists(filename)) { // Проверяем наличие logfile = SD.open(filename, FILE_WRITE); break; // Дальше продолжать смысла нет } }

    نتیجه

    همانطور که دیدیم، اتصال کارت حافظه SD به آردوینو و استفاده از آن در پروژه کار چندان دشواری نیست. برای این کار، کتابخانه های آماده ای در Arduino IDE و طیف گسترده ای از گزینه های ماژول وجود دارد. شما می توانید کارت حافظه را در هر فروشگاه الکترونیکی خریداری کنید، آنها ارزان هستند و در عین حال می توانند پتانسیل برد آردوینو را به میزان قابل توجهی افزایش دهند. با استفاده از کارت های حافظه، می توان مقادیر زیادی از داده ها را جمع آوری و برای تجزیه و تحلیل بعدی ذخیره کرد. با کمک مقاله خود، می‌توانیم پروژه‌های تحقیقاتی خود را با حافظه تقویت کنیم، سیستم‌های اعلام صوتی را برای یک خانه هوشمند ایجاد کنیم، یک پخش‌کننده موج ساده و موارد دیگر ایجاد کنیم.

    ما تصویر را از کارت SD روی صفحه نمایش نشان دادیم، اما برخی از نکات در آن نادیده گرفته شد، اولین - اتصال خود کارت، دوم - تنها بخشی از عملکردهای کتابخانه در نظر گرفته شد. پتی FatFsبیایید نگاهی دقیق تر به این نکات بیندازیم.

    ارتباط با کارت از طریق یکی از دو رابط امکان پذیر است، SPIیا SD.



    باید بگویم که رابط SD می تواند در حالت های یک بیتی و چهار بیتی کار کند.

    طرح اتصال کارت از طریق SPI استاندارد است و به نظر می رسد، پین های استفاده نشده کارت باید با استفاده از یک مقاومت 10K به منبع تغذیه متصل شوند.


    اما در طراحی های آماتور، مقاومت های کششی اغلب نادیده گرفته می شوند و نمودار اتصال را ساده می کنند.

    لازم به ذکر است که هنگام اتصال از طریق SPI، کارت نسبت به ولتاژ تغذیه بسیار سخت است و افت کوچک ولتاژ منبع تغذیه منجر به عدم کارکرد کارت می شود، این از تجربه شخصی تأیید شده است، چیزی برای گفتن در مورد کارت وجود ندارد. رابط SD، من هنوز آن را امتحان نکردم. همه اینها برایش نوشته شده بود برای منبع تغذیه، نصب خازن ضروری است. در مورد سلف، باید برای جریان تا 100 میلی آمپر درجه بندی شود، اما نصب آن ضروری نیست.

    نمودارهای نشان داده شده در بالا نشان می دهد که کارت برای کار به 3.3 ولت نیاز دارد، به ترتیب در خطوط انتقال داده، ولتاژ نباید از محدوده 0 - 3.3 ولت فراتر رود و در اینجا این سوال پیش می آید که اگر MC با 5 تغذیه شود چه می شود. ولت؟
    پاسخ ساده است، شما باید خطوط داده را مطابقت دهید، و این را می توان با استفاده از یک تقسیم کننده مقاومتی معمولی انجام داد.


    نمودار نشان می دهد که خط MISO نیازی به تطبیق ندارد زیرا داده ها از طریق این خط منتقل می شوند از کارت به MK.
    در واقع، تعداد کمی از افراد کارت را مستقیماً به MK متصل می کنند، اتصال کانکتور کارت به MK بسیار راحت تر است یا یک سپر با کانکتور و تمام مهارهای لازم خریداری می شود.

    ما اتصال را فهمیدیم، اکنون بیایید نحوه استفاده از کتابخانه را بررسی کنیم پتی FatFsکه برای میکروکنترلرهای 8 بیتی با حجم حافظه کم طراحی شده است.

    این کتابخانه شامل 5 فایل است:
    عدد صحیح.h- یک فایل هدر که انواع داده های اصلی را توصیف می کند.

    diskio.h- یک فایل هدر که نمونه های اولیه توابع سطح پایین را برای کار با دیسک و کدهای وضعیت آنها را اعلام می کند.

    diskio.c- توابع سطح پایین باید در این فایل پیاده سازی شوند، در ابتدا "خرد" وجود دارد.

    pffconf.h- فایل پیکربندی.

    pff.h- فایل هدر که در آن نمونه اولیه توابع برای تعامل با سیستم فایل دیسک اعلام شده است.

    pff.c- فایل شامل اجرای توابع برای تعامل با سیستم فایل دیسک است.

    مشاهده می شود که برای کارکرد کتابخانه، نیاز به پیاده سازی توابع سطح پایین است. اما اگر در مورد AVR یا PIC صحبت می کنیم، برای آنها در سایت می توانید نمونه کار با کتابخانه را که حاوی فایل است دانلود کنید. mmc، توابع سطح پایین قبلاً در آن پیاده سازی شده اند. همچنین لازم است که پیکربندی کتابخانه را در فایل pff.h تنظیم کنید و توابع لازم برای کار SPI را بنویسید.

    توابع Petit FatFs.

    FRESULT pf_mount (FATFS*)- عملکرد دیسک را سوار/ جدا می کند. این تابع باید قبل از شروع کار با دیسک فراخوانی شود، اگر تابع را با اشاره گر تهی فراخوانی کنید، دیسک خارج می شود. تابع را می توان در هر زمان فراخوانی کرد.

    گزینه ها
    FATFS* fs- یک اشاره گر به یک شی از نوع FATFS، شرح این ساختار را می توان در فایل pff.h یافت. ما فقط باید یک متغیر از این نوع را اعلام کنیم.

    مقادیر برگشتی:
    FR_OK (0)
    FR_NOT_READY- دستگاه را نمی توان مقداردهی اولیه کرد
    FR_DISK_ERR- هنگام خواندن از دیسک خطایی رخ داد
    FR_NO_FILESYSTEM- درایو پارتیشن FAT معتبری ندارد

    FATFS fs;//یک شی از نوع FATFS را اعلام کنید // دیسک را سوار کنید اگر (pf_mount(&fs) == FR_OK) ( //دیسک نصب شده است و با آن کار می کند //Dismount the disk pf_mount(NULL)؛ ) other ( // نصب دیسک انجام نشد )

    FRESULT pf_open (const char* مسیر)- تابع یک فایل موجود را باز می کند. پس از باز شدن فایل، می توانید با آن کار کنید، یعنی از روی آن بخوانید و روی آن بنویسید. می توانید با یک فایل باز کار کنید تا زمانی که فایل دیگری باز شود. تابع را می توان در هر زمان فراخوانی کرد.

    گزینه ها
    const char* path- یک اشاره گر به رشته ای که مسیر فایل را نشان می دهد. مسیر باید کاملاً نسبت به دایرکتوری ریشه مشخص شود و دایرکتوری ها را با اسلش از هم جدا کند.

    مقادیر برگشتی:
    FR_OK (0)- در صورت اجرای موفقیت آمیز تابع بازگردانده می شود
    FR_NO_FILE- فایل پیدا نشد
    FR_DISK_ERR- خطای دیسک
    FR_NOT_ENABLED- دیسک نصب نشده است

    FATFS fs;//اعلان یک شی از نوع FATFS //نصب دیسک if (pf_mount(&fs) == FR_OK) (//باز کردن فایل واقع در دایرکتوری ریشه if(pf_open("hello.txt") == FR_OK ) ( // انجام کاری ) //فایل موجود در پوشه را باز کنید new if(pf_open("new/hello.txt") == FR_OK) ( // کاری انجام دهید ) //دسکت کردن دیسک pf_mount(NULL)؛ ) else (// موفق به نصب دیسک نشد)

    FRESULT pf_read(void* buff، WORD btr، WORD* br)- تابع تعداد مشخص شده بایت ها را از فایل می خواند و آنها را در بافر ذخیره می کند. اگر تعداد بایت های خوانده شده کمتر از مقدار مشخص شده باشد، به پایان فایل رسیده است.
    #define _USE_READ 1

    گزینه ها:
    باطل *باف- اشاره گر به بافری که داده های خوانده شده در آن ذخیره می شود
    WORD btr- تعداد بایت هایی که باید خوانده شوند
    WORD*br- اشاره گر به متغیری که تعداد بایت های خوانده شده را ذخیره می کند.

    مقادیر برگشتی:
    FR_OK (0)- در صورت اجرای موفقیت آمیز تابع بازگردانده می شود
    FR_DISK_ERR- خطای دیسک
    FR_NOT_OPENED- فایل باز نشد
    FR_NOT_ENABLED- دیسک نصب نشده است

    FATFS fs;//یک شی از نوع FATFS BYTE buff;//بافر برای خواندن فایل WORD br; // شمارنده بایت خوانده شده // mount دیسک اگر (pf_mount(&fs) == FR_OK) ( // باز کردن فایل واقع در دایرکتوری ریشه if(pf_open("hello.txt") == FR_OK) ( // خواندن 10 بایت از آن pf_read(buff, 10, &br); if(br != 10) (//اگر br برابر با 10 نباشد //یعنی به پایان فایل رسیده ایم) ) )

    FRESULT pf_write (const void* buff، WORD btw، WORD* bw)- عملکرد به شما امکان می دهد داده ها را در یک فایل باز بنویسید. برای اینکه تابع در فایل pffconf.h کار کند، باید بنویسید
    #define _USE_WRITE 1

    گزینه ها:
    باطل *باف- اشاره گر به بافری که می خواهیم بنویسیم، مقدار صفر نوشتن را نهایی می کند
    WORD btw- تعداد بایت هایی که می خواهیم بنویسیم
    WORD*bw- اشاره گر به متغیری که تعداد بایت هایی را که می توان نوشت ذخیره می کند. با تجزیه و تحلیل این متغیر می توانید متوجه شوید که آیا به پایان پرونده رسیده است یا خیر.

    مقادیر برگشتی:
    FR_OK (0)- در صورت اجرای موفقیت آمیز تابع بازگردانده می شود
    FR_DISK_ERR- خطای دیسک
    FR_NOT_OPENED- فایل باز نشد
    FR_NOT_ENABLED- دیسک نصب نشده است

    با توجه به اینکه این کتابخانه برای میکروکنترلرهایی با مقدار کمی حافظه طراحی شده است، این عملکرد دارای تعدادی محدودیت است:

    • شما نمی توانید فایل های جدید ایجاد کنید و فقط می توانید روی فایل های موجود بنویسید
    • اندازه فایل قابل افزایش نیست
    • نمی توان مهر زمانی را به روز کرد
    • یک عملیات نوشتن فقط می تواند در یک مرز بخش شروع یا متوقف شود
    • ویژگی فایل فقط خواندنی نمی تواند از نوشتن جلوگیری کند

    برای درک نکته ماقبل آخر باید بدانید که حافظه کارت به بلوک (بخش) 512 بایتی تقسیم شده است. ضبط را فقط می توان از ابتدای بخش شروع کرد. بنابراین، اگر بخواهیم 1000 بایت بنویسیم، بخش اول به طور کامل نوشته می شود و تنها 488 بایت به دومی نوشته می شود و 24 بایت باقی مانده با صفر پر می شود.

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

    • نشانگر را روی مرز بخش تنظیم کنید، اگر روی مرز تنظیم نشود، نشانگر به مرز بخش پایینی گرد خواهد شد.
    • تابع نوشتن را به تعداد دلخواه صدا بزنید
    • با فراخوانی تابع با اشاره گر تهی، ورودی را نهایی کنید

    برای مثالی از کار تابع ضبط، لازم است یک تابع دیگر را در نظر بگیریم.

    FRESULT pf_lseek (افست DWORD)- نشانگر خواندن/نوشتن را در فایل باز تنظیم می کند. شما می توانید نشانگر را با یک افست مطلق یا نسبی تنظیم کنید؛ برای یک افست مطلق، باید یک عدد به تابع ارسال کنید.
    pf_lseek(5000);
    برای نسبی، مقدار اشاره گر را به موقعیت فعلی منتقل کنید fs.fptrو میزان جابجایی
    pf_lseek(fs.fptr + 3000);
    برای اینکه تابع در فایل pffconf.h کار کند، باید بنویسید
    #define _USE_LSEEK 1

    گزینه ها:
    افست DWORDتعداد بایت هایی است که نشانگر را به آن جابجا می کنیم.

    مقادیر برگشتی:
    FR_OK (0)- در صورت اجرای موفقیت آمیز تابع بازگردانده می شود
    FR_DISK_ERR- خطای دیسک
    FR_NOT_OPENED- فایل باز نشد

    به روش زیر می توانید داده ها را در یک فایل بنویسید.
    FATFS fs;//یک شی از نوع FATFS BYTE buff;//بافر برای خواندن فایل WORD br; // شمارنده بایت های خوانده شده // mount دیسک اگر (pf_mount(&fs) == FR_OK) ( // باز کردن فایل واقع در دایرکتوری ریشه if(pf_open("hello.txt") == FR_OK) ( // set نشانگر اولین بخش pf_lseek(0)؛ //write pf_write(buff, 10, &br)؛ //نهایی نوشتن pf_write(0, 0, &br); ) )

    من همچنین یک قطعه کد واقعاً کارآمد را در اینجا می گذارم که از تمام توابع توضیح داده شده در بالا استفاده می کند.
    #define F_CPU 8000000UL #define buff_size 10 #شامل #عبارتند از #include "diskio.h" #include "pff.h" #include "spi.h" FATFS fs;//اعلان یک شی از نوع FATFS BYTE read_buff;//بافر برای خواندن فایل BYTE write_buff = "hello word"; /// /buffer برای نوشتن در فایل UINT br; // شمارنده بایت ها خوانده شده int main(void) ( // mount disk if (pf_mount(&fs) == FR_OK) ( // باز کردن فایل در پوشه new if(pf_open("new/hello.txt") = = FR_OK) (//تنظیم نشانگر نوشتن pf_lseek(0)؛ //نوشتن pf_write(write_buff, buff_size, &br); //نهایی نوشتن pf_write(0, 0, &br)؛ //تنظیم نشانگر خواندن pf_lseek(0)؛ / /read که نوشتیم pf_read(read_buff, buff_size, &br); if(br != buff_size) ( //اگر br برابر buff_size نیست //یعنی به پایان فایل رسیده ایم) ) //mount the دیسک pf_mount (NULL)؛ ) while(1) ()

    FRESULT pf_opendir (DIR* dp، const char * مسیر)- تابع یک دایرکتوری موجود را باز می کند و یک اشاره گر به یک شی از نوع DIR ایجاد می کند که برای دریافت لیستی از فایل ها در دایرکتوری باز استفاده می شود.
    برای اینکه تابع در فایل pffconf.h کار کند، باید بنویسید
    #تعریف _USE_DIR 1

    گزینه ها:
    DIR *dp- اشاره گر به متغیری از نوع DIR.

    const char * مسیر- اشاره گر به رشته ای که حاوی مسیر دایرکتوری است، دایرکتوری ها با یک اسلش از هم جدا می شوند

    مقادیر برگشتی:
    FR_OK (0)- در صورت اجرای موفقیت آمیز تابع بازگردانده می شود
    FR_NO_PATH- نتوانستم مسیر را پیدا کنم
    FR_NOT_READY- مقداردهی اولیه دیسک ناموفق بود
    FR_DISK_ERR- خطای دیسک
    FR_NOT_ENABLED- دیسک نصب نشده است

    //اعلان متغیرهای FATFS fs; DIR dir; //mount disk pf_mount(&fs); //باز کردن دایرکتوری pf_opendir(&dir, "MY_FOLDER");

    FRESULT pf_readdir (DIR* dp، FILINFO* fno)- تابع به شما امکان می دهد محتویات دایرکتوری را بخوانید. برای این کار یک دایرکتوری با تابع ()pf_opendir باز کنید و ()pf_readdir را فراخوانی کنید. هر بار که تابع فراخوانی می شود، نام شی (پوشه/فایل) واقع در دایرکتوری مشخص شده را برمی گرداند. وقتی از تمام اشیا عبور کرد، رشته تهی را در عنصر آرایه fno.fname برمی گرداند.
    برای اینکه تابع در فایل pffconf.h کار کند، باید بنویسید
    #تعریف _USE_DIR 1

    گزینه ها:
    DIR *dp- اشاره گر به متغیری از نوع DIR که باید قبلاً اعلام شود

    FILINFO * fno- اشاره گر به متغیری از نوع FILINFO که باید قبلاً اعلام شده باشد.

    مقادیر برگشتی:
    FR_OK- تکمیل موفقیت آمیز عملکرد
    FR_DISK_ERR- خطای دیسک
    FR_NOT_OPENED- دایرکتوری باز نمی شود

    FATFS fs; پاسخ FRESULT; FILINFO fno; DIR dir; //mount disk pf_mount(&fs); //open directory res = pf_opendir(&dir, MY_FOLDER); //خواندن محتویات دایرکتوری برای(;;)( res = pf_readdir(&dir, &fno); //بررسی کنید آیا هنگام خواندن // خطایی وجود دارد یا خیر و آیا هنوز فایل‌هایی در دایرکتوری مشخص شده وجود دارد اگر ((res ! = FR_OK) || ( fno.fname == 0))( break; ) //نمایش به روشی مناسب fno.fname usart_sendStr(fno.name); usart_sendStr(/r); )

    و در نهایت، پروژه کاری را اینجا می گذارم