how to read serial stream of data [newbie]

J

Jean Dupont

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
 
R

Roy Smith

Jean Dupont said:
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.
 
J

Jean Dupont

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
 
A

Antti J Ylikoski

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.
 
P

Peter Otten

Antti said:
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:
.... "def")
[('a', 'd'), ('b', 'e'), ('c', 'f')].... "def")
'abcdef'.... 3)
6
 
H

Heiko Wundram

Am 07.02.2012 14:48, schrieb Antti J Ylikoski:
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"
 
J

Jean Dupont

Am 07.02.2012 14:48, schrieb Antti J Ylikoski:



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"

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
 
D

Dennis Lee Bieber

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)
 
A

Antti J Ylikoski

Antti said:
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:
... "def")
[('a', 'd'), ('b', 'e'), ('c', 'f')]... "def")
'abcdef'... 3)
6

Thank you for correcting me. Andy.
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top