469,332 Members | 6,650 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 469,332 developers. It's quick & easy.

Pyserial never read

Hello at all
sorry for my english but i'm Italian.
I use pyserial to communicate via rs232 with an extarnal device called
smartmouse.
I write the exact line that i want , but when i read i read only the
echo ond not the other bytes.
When i meke the same project with delphi i solve this problem with the
call of the sleep.
But in python it don't work.
Have you got some ideas for solve my problem?

Best Regards

Luca

Feb 16 '06 #1
17 7578
I don't know alot about python but I could help you with english?
eventhough it was really good

best regards-
Just

Feb 17 '06 #2
Thanks

Luca

Feb 17 '06 #3
Hello,

I'm not sure I understand precisely your question but maybe you can try
a readline and a flushinput like that:

import serial

port= 0 # or the port where you're device is connected
baudrate=9600 # or the baudrate of your device

s = serial.Serial(port, baudrate) # Open the port

for i in range(100):
s.flushInput()
line= s.readline()
print line

Feb 17 '06 #4
Thanks for your help, but it don't solve the problem.
I receive only the echo and full stop.

Many Thanks

Best Regards

Luca

Feb 18 '06 #5
luca72 <lu*******@libero.it> wrote:
Thanks for your help, but it don't solve the problem.
I receive only the echo and full stop.


Try swapping pins 2 and 3 in the lead.

--
Nick Craig-Wood <ni**@craig-wood.com> -- http://www.craig-wood.com/nick
Feb 21 '06 #6
Nick Craig-Wood wrote:
luca72 <lu*******@libero.it> wrote:
Thanks for your help, but it don't solve the problem.
I receive only the echo and full stop.


Try swapping pins 2 and 3 in the lead.


Anything's possible, but given that in his original post he says it
works when he uses Delphi, it seems unlikely making a change to the
hardware is necessary.

-Peter

Feb 21 '06 #7
luca72 wrote:
Thanks for your help, but it don't solve the problem.
I receive only the echo and full stop.


If you want help, you'll do better to post small pieces of code that you
are actually using, rather than making us guess or imagine what you are
doing. There are perhaps a dozen things that can go wrong with serial
communications, and it's not efficient for us to start suggesting them
one at a time...

-Peter

Feb 21 '06 #8
Peter Hansen <pe***@engcorp.com> wrote:
Nick Craig-Wood wrote:
luca72 <lu*******@libero.it> wrote:
Thanks for your help, but it don't solve the problem.
I receive only the echo and full stop.


Try swapping pins 2 and 3 in the lead.


Anything's possible, but given that in his original post he says it
works when he uses Delphi, it seems unlikely making a change to the
hardware is necessary.


Sorry missed that bit!

Pyserial works very well in my experience (under linux).

Serial ports are generally a pain though ;-)

--
Nick Craig-Wood <ni**@craig-wood.com> -- http://www.craig-wood.com/nick
Feb 22 '06 #9

Thanks to all for the help,

here you find the code, pls note if i use handshaking = 1 the
application don't start.
in the delphi configuratio of com port if i use or not handshaking the
application work.
Best Regards at all

Luca

import serial
import win32file
port = 2
baudrate = 38400
bytesize =serial.EIGHTBITS
parity =serial.PARITY_ODD
stopbits =serial.STOPBITS_TWO
timeout = 1
ser = serial.Serial(2, baudrate=38400, bytesize=8,
parity=serial.PARITY_ODD, stopbits=2, timeout=3)
ct = ''
ch = ''
a = self.textCtrl1.GetValue()
ind = 0
ind1 = 2
lunghezza = len(a)
while ind < lunghezza :
b = a[ind:ind1]
b = int(b,16)
b = ~b
c = ''.join([str((b >> Digit) & 1) for Digit in range(7,
-1, -1)])
c1 = c[0:4]
c2 = c[4:]
c1 = c1[3:] + c1[2:3] + c1[1:2] + c1[0:1]
c2 = c2[3:] + c2[2:3] + c2[1:2] + c2[0:1]
c1 = hex(int(c1,2))
c2 = hex(int(c2,2))
c1 = c1[2:]
c2 = c2[2:]
c = c2+c1
ct = ct + c
ind = ind + 2
ind1 = ind1 + 2
c = int(c,16)
c = chr(c)
ch = ch + c
ser.write(ch)

elf.textCtrl2.SetValue(ct)
ser.readline()

Pls.Note i hove also try with read(number of byte ) with inWaiting(),
flush etc........
But no result.

Thanks Luca

Feb 22 '06 #10
On 2006-02-22, Nick Craig-Wood <ni**@craig-wood.com> wrote:
Anything's possible, but given that in his original post he says it
works when he uses Delphi, it seems unlikely making a change to the
hardware is necessary.
Sorry missed that bit!

Pyserial works very well in my experience (under linux).


I've used it extensively under both Linux and Win32, and it
works very well under both.
Serial ports are generally a pain though ;-)


That's the truth.

--
Grant Edwards grante Yow! Somewhere in Tenafly,
at New Jersey, a chiropractor
visi.com is viewing "Leave it to
Beaver"!
Feb 22 '06 #11
Well, I think it is better to start with some simple code first.
Try to read serial port and print it out.
something like this could work:

import serial

s = serial.Serial(port=2,baudrate=38400, timeout=20)

while 1:
print s.readline()

Petr Jakes

Feb 22 '06 #12
sam
luca72 wrote:
Thanks to all for the help,

here you find the code, pls note if i use handshaking = 1 the
application don't start.
in the delphi configuratio of com port if i use or not handshaking the
application work.
Best Regards at all

Luca

import serial
import win32file
port = 2
Is port = 2 correct?
I thought that com ports under windows are designated as a string
"com1","com2",..etc.
baudrate = 38400
bytesize =serial.EIGHTBITS
parity =serial.PARITY_ODD
stopbits =serial.STOPBITS_TWO
timeout = 1
ser = serial.Serial(2, baudrate=38400, bytesize=8,
parity=serial.PARITY_ODD, stopbits=2, timeout=3)
ct = ''
ch = ''
a = self.textCtrl1.GetValue()
ind = 0
ind1 = 2
lunghezza = len(a)
while ind < lunghezza :
b = a[ind:ind1]
b = int(b,16)
b = ~b
c = ''.join([str((b >> Digit) & 1) for Digit in range(7,
-1, -1)])
c1 = c[0:4]
c2 = c[4:]
c1 = c1[3:] + c1[2:3] + c1[1:2] + c1[0:1]
c2 = c2[3:] + c2[2:3] + c2[1:2] + c2[0:1]
c1 = hex(int(c1,2))
c2 = hex(int(c2,2))
c1 = c1[2:]
c2 = c2[2:]
c = c2+c1
ct = ct + c
ind = ind + 2
ind1 = ind1 + 2
c = int(c,16)
c = chr(c)
ch = ch + c
ser.write(ch)

elf.textCtrl2.SetValue(ct)
ser.readline() You might want to try using ser.read() instead of ser.readline() as
you may not be getting linefeed carrage return characters . I usually
setup a buffer to scan for the characters I expect.

Pls.Note i hove also try with read(number of byte ) with inWaiting(),
flush etc........
But no result.

Thanks Luca


Hope this helps
Sam Schulenburg

Feb 22 '06 #13
On 2006-02-22, sam <sa******@pacbell.net> wrote:
luca72 wrote:
Thanks to all for the help,

here you find the code, pls note if i use handshaking = 1 the
application don't start.
in the delphi configuratio of com port if i use or not handshaking the
application work.
Best Regards at all

Luca

import serial
import win32file
port = 2
Is port = 2 correct?


Read the fine documentation at http://pyserial.sourceforge.net/:

Parameters for the Serial class

ser = serial.Serial(
port=None, #number of device, numbering starts at
#zero. if everything fails, the user
#can specify a device string, note
#that this isn't portable anymore
#if no port is specified an unconfigured
#an closed serial port object is created
baudrate=9600, #baudrate
bytesize=EIGHTBITS, #number of databits
parity=PARITY_NONE, #enable parity checking
stopbits=STOPBITS_ONE, #number of stopbits
timeout=None, #set a timeout value, None for waiting forever
xonxoff=0, #enable software flow control
rtscts=0, #enable RTS/CTS flow control
)
I thought that com ports under windows are designated as a string
"com1","com2",..etc.


You can use those as well, but they're non-portable.
serial.Serial(port=0) will open the first serial port on either
windows or linux.

--
Grant Edwards grante Yow! Ha ha Ha ha Ha ha
at Ha Ha Ha Ha -- When will I
visi.com EVER stop HAVING FUN?!!
Feb 22 '06 #14
sam
Thanks for the info Grant. It'll teach me not to read the documentation
:>)

Sam

Feb 22 '06 #15
Hello
ALSO... YOU NEVER SPECIFY A VARIABLE TO RECEIVE THE DATA -- ANYTHING
YOU DO READ IS BEING DUMPED ON THE FLOOR!

I see the read data with a sniffer.

with the same serial caracteristic in delphi i obtain the right answer.

I use serial writestr and serial readstr.
If the serial package is anything like regular file I/O, that
line will buffer/block until a new-line character is received, then
return data upto/including the new-line. If the inbound data has
multiple lines, you need individual readlines.

For example i i send D0360000EC the right answer is
D0360000EC0000FFBC35DC44 etc...
i need new Line?

why if i use ser.read(10) i see only the first 5 byte and not the rest,
why if i use the inwaigth i answer that i have only 5 byte to read.
Regards

Luca

Feb 23 '06 #16
Dennis Lee Bieber wrote:
dt = "D0360000EC"
print repr("".join([chr(int(dt[2*x:2*x+2],16)) for x in range(len(dt)//2)]))
'\xd06\x00\x00\xec'


By the way, for future reference, this way beats the above hands down:
import binascii
binascii.unhexlify("D0360000EC")

'\xd06\x00\x00\xec'
-Peter

Feb 23 '06 #17
Hello

i how can set with pyserial the following data?

byte delay= 40000 serial control line:
dtr = high
rts= low


Thanks Luca

Mar 2 '06 #18

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

13 posts views Thread by Bob Greschke | last post: by
5 posts views Thread by Mimi | last post: by
7 posts views Thread by alexandre_irrthum | last post: by
2 posts views Thread by Jon | last post: by
15 posts views Thread by Lone Wolf | last post: by
reply views Thread by zhoujie | last post: by
reply views Thread by suresh191 | last post: by
reply views Thread by Marylou17 | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.