psSerial: how to write a single byte value to the serial port?

T

Tim Hoffman

SoftwareTester said:
http://pyserial.sourceforge.net/
example shows how to write string to serial port.


#Open port 0 at "9600,8,N,1", no timeout




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
 
B

Bengt Richter

http://pyserial.sourceforge.net/
example shows how to write string to serial port.


#Open port 0 at "9600,8,N,1", no timeout


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).
'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
 
S

SoftwareTester

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

Diez B. Roggisch

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

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 'str'>

Its a string as well.
 
M

Mike Meyer

Diez B. Roggisch said:
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
 
D

Diez B. Roggisch

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

SoftwareTester

Diez B. Roggisch said:
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.

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

Grant Edwards

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

Bengt Richter

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 ;-)
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).
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)
De nada, HTH ;-)

Regards,
Bengt Richter
 

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,744
Messages
2,569,483
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top