Here’s a couple of quick tips to get around the Arduino IDE error message “Serial Port in Use.” These mostly apply to OSX, but since it is UNIX based, they may make sense for Linux as well.
List Open Files
Applies to: OSX, Linux.
The check to see if another process (like a previous run of avrdude) is holding the serial port open is easy on both Linux and OSX. Just open a terminal and run the command: lsof. The command will report back all files that are currently open by the operating system. UNIX-based operating systems do everything through files, so this command is useful to see what is keeping a serial device open. Since lsof gives a list of everything that’s open, and there are a lot of “files”, use grep to only list what is relevant.
Take a look at your Arduino IDE to see the device name assigned to your Arduino’s virtual serial port. This name will change based on what USB to Serial chip and operating system you are using. While you can use the full name like “/dev/tty.usbmodem023432” to search for the open device, I suggest just using a substring like “usbmodem“.
The format of the command is:
lsof | grep <device substring>
If nothing is returned, then that says no other processes are holding the file (or device handler) open. If one (or more) processes are returned, you can do some further investigation.
James-MBP2b:~ james$ lsof | grep usbmodem
screen 68202 james 5u CHR 33,16 0t3418 783 /dev/tty.usbmodem24131
Here we can see that the process “screen” currently has the serial port open. (Which I would expect, because I use screen in place of the Arduino Serial Monitor.) Which, by the way, looks like this on OS X:
JavaAppli 6570 james 48u CHR 33,16 0t562 783 /dev/tty.usbmodem24131
If you know the process shouldn’t have a hold on the device anymore, you can always make use of the kill command.
Applies to: OSX. (Maybe Linux)
If your installation of OSX is missing a writable lock file, you will get a Serial Port in Use error from avrdude, even though it isn’t. So if you run the lsof command from above and don’t see anything holding the port hostage, then do this quick check to see if the lock file is writable (or exists):
ls -l /var/lock
If no file exists then run these two commands:
sudo mkdir /var/lock
sudo chmod 777 /var/lock
You’ll be asked for your system password the first time (and then it is remembered for the second) because of the sudo command. You need temporary admin (root) privileges. The mkdir comamnd creates a directory or folder while the chmod command will set permissions. Feel free to click on the each of those links to verify what those commands do.
To be honest, I’m not entirely sure why this works. Personally, I do not have a lock folder and avrdude connects to my Arduino boards just fine. However, this simple fix has helped several people in the forums. Since it is pretty innacious, it might be worth an attempt!
What if it is Still Broken?
These two fixes won’t always solve the Serial port issue. If you still get the “Serial Port in Use” error even though you verified nothing else is using it, then you might want to post in the Arduino Forums for a bit more help.