Search code examples
pythonserial-portpyserialuartraspberry-pi3

'Serial' object has no attribute 'is_open'


I've been using code on my RPi2 to communicate to an RS485 Shield to drive various relays. I recently got a RPi3, and the code that has previously worked on the RPi2 has an error on the RPi3.

To begin with, I know that the uart (/dev/ttyAMA0) is "stolen" on the RPi3 for the bluetooth controller. Using this post, I reassigned the uart to the GPIO header so the RS485 shield should work as before. I give you this history, even though I suspect the problem is not with the hardware per se.

Here's the problem. When I execute the code below on the RPi3, I get an error:

Traceback (most recent call last):
  File "serialtest.py", line 15, in <module>
    if usart.is_open:
AttributeError: 'Serial' object has no attribute 'is_open' 

Obviously, within the pySerial library, the serial object DOES have the 'is_open' attribute. Any suggestions on why this error is thrown? I haven't found any references to this specific error in web searches.

#!/usr/bin/env python

import serial
import time
import binascii


data = "55AA08060100024D5E77"
usart = serial.Serial ("/dev/ttyAMA0",19200)
usart.timeout = 2
message_bytes = data.decode("hex")
try:
    usart.write(message_bytes)
    #print usart.is_open  # True for opened
    if usart.is_open:
        time.sleep(0.5)
        size = usart.inWaiting()
        if size:
            data = usart.read(size)
            print binascii.hexlify(data)
        else:
            print('no data')
    else:
        print('usart not open')
except IOError as e :
    print("Failed to write to the port. ({})".format(e))

Solution

  • If you have an old version of pyserial on the Raspberry Pi, pyserial might not have the is_open, but isOpen() method instead. The isOpen() method was depricated in version 3.0 according to the documentation. You can check the pyserial version with serial.VERSION.