Re: fcntl, serial ports and serial signals on RS232.

2010-04-09 Thread Max Kotasek
On Apr 8, 11:17 am, Grant Edwards inva...@invalid.invalid wrote:
 On 2010-04-07, Max Kotasek mawr...@gmail.com wrote:

  I'm trying to figure out how to parse the responses fromfcntl.ioctl()
  calls that modify the serial lines in a way that asserts that the line
  is now changed.

 Two comments:

   1) None of the Linux serial drivers I've worked on return line states
      except when you call TIOCMGET.

   2) If the TIOCMBI[S|C] call returned a 'success' value, then the
      line was set to what you requested.

 If you want to read back the state that you just wrote, you can call
 TIOCMGET, but for the output pins it's always going to return the
 last value that was written.

  For example I may want to drop RTS explicitly, and
  assert that the line has been dropped before returning.

 Call TIOCMSET.  If it doesn't return an error, then you're done.

  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:

 What returned response?

 The only thing that is returned by TIOCMBIS/TIOCMBIC is a status value
 of 0 for success and 0 for failure. IIRC, that value is checked by
 Python'sfcntl.ioctl wrapper and it will raise an exception on
 failure.

  Is someone familiar with manipulating serial signals like this in
  python?

 Yes.

  Am I even taking the right approach by using thefcntl.ioctl call?

 Yes.  When you set/clear RTS or DTR do they not go up/down?

 Even if you can't use pyserial, it's a good source for example code.

 --
 Grant Edwards               grant.b.edwards        Yow! TONY RANDALL!  Is YOUR
                                   at               life a PATIO of FUN??
                               gmail.com            


I appreciate the feedback.  I'm working in an environment with a lot
of changing factors, it's nice to have a piece not act unexpectedly.

Max

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: fcntl, serial ports and serial signals on RS232.

2010-04-08 Thread Anssi Saari
Max Kotasek mawr...@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.
else:
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,
though.
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: fcntl, serial ports and serial signals on RS232.

2010-04-08 Thread Grant Edwards
On 2010-04-07, Max Kotasek mawr...@gmail.com wrote:

 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.

Two comments:

  1) None of the Linux serial drivers I've worked on return line states
 except when you call TIOCMGET.

  2) If the TIOCMBI[S|C] call returned a 'success' value, then the
 line was set to what you requested.

If you want to read back the state that you just wrote, you can call
TIOCMGET, but for the output pins it's always going to return the 
last value that was written.

 For example I may want to drop RTS explicitly, and
 assert that the line has been dropped before returning.

Call TIOCMSET.  If it doesn't return an error, then you're done.

 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:

What returned response?

The only thing that is returned by TIOCMBIS/TIOCMBIC is a status value
of 0 for success and 0 for failure. IIRC, that value is checked by
Python's fcntl.ioctl wrapper and it will raise an exception on
failure.

 Is someone familiar with manipulating serial signals like this in
 python?

Yes.

 Am I even taking the right approach by using the fcntl.ioctl call?

Yes.  When you set/clear RTS or DTR do they not go up/down?

Even if you can't use pyserial, it's a good source for example code.

-- 
Grant Edwards   grant.b.edwardsYow! TONY RANDALL!  Is YOUR
  at   life a PATIO of FUN??
  gmail.com
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: fcntl, serial ports and serial signals on RS232.

2010-04-08 Thread Grant Edwards
On 2010-04-08, Anssi Saari a...@sci.fi wrote:

 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,
 though.

IIRC, that's generally true: RTS and DTR are both set to on by the
tty layer's open() handler _if_ the device's useage count was 0.  If
you open an already open port, then the RTS and DTR lines are left
alone.

-- 
Grant Edwards   grant.b.edwardsYow! Someone in DAYTON,
  at   Ohio is selling USED
  gmail.comCARPETS to a SERBO-CROATIAN
-- 
http://mail.python.org/mailman/listinfo/python-list


fcntl, serial ports and serial signals on RS232.

2010-04-07 Thread Max Kotasek
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 tried doing
illogical things like settings CTS using the TIOCM_CTS flag and I end
up just getting back a slightly different binary packed 32 bit integer
(in that case '\x20\x00\x00\x00').  The above example has self.fd
being defined as os.open('/dev/ttyS0', os.O_RDWR | os.O_NONBLOCK).

Is someone familiar with manipulating serial signals like this in
python?  Am I even taking the right approach by using the fcntl.ioctl
call?  The environment is a ubuntu 8.04 distribution.  Unfortunately
due to other limitations, I can't use/extend pyserial, though I would
like to.

I appreciate any advice on this matter,
Max
-- 
http://mail.python.org/mailman/listinfo/python-list