Discussion:
psSerial: how to write a single byte value to the serial port?
Tim Hoffman
2004-11-17 09:08:42 UTC
Permalink
http://pyserial.sourceforge.net/
example shows how to write string to serial port.
#Open port 0 at "9600,8,N,1", no timeout
import serial
ser = serial.Serial(0) #open first serial
ser.write("hello") #write a string
ser.close() #close port
how do i write a single byte value to the serial port?
mystring = "hello"
ser.write(mystring[0:1])

or

ser.write("h")

or

ser.write(chr(i)) # where 0<=i<=255

Is that what you where asking for ?

T
SoftwareTester
2004-11-17 08:57:23 UTC
Permalink
http://pyserial.sourceforge.net/
example shows how to write string to serial port.


#Open port 0 at "9600,8,N,1", no timeout
import serial
ser = serial.Serial(0) #open first serial
ser.write("hello") #write a string
ser.close() #close port
how do i write a single byte value to the serial port?
SoftwareTester
2004-11-18 03:09:26 UTC
Permalink
I assume the string print ser.write() will append null characters to the
end.
Why do you assume that? Its not said anywhere, and its wrong. A string
consists only of the characters you can "see" - if python usues C
convention for 0-termination or othear means is an implementation detail
none of your concern.
byte = chr(0x40)
ser.write(byte)
type(byte)
<type 'str'>
Its a string as well.
I am concerned because I do not know the effect of writing null
character to the device connected to the serial byte.

I wish to send a single byte to the serial port and nothing more.

Thanks.
Bengt Richter
2004-11-18 06:43:11 UTC
Permalink
Post by SoftwareTester
Post by SoftwareTester
I assume the string print ser.write() will append null characters to the end.
Why do you assume that? Its not said anywhere, and its wrong. A string
consists only of the characters you can "see" - if python usues C
convention for 0-termination or othear means is an implementation detail
none of your concern.
BZZT! (as Mike pointed out ;-) What do you mean "see"?
... print
... for bot4 in xrange(16):
... rep = repr(chr(top4<<4|bot4))[1:-1]
... print '%4s'%(rep,),
...

\x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \t \n \x0b \x0c \r \x0e \x0f
\x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1a \x1b \x1c \x1d \x1e \x1f
! " # $ % & ' ( ) * + , - . /
0 1 2 3 4 5 6 7 8 9 : ; < = > ?
@ A B C D E F G H I J K L M N O
P Q R S T U V W X Y Z [ \\ ] ^ _
` a b c d e f g h i j k l m n o
p q r s t u v w x y z { | } ~ \x7f
\x80 \x81 \x82 \x83 \x84 \x85 \x86 \x87 \x88 \x89 \x8a \x8b \x8c \x8d \x8e \x8f
\x90 \x91 \x92 \x93 \x94 \x95 \x96 \x97 \x98 \x99 \x9a \x9b \x9c \x9d \x9e \x9f
\xa0 \xa1 \xa2 \xa3 \xa4 \xa5 \xa6 \xa7 \xa8 \xa9 \xaa \xab \xac \xad \xae \xaf
\xb0 \xb1 \xb2 \xb3 \xb4 \xb5 \xb6 \xb7 \xb8 \xb9 \xba \xbb \xbc \xbd \xbe \xbf
\xc0 \xc1 \xc2 \xc3 \xc4 \xc5 \xc6 \xc7 \xc8 \xc9 \xca \xcb \xcc \xcd \xce \xcf
\xd0 \xd1 \xd2 \xd3 \xd4 \xd5 \xd6 \xd7 \xd8 \xd9 \xda \xdb \xdc \xdd \xde \xdf
\xe0 \xe1 \xe2 \xe3 \xe4 \xe5 \xe6 \xe7 \xe8 \xe9 \xea \xeb \xec \xed \xee \xef
\xf0 \xf1 \xf2 \xf3 \xf4 \xf5 \xf6 \xf7 \xf8 \xf9 \xfa \xfb \xfc \xfd \xfe \xff

All 256 accounted for ;-)
Post by SoftwareTester
Post by SoftwareTester
byte = chr(0x40)
ser.write(byte)
type(byte)
<type 'str'>
Its a string as well.
I am concerned because I do not know the effect of writing null
character to the device connected to the serial byte.
There should not be a null character passed to the device unless you
explicitly put it in the string data itself, e.g., '\x40\x00' is chr(0x40)
followed by a null byte in a 2-byte string. There is no additional terminating byte.

This does mean that if you do pass a string like 'one\x00two' and access it
as a C string, you will just see the first part. OTOH, you could pass a typical
C string _list_ ended by a null C string like 'one\x00two\x00three\x00\x00' (that
last \x00 is the null string).
Post by SoftwareTester
I wish to send a single byte to the serial port and nothing more.
Did you try ser.write(byte) as above? What happened?

ser.write('\x40')

should be the equivalent of

byte = chr(0x40)
ser.write(byte)
Post by SoftwareTester
Thanks.
De nada, HTH ;-)

Regards,
Bengt Richter
Grant Edwards
2004-11-18 03:44:57 UTC
Permalink
Post by SoftwareTester
type(byte)
<type 'str'>
Its a string as well.
I am concerned because I do not know the effect of writing null
character to the device connected to the serial byte.
I don't understand what you're concerned about. Python doesn't
use null-delimited strings.
Post by SoftwareTester
I wish to send a single byte to the serial port and nothing more.
In Python, a "single byte" is just a string of length one.
--
Grant Edwards grante Yow! Eisenhower!! Your
at mimeograph machine upsets
visi.com my stomach!!
SoftwareTester
2004-11-17 19:53:57 UTC
Permalink
Thanks for the reply.

I want to write a single byte with hex representation 0x40 to the serial port
-- just a single byte.

I assume the string print ser.write() will append null characters to the end.

Maybe the chr() will write only a single byte and nothing more.

I will try

byte = chr(0x40)
ser.write(byte)
http://pyserial.sourceforge.net/
example shows how to write string to serial port.
#Open port 0 at "9600,8,N,1", no timeout
import serial
ser = serial.Serial(0) #open first serial
ser.write("hello") #write a string
ser.close() #close port
how do i write a single byte value to the serial port?
How is your single byte represented? A hex representation of the
_numeric_ code for a single character? E.g., you may need to convert
to a character string of length one (which the chr function does)
in order to pass it to ser.write (which apparently accepts the
5-char string "hello" all right).
65
65
chr(65)
'A'
0x41
65
chr(0x41)
'A'
thus, perhaps something like
ser.write(chr(0x41))
or
byte = chr(0x41)
ser.write(byte)
(Untested, just judging from the example outputting "hello" above ;-).
Regards,
Bengt Richter
Mike Meyer
2004-11-17 20:49:25 UTC
Permalink
Post by SoftwareTester
I assume the string print ser.write() will append null characters to the end.
Why do you assume that? Its not said anywhere, and its wrong. A string
consists only of the characters you can "see" - if python usues C
convention for 0-termination or othear means is an implementation detail
none of your concern.
Actually, it is of my concern. I need to know whether I can put null
bytes in a string or not. If Python used the C convention, I
couldn't. Since it doesn't, I can.

<mike
--
Mike Meyer <mwm at mired.org> http://www.mired.org/home/mwm/
Independent WWW/Perforce/FreeBSD/Unix consultant, email for more information.
Diez B. Roggisch
2004-11-17 21:10:53 UTC
Permalink
Post by Mike Meyer
Actually, it is of my concern. I need to know whether I can put null
bytes in a string or not. If Python used the C convention, I
couldn't. Since it doesn't, I can.
You are right. I should have thought about that, as otherwise the struct
module would be not so easy usable.
--
Regards,

Diez B. Roggisch
Diez B. Roggisch
2004-11-17 20:01:06 UTC
Permalink
Post by SoftwareTester
I assume the string print ser.write() will append null characters to the end.
Why do you assume that? Its not said anywhere, and its wrong. A string
consists only of the characters you can "see" - if python usues C
convention for 0-termination or othear means is an implementation detail
none of your concern.
Post by SoftwareTester
byte = chr(0x40)
ser.write(byte)
type(byte)
<type 'str'>

Its a string as well.
--
Regards,

Diez B. Roggisch
Bengt Richter
2004-11-17 11:08:52 UTC
Permalink
http://pyserial.sourceforge.net/
example shows how to write string to serial port.
#Open port 0 at "9600,8,N,1", no timeout
import serial
ser = serial.Serial(0) #open first serial
ser.write("hello") #write a string
ser.close() #close port
how do i write a single byte value to the serial port?
How is your single byte represented? A hex representation of the
_numeric_ code for a single character? E.g., you may need to convert
to a character string of length one (which the chr function does)
in order to pass it to ser.write (which apparently accepts the
5-char string "hello" all right).
65
65
chr(65)
'A'
0x41
65
chr(0x41)
'A'

thus, perhaps something like

ser.write(chr(0x41))

or

byte = chr(0x41)
ser.write(byte)

(Untested, just judging from the example outputting "hello" above ;-).

Regards,
Bengt Richter

Loading...