خطاهای آپلود و رفع آنها
زنجیرهٔ آپلود آردوینو را میشناسید و خطاهای رایج avrdude را با متن دقیق پیام، علت و راهحل گامبهگام رفع میکنید.
آنچه در این درس میآموزید
- زنجیرهٔ کامپایل و avrdude و بوتلودر را توضیح دهید
- خطاهای پرتکرار آپلود را با متن دقیقشان تشخیص دهید
- چکلیست تفکیک کابل و پورت و برد و درایور را اجرا کنید
فهرست مطالب
Verify سبز شد، اما دکمهٔ Upload خطای قرمز میدهد و برنامه روی برد نمیرود. این دسته از خطاها ربطی به کد شما ندارند؛ زنجیرهٔ ارتباط بین رایانه و برد جایی شکسته است. در این درس زنجیره را میشناسید تا بدانید کجا میشکند و بعد خطای اصلی را یکییکی رفع میکنید.
آپلود چطور انجام میشود؟
وقتی Upload را میزنید سه اتفاق پشت هم میافتد:
- کامپایل — کد شما به کد ماشین ATmega ترجمه میشود (درس قبل).
- avrdude — برنامهٔ کوچکی به همین نام روی رایانه اجرا میشود و فایل ترجمهشده را از پورت سریال میفرستد.
- بوتلودر (Bootloader) — یک برنامهٔ کوچک که کارخانه داخل فلش برد نوشته است؛ avrdude به آن حرف میزند و بوتلودر بایتها را در فلش مینویسد و سپس برد ریست و برنامهٔ شما اجرا میشود.
راه ارتباطی، همان تراشهٔ تبدیل USB به سریال روی برد است (روی Uno رسمی ATmega16U2 و روی بسیاری از برد سازگار CH340). هنگام آپلود باید دو LED کوچک با نامهای TX و RX روی برد چند بار سریع چشمک بزنند؛ این دو یعنی داده در حال رفتوآمد است. اگر هنگام آپلود هیچ چشمکی ندیدید، داده اصلاً به برد نمیرسد — سرنخ مهمی است.
stk500_recv(): programmer is not responding
پیام کامل معمولاً چنین است:
avrdude: stk500_recv(): programmer is not respondingیعنی avrdude به بوتلودر سلام کرد اما جوابی نگرفت. علتها به ترتیب شیوع:
- پورت اشتباه — در Tools > Port پورت دیگری انتخاب شده است. با روش درس نصب، پورت واقعی را پیدا کنید: برد را جدا کنید، فهرست را ببینید، برد را وصل کنید و آیتم جدید را انتخاب کنید.
- برد اشتباه — Tools > Board با برد واقعی شما نمیخواند.
- کابل فقط شارژی — کابلهای ارزان فقط دو سیم تغذیه دارند و داده رد نمیشود؛ ON روشن است اما پورت اصلاً ظاهر نمیشود. کابل دیگری امتحان کنید.
- سریال مانیتور یا برنامهٔ دیگری پورت را گرفته — پورت سریال یکراهِ انحصاری است؛ مانیتور را ببندید و دوباره آپلود کنید.
- درایور نصب نیست — ادامهٔ درس را ببینید.
Board at ... is not available
اگر پورت خاکستری باشد یا آپلود با این پیام متوقف شود:
Board at COM3 is not availableیعنی IDE آن پورت را در سیستمعامل نمیبیند: کابل جدا شده، برد ریست شده یا درایور نصب نیست. کابل را عوض کنید و برد را دوباره وصل کنید تا آیتم پورت در فهرست دوباره ظاهر شود.
not in sync و butterfly_recv
دو شکل دیگرِ همین «جواب نگرفتن»:
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x00avrdude: butterfly_recv(): programmer is not respondingهیچکدام علت جدیدی ندارند؛ همان پورت یا برد یا کابل یا درایور است. butterfly_recv معمولاً وقتی ظاهر میشود که برد انتخابی با پروتکل بوتلودر واقعی برد شما فرق دارد — یعنی در Tools > Board برد دیگری انتخاب شده است. روی برد سازگار هم ممکن است بوتلودر متفاوت باشد؛ برد درست را از فهرست انتخاب کنید.
invalid device signature
اگر این را دیدید:
avrdude: invalid device signatureیعنی برد به avrdude جواب داد اما امضای تراشه با انتظارش نخواند؛ علت کلاسیکش این است که برد اشتباهی انتخاب شده (مثلاً Mega در حالی که Uno وصل است). از Tools > Board برد واقعی را انتخاب کنید. اگر با برد درست هم تکرار شد، کابل را عوض کنید و پینهای برد را بررسی کنید که چیزی روی RX و TX وصل نباشد؛ مدار وصلشده به پین ۰ و ۱ میتواند آپلود را مختل کند.
درایور CH340 روی برد سازگار
برد سازگار (Clone) اغلب بهجای ATmega16U2 تراشهٔ CH340 دارد. ویندوز بدون درایور، هیچ پورتی برایش نمیسازد؛ در IDE هم پورتی ظاهر نمیشود. راهحل: درایور CH340/CH341 را از سایت سازندهٔ آن (WCH) نصب کنید، برد را جدا و دوباره وصل کنید و در Device Manager ویندوز دنبال آیتمی مثل USB-SERIAL CH340 (COMx) بگردید. خود برد رسمی Uno به درایور جداگانه نیاز ندارد؛ درایورش همراه نصب IDE میآید.
Access is denied
در ویندوز اگر برنامهٔ دیگری پورت را نگه داشته باشد:
avrdude: ser_open(): can't open device "\\.\COM3": Access is denied.سریال مانیتور را ببندید؛ اگر باز هم شد، هر برنامهٔ دیگری که ممکن است سریال را باز کرده باشد (نرمافزارهای نمایشگر سریال یا همان پنجرهٔ مانیتور یک پنجرهٔ دیگرِ IDE) را ببندید و دوباره آپلود کنید. همین مشکل در سریال مانیتور با پیام port busy هم دیده میشود؛ رفعش یکی است.
چکلیست تفکیک گامبهگام
همین ترتیب را اجرا کنید؛ هر گام فقط یک فرض را میآزماید:
- کابل — کابل USB دادهدار دیگری بزنید (نه شارژ-فقط).
- پورت — برد را جدا و وصل کنید و پورت جدیدِ ظاهرشده را انتخاب کنید.
- برد — Tools > Board را با برد واقعی چک کنید.
- درایور — Device Manager را ببینید؛ اگر پورت نیست، درایور CH340 یا درایور رسمی را نصب کنید.
- اشغال پورت — سریال مانیتور و بقیهٔ برنامههای سریال را ببندید و دوباره آپلود کنید.
جدول مرجع سریع
| پیام یا نشانه | علت محتمل | راهحل |
|---|---|---|
avrdude: stk500_recv(): programmer is not responding |
پورت یا برد اشتباه، کابل شارژی، مانیتور باز | پورت و برد را درست کنید؛ کابل دادهدار بزنید |
Board at COM3 is not available |
کابل جدا یا درایور نصب نیست | برد را دوباره وصل کنید؛ درایور را نصب کنید |
avrdude: ... not in sync: resp=0x00 |
همان علتهای stk500_recv | چکلیست پنجگامی را اجرا کنید |
avrdude: butterfly_recv(): programmer is not responding |
برد انتخابی با بوتلودر واقعی نمیخواند | برد درست را از Tools > Board انتخاب کنید |
avrdude: invalid device signature |
برد اشتباه انتخاب شده یا تداخل روی پین ۰ و ۱ | برد را اصلاح کنید؛ مدار RX/TX را جدا کنید |
| پورتی در فهرست نیست | درایور CH340 نصب نیست | درایور CH340 را نصب و برد را دوباره وصل کنید |
avrdude: ser_open(): ... Access is denied. |
برنامهٔ دیگری پورت را گرفته | سریال مانیتور و برنامههای سریال را ببندید |
تمرینها
تمرین
تمرین ۱ — رفع خطای آپلود به ترتیب
سناریو: اسکچ شما بدون خطا کامپایل میشود، اما هنگام آپلود این پیام را میبینید: avrdude: stk500_recv(): programmer is not responding. LED روشن (ON) برد روشن است و هنگام آپلود هیچ چشمکی از TX و RX نمیبینید. پنج گام چکلیست را به همان ترتیب بنویسید و بگویید در هر گام دقیقاً چه چیزی را میآزمایید.
نمایش راهحل
ترتیب درست: (۱) کابل — LED روشن یعنی برق میرسد، اما اگر کابل فقط شارژی باشد برق میرسد و داده نه؛ کابل دادهدار دیگری امتحان میکنید. (۲) پورت — با جدا و وصل کردن برد، پورت واقعی را در Tools > Port پیدا و انتخاب میکنید. (۳) برد — مطمئن میشوید Tools > Board روی Arduino Uno است، نه برد دیگری. (۴) درایور — Device Manager را چک میکنید؛ اگر پورت اصلاً در فهرست نیست، درایور CH340 یا رسمی را نصب میکنید. (۵) اشغال پورت — سریال مانیتور و هر برنامهٔ سریال دیگری را میبندید و دوباره آپلود میکنید. نبود چشمک TX و RX یعنی داده به برد نمیرسد؛ پس گامهای ۱ و ۲ محتملترینها هستند و معمولاً همینها مشکل را حل میکنند.
:::
خلاصه
- آپلود سه حلقه دارد: کامپایل، ارسال با avrdude، نوشتن با بوتلودر؛ خطای آپلود یعنی یکی از حلقههای ارتباطی قطع است.
- چشمک TX و RX هنگام آپلود نشانهٔ رسیدن داده است؛ نبودش یعنی مشکل قبل از برد است.
- بیشتر خطاهای
not respondingوnot in syncپورت یا برد یا کابل یا درایور دارند، نه کد. - برد سازگار معمولاً به درایور CH340 از سازندهٔ WCH نیاز دارد.
Access is deniedیعنی پورت اشغال است؛ مانیتور و برنامههای سریال را ببندید.
زنجیرهٔ نرمافزار تا ارتباط، مرتب شد؛ در درس بعدی به خود برد میرویم و تغذیه و جریان را میسنجهیم.