9

I am trying to write a program in Python that will loop to keep checking the serial port (COM4) and print out a message when the character "1" is read from the serial port. I want to send "1" over the serial port from an Arduino gadget upon the push of a button.

However, I get the error "[Error 5]: Access is Denied" when I try to create an instance of a serial object. (It automatically tries to open upon instantiation, which is where the error is, from what I can see from the file in the PySerial package that handles this.)

My code:

c = serial.Serial('COM4', 9600)
while True:
    signal = c.read()
    print signal
    print "running"
    time.sleep(2)
    c.flushOutput()

It never gets past the "c = serial.Serial('COM4', 9600), though. That's where the error pops up. How can I fix this?

Charles
  • 50,943
  • 13
  • 104
  • 142
TomKo
  • 129
  • 1
  • 1
  • 8

7 Answers7

8

For me the solution didn't work but what worked was closing all the applications that were interacting with the given com port.

Lucas B
  • 338
  • 4
  • 14
  • Good answer IMO: when developing for Arduino, it's rather common to have the Arduino IDE running, but this makes `serial` unable to access the port. – Right leg Apr 18 '17 at 08:45
  • Duh! Of course that's what I was missing. You cannot have two applications open a serial port at the same time. – Adrian Theodorescu May 20 '20 at 17:48
3

UPDATE: This is apparently no longer possible in PySerial 3.0.

Under Windows, I've always used the port=<int> approach with success.

I.e. change your code to:

c = serial.Serial(3, 9600)
David K. Hess
  • 16,632
  • 2
  • 49
  • 73
  • Wow, this works! Thank you so much! Why does this work though? How does the number 3 indicate 'COM4'? – TomKo Nov 28 '11 at 03:29
  • The port parameter can be either a string or a number. When a number under Windows, it's the zero-based COM port. So, 0 is COM1 and 3 is COM4. It's possible "COM4:" would work also, but I've never tried it. – David K. Hess Nov 28 '11 at 03:35
  • Well, http://stackoverflow.com/questions/5602349/problem-reading-data-from-serial-port-com3-using-pyserial-module-on-windows-xp implies that "COM4" should work. Googling turns up potential issues with the names of virtual serial ports. I guess port= works around those naming issues. – David K. Hess Nov 28 '11 at 03:41
  • 3
    **ValueError: "port" must be None or a string, not ** – dsgdfg Jul 29 '20 at 20:16
2

Please, take care with the python versions.

From the pyserial manual about: class serial.Serial https://pyserial.readthedocs.io/en/latest/pyserial_api.html#classes

...........

The port is immediately opened on object creation, when a port is given. It is not opened when port is None and a successive call to open() is required.

port is a device name: depending on operating system. e.g. /dev/ttyUSB0 on GNU/Linux or COM3 on Windows.

............

Changed in version 3.0: numbers as port argument are no longer supported

Dhomo
  • 61
  • 5
1

For Python 2.6 use the zero-based COM port index. For Python 2.7.x you can use the full name "COM4". From my experience it's better to use the 2.7 version. Install Python 2.7.x and Setup Tools (aka Easy Install). Once you've got this, install pyserial module by typing easy_install -U pyserial (see pyserial installation doc).

Remember to add python path to PATH environmental variable.

Jakub Czaplicki
  • 1,787
  • 2
  • 28
  • 50
1

that works with PORT COM N-1 in python (N is your number of COM)

1

Close your serial monitor, opened from Arduino IDE.

0
    At one time, there is only an application that can access one com port. If application A is accessing this com port, application B can not access it. You should do these following steps as below:
    1. Find the application that is accessing this port and then close the connection.
    2. Reconnect your application to this port. You can use the below source code.
    
     port='COM8',
 baudrate = 2400,
 parity=serial.PARITY_EVEN,
 stopbits=serial.STOPBITS_ONE,
 bytesize=serial.SEVENBITS,
 timeout=None
)

while 1:
 x = ser.readline()
 print(x)