Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

"Access is denied" error when uploading to board w/ FT232 USB chip with Serial Monitor/Plotter open #1783

Open
3 tasks done
maciejmiklas opened this issue Dec 23, 2022 · 16 comments · Fixed by #2334
Open
3 tasks done
Assignees
Labels
topic: code Related to content of the project itself type: imperfection Perceived defect in any part of project

Comments

@maciejmiklas
Copy link

maciejmiklas commented Dec 23, 2022

Describe the problem

In order to upload to an Arduino board via a serial port, the upload tool (e.g., AVRDUDE) must be able to open the port. This is not possible if another process already has control of the port.

Arduino IDE's "Serial Monitor" and and "Serial Plotter" components also use the serial port of the board. Arduino IDE handles this potential conflict of port usage automagically by closing the port in Serial Monitor/Plotter when an upload process is triggered, then opening it again after the upload is finished. This means no special action is needed from the user to upload while Serial Monitor/Plotter is open.

🐛 The upload fails with an "Access is denied" error under the following conditions:

  • The board uses an FTDI FT232R USB chip
  • Arduino IDE is running on a Windows machine
  • Serial Monitor or Serial Plotter is open

I've been using Arduino IDE 2.0.3 with Nano without issues when uploading on Ubuntu. Now I've tried it on Windows 11, and most of the time, it gives me this error:

avrdude: Version 6.3-20190619
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch

         System wide configuration file is "C:\Users\macie\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino17/etc/avrdude.conf"

         Using Port                    : COM5
         Using Programmer              : arduino
         Overriding Baud Rate          : 115200
avrdude: ser_open(): can't open device "\\.\COM5": Access is denied.

But I can see logs from the serial monitor in Arduino IDE -> serial monitor.

To reproduce

Equipment

A board or other device that has an FTDI FT232R USB chip

The classic Arduino Nano is a common board that uses this chip.

FT232R modules (example) or cables (example) are also often used to upload to boards such as the Arduino Pro Mini that don't have an integrated USB chip.

The fault can be reproduced even if the FT232R-based device is not an Arduino board. In this case, the upload is expected to fail, but it would fail with a "not in sync" error instead of "Access is denied".

Steps

  1. Select File > New Sketch from the Arduino IDE menus.
  2. Connect the Arduino board to your computer.
  3. Select the board and port from the Arduino IDE menus.
  4. If the Serial Monitor view is not already open, select Tools > Serial Monitor from the Arduino IDE menus to open it.
  5. Select Sketch > Upload from the Arduino IDE menus.
  6. Wait for the upload process to finish.
    🐛 The upload fails:
    avrdude: Version 6.3-20190619
             Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
             Copyright (c) 2007-2014 Joerg Wunsch
    
             System wide configuration file is "C:\Users\macie\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino17/etc/avrdude.conf"
    
             Using Port                    : COM5
             Using Programmer              : arduino
             Overriding Baud Rate          : 115200
    avrdude: ser_open(): can't open device "\\.\COM5": Access is denied.
    
  7. Click the X icon on the "Serial Monitor" view tab in the bottom panel.
  8. Select Sketch > Upload from the Arduino IDE menus.
  9. Wait for the upload process to finish.
    🙂 The upload is successful.
  10. Select Tools > Serial Plotter from the Arduino IDE menus.
  11. Select Sketch > Upload from the Arduino IDE menus.
  12. Wait for the upload process to finish.
    🐛 The upload fails:
    avrdude: Version 6.3-20190619
             Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
             Copyright (c) 2007-2014 Joerg Wunsch
    
             System wide configuration file is "C:\Users\macie\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino17/etc/avrdude.conf"
    
             Using Port                    : COM5
             Using Programmer              : arduino
             Overriding Baud Rate          : 115200
    avrdude: ser_open(): can't open device "\\.\COM5": Access is denied.
    
  13. Close the "Serial Plotter" window.
  14. Select Sketch > Upload from the Arduino IDE menus.
  15. Wait for the upload process to finish.
    🐛 The upload fails:
    avrdude: Version 6.3-20190619
             Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
             Copyright (c) 2007-2014 Joerg Wunsch
    
             System wide configuration file is "C:\Users\macie\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino17/etc/avrdude.conf"
    
             Using Port                    : COM5
             Using Programmer              : arduino
             Overriding Baud Rate          : 115200
    avrdude: ser_open(): can't open device "\\.\COM5": Access is denied.
    
    This unexpected result is caused by a separate bug: Port left open after closing Serial Plotter #1423

Expected behavior

Serial Monitor and Serial Plotter do not interfere with upload process.

Arduino IDE version

Original report

2.0.3

Last verified with

2.3.3

Operating system

Windows

Operating system version

Edition Windows 11 Pro
Version 22H2
Installed on 07/11/2022
OS build 22621.963
Experience Windows Feature Experience Pack 1000.22638.1000.0

Additional context

I bisected the introduction of the fault to df8658e


Logs generated from an upload that fails with this fault using the build for 053574b with the arduino.cli.daemon.debug advanced setting set to true:

2023-08-16_log.log


I have no problems uploading sketches on Arduino IDE 1.8.19 from Microsoft Store on the same system. I can quit 2.0.3, start 1.8.19, and it's working immediately.


I cannot reproduce the fault on Linux (Ubuntu 22.04) or macOS (Ventura).


I cannot reproduce the fault when using native USB boards (e.g., Leonardo, MKR) or boards that use other models of dedicated USB chip (e.g., ATmega16U2 on Uno and Mega, WCH CH340 on derivative boards).

Workaround

Serial Monitor
  1. Click the X icon on the "Serial Monitor" tab in the bottom panel of the Arduino IDE window to close the tab:
    image
  2. Upload the sketch.
  3. Open Serial Monitor again if needed (by clicking the icon on the IDE toolbar or the Tools > Serial Monitor menu item) after the upload is finished.

Serial Plotter
  1. Close the "Serial Plotter" window.
  2. If the "Serial Monitor" view is not already open, select Tools > Serial Monitor from the Arduino IDE menus to open it.
    We must do an open/close cycle on Serial Monitor as a workaround for a bug in Serial Plotter
  3. Click the X icon on the "Serial Monitor" tab in the bottom panel of the Arduino IDE window to close the tab:
    image
  4. Upload the sketch.
  5. Open Serial Monitor and/or Serial Plotter again if needed after the upload is finished.

Additional reports

Related

Issue checklist

  • I searched for previous reports in the issue tracker
  • I verified the problem still occurs when using the latest nightly build
  • My report contains all necessary details
@per1234 per1234 transferred this issue from arduino/Arduino Dec 23, 2022
@per1234 per1234 added the type: imperfection Perceived defect in any part of project label Jan 1, 2023
@Wezz19
Copy link

Wezz19 commented Jan 9, 2023

Not sure if it's actuality related to your problem, but I got this after I had changed the COM port in device manager. After rebooting the computer I could use the COM port normally again.

Is this still happening for you?

@maciejmiklas
Copy link
Author

Yes, I can work for several hours on 1.8 without a single issue, and this problem occurs immediately after switching to 2.0

@per1234
Copy link
Contributor

per1234 commented Jan 26, 2023

Hi @maciejmiklas. Thanks for your report.

Does the error still occur if you close the Serial Monitor tab in the bottom panel of the Arduino IDE window before uploading?

You can do that by clicking the X icon on the tab:

image

Arduino IDE automatically closes the port in Serial Monitor and Serial Plotter when uploading, so this should not be necessary. I'm only trying to determine the exact conditions the fault occurs under.

@per1234 per1234 self-assigned this Jan 26, 2023
@per1234 per1234 added topic: code Related to content of the project itself status: waiting for information More information must be provided before work can proceed labels Jan 26, 2023
@maciejmiklas
Copy link
Author

I did that and have had no problems so far.

@per1234 per1234 removed the status: waiting for information More information must be provided before work can proceed label Jan 27, 2023
@per1234
Copy link
Contributor

per1234 commented Jan 27, 2023

Thanks for checking @maciejmiklas.

I am able to reproduce this fault, but only under specific conditions (FT232 chip, Windows, using Serial Monitor/Plotter) and I wanted to make sure the fault you are experiencing also depends on those conditions.

Knowing the required conditions and being able to reproduce it should make the preparation and validation of a fix for the bug much easier.

@per1234 per1234 changed the title Access is denied for com port on Windows 11 with Nano "Access is denied" error when uploading to board w/ FT232 USB chip with Serial Monitor/Plotter open Jan 27, 2023
@maciejmiklas
Copy link
Author

I do not have this problem with the original UNO, only when using a custom board with USB->Serial adapter:

IMG_3680

@ananzjo

This comment was marked as off-topic.

@per1234

This comment was marked as off-topic.

@jenschr
Copy link

jenschr commented Jun 30, 2023

I just spent an evening helping a non-technical person (cosplayer) finding a solution to this problem. Closing the Serial Monitor or installing an older version of the IDE does the trick. This person was on Win 11 using Arduino 2.1.0 IDE with an original Arduino Nano. This is a very common setup, so this will affect many users.

It puzzles me a bit that this bug still has not been assigned to a milestone given that it was reported 6+ months ago. Are there problems reproducing it? Anything I can do to help resolve it?

@kittaakos kittaakos self-assigned this Aug 16, 2023
@kittaakos
Copy link
Contributor

I investigated, and the problem cannot be fixed without CLI changes/support.

IDE2 creates a gRPC bidirectional stream via the Monitor method.

BeforeIDE2 does an upload, all related monitor connections are closed. IDE2 closes the monitor connection by ending the bidirectional stream and waiting for the OK signal:

this.duplex.on('end', resolve);

I see a race condition; if I put a breakpoint into the code after closing the bidirectional stream (and let the OS clean up the resources), I do not have the access is denied error.

2023-08-18T14:19:15.694Z daemon INFO time="2023-08-18T16:19:15+02:00" level=info msg="sending command" command=CLOSE monitor=serial-monitor
2023-08-18T14:19:15.705Z daemon INFO time="2023-08-18T16:19:15+02:00" level=info msg="received message" error=false event_type=close message=OK monitor=serial-monitor
2023-08-18T14:19:15.707Z daemon INFO time="2023-08-18T16:19:15+02:00" level=info msg="sending command" command=QUIT monitor=serial-monitor
time="2023-08-18T16:19:15+02:00" level=info msg="received message" error=false event_type=quit message=OK monitor=serial-monitor
2023-08-18T14:19:15.710Z daemon INFO time="2023-08-18T16:19:15+02:00" level=info msg="Killing monitor process" monitor=serial-monitor
2023-08-18T14:19:15.711Z daemon INFO time="2023-08-18T16:19:15+02:00" level=error msg="Sent kill signal" error="TerminateProcess: Access is denied." monitor=serial-monitor
2023-08-18T14:19:15.719Z daemon INFO time="2023-08-18T16:19:15+02:00" level=error msg="stopped decode loop: EOF" monitor=serial-monitor
2023-08-18T14:19:15.736Z daemon INFO time="2023-08-18T16:19:15+02:00" level=info msg="Monitor process killed" monitor=serial-monitor
monitor_access_is_denied.mp4

CLI should provide a way to terminate the monitor connection gracefully. Calling this API and receiving an OK ack means the port is free.

This is what is happening:

  • client (IDE2) ends the stream
  • server (CLI) receives the end of the stream, kills the monitor process
  • the stream is already closed on the client, it does not wait for the server, the server is still killing the processes (maybe),
  • the client starts an upload
  • 💥

This is what should happen:

  • client (IDE2) send a STOP request via the open bidirectional stream,
  • server receives the STOP request (the server is allowed to ignore any other requests received after the STOP) and closes the monitor,
  • server sends a STOP ACK equivalent,
  • client ends the connection,
  • server receives the end of stream (noop, the monitor process is already killed)

This is just one of the possible solutions, but the main idea is that IDE2 or any other CLI client might need this way of terminating the monitor.

@per1234
Copy link
Contributor

per1234 commented Aug 19, 2023

Thanks for taking the time to make an investigation @kittaakos! I am sorry it wasn't so simple as I had hoped.

Since you are now most familiar with the problem and the work that will be required to resolve it, would you mind reporting this to the Arduino CLI developers by submitting an issue to their repo when you get the time?

If work is needed in both the Arduino IDE and Arduino CLI codebases, then I would suggest we keep this one here to track the Arduino IDE work and create a separate one in the Arduino CLI repo to track the work needed on that codebase.

@ubidefeo
Copy link

@kittaakos , I agree with @per1234

Please, report to the CLI team and let's do things right even if it shifts development a little.
This is something that should be addressed in the next release :)

@per1234 per1234 added the status: blocked Progress on this prevented by an external cause label Aug 21, 2023
kittaakos pushed a commit that referenced this issue Aug 24, 2023
@kittaakos kittaakos removed the status: blocked Progress on this prevented by an external cause label Feb 5, 2024
@kittaakos kittaakos added the conclusion: resolved Issue was resolved label Feb 20, 2024
@per1234
Copy link
Contributor

per1234 commented Feb 26, 2024

Unfortunately it was not fixed by #2334. I am still able to reproduce the fault using aa9b10d.

@per1234 per1234 reopened this Feb 26, 2024
@jmcsch7

This comment was marked as off-topic.

@per1234

This comment was marked as off-topic.

@samohd

This comment was marked as duplicate.

@arduino arduino locked as too heated and limited conversation to collaborators Jun 28, 2024
@per1234 per1234 removed the conclusion: resolved Issue was resolved label Sep 25, 2024
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
topic: code Related to content of the project itself type: imperfection Perceived defect in any part of project
Projects
None yet
9 participants