how to read serial stream of data [newbie]

Discussion in 'Python' started by Jean Dupont, Feb 6, 2012.

  1. Jean Dupont

    Jean Dupont Guest

    I'd like to read in a stream of data which looks like this:
    the device sends out a byte-string of 11 bytes roughly every second:

    B0B0B0B0B03131B0B50D8A
    B0B0B0B0B03131B0B50D8A
    B0B0B031B63131B0310D8A
    B0B034B3323432B3310D8A
    B0B03237B53432B3310D8A
    ..
    ..
    ..

    As you see every string is ended by 0D8A
    How can this be accomplished in Python?


    thanks

    Jean
     
    Jean Dupont, Feb 6, 2012
    #1
    1. Advertising

  2. Jean Dupont

    Roy Smith Guest

    In article
    <>,
    Jean Dupont <> wrote:

    > I'd like to read in a stream of data which looks like this:
    > the device sends out a byte-string of 11 bytes roughly every second:
    >
    > B0B0B0B0B03131B0B50D8A
    > B0B0B0B0B03131B0B50D8A
    > B0B0B031B63131B0310D8A
    > B0B034B3323432B3310D8A
    > B0B03237B53432B3310D8A
    > .
    > .
    > .
    >
    > As you see every string is ended by 0D8A
    > How can this be accomplished in Python?


    The basic idea would be to open your datastream in binary mode
    (http://docs.python.org/library/functions.html#open), then use read(11)
    to read exactly 11 bytes into a string.

    Depending on what the 11 bytes are, you might want to use the struct
    module (http://docs.python.org/library/struct.html) to extract the data
    in a more useful form.
     
    Roy Smith, Feb 7, 2012
    #2
    1. Advertising

  3. Jean Dupont

    Jean Dupont Guest

    On 7 feb, 06:07, Roy Smith <> wrote:
    > In article
    > <>,
    >  Jean Dupont <> wrote:
    >
    > > I'd like to read in a stream of data which looks like this:
    > > the device sends out a byte-string of 11 bytes roughly every second:

    >
    > >     B0B0B0B0B03131B0B50D8A
    > >     B0B0B0B0B03131B0B50D8A
    > >     B0B0B031B63131B0310D8A
    > >     B0B034B3323432B3310D8A
    > >     B0B03237B53432B3310D8A
    > > .
    > > .
    > > .

    >
    > > As you see every string is ended by 0D8A
    > > How can this be accomplished in Python?

    >
    > The basic idea would be to open your datastream in binary mode
    > (http://docs.python.org/library/functions.html#open), then use read(11)
    > to read exactly 11 bytes into a string.
    >
    > Depending on what the 11 bytes are, you might want to use the struct
    > module (http://docs.python.org/library/struct.html) to extract the data
    > in a more useful form.


    Thank you very much for taking the time to reply. I'm really
    completely new to python and all help is really very welcome.
    In the documentation I read that to open the datastream binary I need
    to add the option b
    this is how far I got until now:
    #!/usr/bin/python
    import serial, time, os
    voltport='/dev/ttyUSB2'
    print "Enter a filename:",
    filename = raw_input()
    voltdata = open(filename,'wb')
    ser2 = serial.Serial(voltport, 2400, 8, serial.PARITY_NONE, 1,
    rtscts=0, dsrdtr=0, timeout=15)
    ser2.setDTR(level=True)
    print "State of DSR-line: ", ser2.getDSR()
    #the following line was added because I want to be sure that all
    parameters are set the same as under a working application for the
    same device
    os.system("stty -F31:0:bbb:
    0:0:0:0:0:0:0:1:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0")
    print "Opening " + ser2.portstr
    s =ser2.read(11) #read up to 11bytes
    voltdata.write(s)
    ser2.close()
    voltdata.close()

    However the above code doesn't fill my file with data, I guess the
    data should also be flushed somewhere in the code but I'm unsure where
    to do that.
    A futher consideration: because the device sends its data continuously
    I guess I'd have to use the byte sequence 0D8A of the previously sent
    data string as an indicator that the next 9 bytes are those I really
    want and put those in a string which than coudl be written to the file

    all help welcome
    Jean
     
    Jean Dupont, Feb 7, 2012
    #3
  4. On 7.2.2012 14:13, Jean Dupont wrote:
    > ser2 = serial.Serial(voltport, 2400, 8, serial.PARITY_NONE, 1,
    > rtscts=0, dsrdtr=0, timeout=15)


    In Python, if you want to continue the source line into the next text
    line, you must end the line to be continued with a backslash '\'.

    So you should write:

    ser2 = serial.Serial(voltport, 2400, 8, serial.PARITY_NONE, 1, \
    rtscts=0, dsrdtr=0, timeout=15)

    and analogously.

    Hope that this will help. Andy.
     
    Antti J Ylikoski, Feb 7, 2012
    #4
  5. Jean Dupont

    Peter Otten Guest

    Antti J Ylikoski wrote:

    > On 7.2.2012 14:13, Jean Dupont wrote:
    >> ser2 = serial.Serial(voltport, 2400, 8, serial.PARITY_NONE, 1,
    >> rtscts=0, dsrdtr=0, timeout=15)

    >
    > In Python, if you want to continue the source line into the next text
    > line, you must end the line to be continued with a backslash '\'.
    >
    > So you should write:
    >
    > ser2 = serial.Serial(voltport, 2400, 8, serial.PARITY_NONE, 1, \
    > rtscts=0, dsrdtr=0, timeout=15)
    >
    > and analogously.
    >
    > Hope that this will help. Andy.


    This is wrong. A line with an open parenthesis is continued automatically:

    >>> zip("abc",

    .... "def")
    [('a', 'd'), ('b', 'e'), ('c', 'f')]
    >>> ("abc"

    .... "def")
    'abcdef'
    >>> 1 + 2 + (

    .... 3)
    6
     
    Peter Otten, Feb 7, 2012
    #5
  6. Am 07.02.2012 14:48, schrieb Antti J Ylikoski:
    > On 7.2.2012 14:13, Jean Dupont wrote:
    >> ser2 = serial.Serial(voltport, 2400, 8, serial.PARITY_NONE, 1,
    >> rtscts=0, dsrdtr=0, timeout=15)

    >
    > In Python, if you want to continue the source line into the next text
    > line, you must end the line to be continued with a backslash '\'.


    Absolutely not true, and this is bad advice (stylistically).

    When (any form of) brackets are open at the end of a line, Python does
    not start a new command on the next line but rather continues the
    backeted content.

    So:

    ser2 = serial.Serial(voltport, 2400, 8, serial.PARITY_NONE, 1,
    rtscts=0, dsrdtr=0, timeout=15)

    is perfectly fine and certainly the recommended way of putting this.

    Adding the backslash-continuation is always _possible_, but only
    _required_ when there are no open brackets.

    So:

    x = "hello" \
    " test"

    is equivalent to:

    x = ("hello"
    " test")

    in assigning:

    x = "hello test"

    --
    --- Heiko.
     
    Heiko Wundram, Feb 7, 2012
    #6
  7. Jean Dupont

    Jean Dupont Guest

    On 7 feb, 15:04, Heiko Wundram <> wrote:
    > Am 07.02.2012 14:48, schrieb Antti J Ylikoski:
    >
    > > On 7.2.2012 14:13, Jean Dupont wrote:
    > >> ser2 = serial.Serial(voltport, 2400, 8, serial.PARITY_NONE, 1,
    > >> rtscts=0, dsrdtr=0, timeout=15)

    >
    > > In Python, if you want to continue the source line into the next text
    > > line, you must end the line to be continued with a backslash '\'.

    >
    > Absolutely not true, and this is bad advice (stylistically).
    >
    > When (any form of) brackets are open at the end of a line, Python does
    > not start a new command on the next line but rather continues the
    > backeted content.
    >
    > So:
    >
    > ser2 = serial.Serial(voltport, 2400, 8, serial.PARITY_NONE, 1,
    >                       rtscts=0, dsrdtr=0, timeout=15)
    >
    > is perfectly fine and certainly the recommended way of putting this.
    >
    > Adding the backslash-continuation is always _possible_, but only
    > _required_ when there are no open brackets.
    >
    > So:
    >
    > x = "hello" \
    >      " test"
    >
    > is equivalent to:
    >
    > x = ("hello"
    >       " test")
    >
    > in assigning:
    >
    > x = "hello test"
    >
    > --
    > --- Heiko.


    Hello to all who gave advice concerning the line continuation, in fact
    this was not a real problem but happened by accident
    copying and pasting my program lines. Advice concerning the empty file
    would of course also be very much appreciated.

    thanks,
    Jean
     
    Jean Dupont, Feb 7, 2012
    #7
  8. On Tue, 7 Feb 2012 04:13:39 -0800 (PST), Jean Dupont
    <> wrote:


    >filename = raw_input()

    Note: this may include the terminating new-line character; you
    should strip leading/ending white-space characters.

    filename = raw_input().strip()

    >ser2 = serial.Serial(voltport, 2400, 8, serial.PARITY_NONE, 1,
    >rtscts=0, dsrdtr=0, timeout=15)

    Note: this specifying NO FLOW CONTROL (your PERL example is
    activating DTR, which could be both enabling DSRDTR control, AND setting
    the DTR line high). Finally, you are specifying a 15 SECOND timeout.

    >ser2.setDTR(level=True)

    Note: here you are setting the DTR level high -- but you previously
    opened the port without enabling the use of DSRDTR. Use
    ..., dsrdtr=True, ...
    in the serial port creation.

    >print "Opening " + ser2.portstr


    ser2.name is the preferred usage; and you opened it with the
    serial.Serial() call. And for such debug output, no need for a string
    concatenation

    print "Reading", ser2.name

    >s =ser2.read(11) #read up to 11bytes


    print len(s), repr(s)

    --
    Wulfraed Dennis Lee Bieber AF6VN
    HTTP://wlfraed.home.netcom.com/
     
    Dennis Lee Bieber, Feb 7, 2012
    #8
  9. On 7.2.2012 16:02, Peter Otten wrote:
    > Antti J Ylikoski wrote:
    >
    >> On 7.2.2012 14:13, Jean Dupont wrote:
    >>> ser2 = serial.Serial(voltport, 2400, 8, serial.PARITY_NONE, 1,
    >>> rtscts=0, dsrdtr=0, timeout=15)

    >>
    >> In Python, if you want to continue the source line into the next text
    >> line, you must end the line to be continued with a backslash '\'.
    >>
    >> So you should write:
    >>
    >> ser2 = serial.Serial(voltport, 2400, 8, serial.PARITY_NONE, 1, \
    >> rtscts=0, dsrdtr=0, timeout=15)
    >>
    >> and analogously.
    >>
    >> Hope that this will help. Andy.

    >
    > This is wrong. A line with an open parenthesis is continued automatically:
    >
    >>>> zip("abc",

    > ... "def")
    > [('a', 'd'), ('b', 'e'), ('c', 'f')]
    >>>> ("abc"

    > ... "def")
    > 'abcdef'
    >>>> 1 + 2 + (

    > ... 3)
    > 6
    >
    >


    Thank you for correcting me. Andy.
     
    Antti J Ylikoski, Feb 7, 2012
    #9
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Raine Wang
    Replies:
    0
    Views:
    799
    Raine Wang
    Nov 2, 2004
  2. Benji York
    Replies:
    0
    Views:
    726
    Benji York
    Oct 11, 2005
  3. brianrpsgt1

    Read data from Serial Command

    brianrpsgt1, Oct 10, 2008, in forum: Python
    Replies:
    4
    Views:
    391
    brianrpsgt1
    Oct 11, 2008
  4. JSreeniv
    Replies:
    3
    Views:
    1,275
    backhus
    Aug 18, 2009
  5. Max Kotasek
    Replies:
    4
    Views:
    991
    Max Kotasek
    Apr 9, 2010
Loading...

Share This Page