fcntl, serial ports and serial signals on RS232.

Anssi Saari as at sci.fi
Thu Apr 8 17:54:10 CEST 2010

Max Kotasek <mawrman at gmail.com> writes:

> Hello to all out there,
> I'm trying to figure out how to parse the responses from fcntl.ioctl()
> calls that modify the serial lines in a way that asserts that the line
> is now changed.  For example I may want to drop RTS explicitly, and
> assert that the line has been dropped before returning.
> Here is a brief snippet of code that I've been using to do that, but
> not sure what to do with the returned response:
> def set_RTS(self, state=True):
>   if self.fd is None:
>     return 0
>   p = struct.pack('I', termios.TIOCM_RTS)
>   if state:
>     return fcntl.ioctl(self.fd, termios.TIOCMBIS, p)
>   else:
>     return fcntl.ioctl(self.fd, termios.TIOCMBIC, p)
> The problem is I get responses like '\x01\x00\x00\x00', or
> '\x02\x00\x00\x00'  and I'm not sure what they mean.

I'm not an expert in this by any means. However, I don't think that
fcntl call actually returns the port status after the bit setting. But
why not check it explicitly with termios.TIOCMGET? At least then I
seem to be able to toggle the RTS bit (bit 2) in the register. Here
are the trivial functions I used:

def set_rts(fd):
    print "Setting RTS."
    p = struct.pack('I', termios.TIOCM_RTS) 
    fcntl.ioctl(fd, termios.TIOCMBIS, p)

def clear_rts(fd):
    print "Clearing RTS."
    p = struct.pack('I', termios.TIOCM_RTS) 
    fcntl.ioctl(fd, termios.TIOCMBIC, p)

def get_status(fd):
    print "Querying RTS state."
    stat = struct.pack('I', 0)
    rc = fcntl.ioctl(fd, termios.TIOCMGET, stat)
    if struct.unpack('I', rc)[0] & termios.TIOCM_RTS:
        print "RTS bit is on."
        print "RTS bit is off."

It seems to me also that RTS is always on after the port has been
opened. I didn't dig out my voltmeter or anything to check this,

More information about the Python-list mailing list