Pythonはpyserialでシリアルポート操作を制御する

7267 ワード

シリアルポートでデータを読み書きしたい場合は、ロボットや伝送などのハードウェアデバイスと付き合うのが一般的です.
センサー
Pythonに内蔵されたI/Oモジュールを使用してこのタスクを完了できますが、シリアル通信に最適なオプションです.
pySerialパッケージを使用しています.このパッケージの使用は非常に簡単で、pySerialをインストールして、次のようなコードを使用します.
シリアルポートを簡単に開くことができます.
一、pythonでシリアルポートを操作するには、まず関連モジュールをダウンロードする必要がある.
 pyserial (http://pyserial.wiki.sourceforge.net/pySerial)

 pywin32 (http://sourceforge.net/projects/pywin32/)
import serial
ser = serial . Serial('/dev/tty.usbmodem641', # Device name varies
                      baudrate = 9600,
                      bytesize = 8,
                      parity = 'N',
                      stopbits = 1)

デバイス名は、異なるデバイスとオペレーティングシステムで異なります.例えば、Windowsシステムでは、0,1などのデバイスを使用して、通信側「COM 0」と「COM 1」を開くことができます.ポートが開くと、read()、readline()、write()関数を使用してデータを読み書きできます.
二、十六進数表示
       16進数表示の本質は、受信した文字を対応するASCIIコードに変換し、ASCIIコード値を16進数に変換して表示することで、特殊文字を表示することができます.ここではhexShow(argv)などの関数を定義し、コードは以下の通りです.
[python] view plain copy
import serial  
  
def hexShow(argv):  
    result = ''  
    hLen = len(argv)  
    for i in xrange(hLen):  
        hvol = ord(argv[i])  
        hhex = '%02x'%hvol  
        result += hhex+' '  
    print 'hexShow:',result  
  
t = serial.Serial('com12',9600)  
print t.portstr  
strInput = raw_input('enter some words:')  
n = t.write(strInput)  
print n  
str = t.read(n)  
print str  
hexShow(str) 


3,16進送信
16進数送信は実質的に16進数フォーマットを送信する文字列であり、例えば'xaa','x 0 b'である.ポイントは、1つの文字列を16進数のフォーマットに変換する方法で、2つのエラーがあります.
1)'x'+'aa'はできません.エスケープ反スラッシュに関連しています.
2)'\x'+'aa'とr'x'+'aa'でもいけません.このような印刷結果はxaaですが、変数に与えられる値は'\xaa'です.
 ここでdecode関数を用いて、
[python] view plain copy
list='aabbccddee'  
hexer=list.decode("hex")  
print  hexer  
文字列listの長さが奇数の場合、decodeはエラーを報告し、実際の状況に応じて文字列のスライス操作で文字列の先頭または末尾に'0'を追加することができることに注意してください.
 
シリアル・アシスタントで文字列「abc」を16進数で送信した場合、pythonで「self.l_serial.write(」x 61x 62x 63")を操作します.
もちろん、もう一つの方法があります.
[python] view plain copy
strSerial = "abc"  
strHex = binascii.b2a_hex(strSerial)  
#print strHex  
strhex = strHex.decode("hex")  
#print strhex  
self.l_serial.write(strhex);  

Short introduction
Open port 0 at "9600,8,N,1", no timeout 
>>> import serial
>>> ser = serial.Serial(0)  # open first serial port
>>> print ser.portstr       # check which port was really used
>>> ser.write("hello")      # write a string
>>> ser.close()             # close port

Open named port at "19200,8,N,1", 1s timeout 
>>> ser = serial.Serial('/dev/ttyS1', 19200, timeout=1)
>>> x = ser.read()          # read one byte
>>> s = ser.read(10)        # read up to ten bytes (timeout)
>>> line = ser.readline()   # read a '
' terminated line >>> ser.close()

Open second port at "38400,8,E,1", non blocking HW handshaking 
>>> ser = serial.Serial(1, 38400, timeout=0,
...                     parity=serial.PARITY_EVEN, rtscts=1)
>>> s = ser.read(100)       # read up to one hundred bytes
...                         # or as much is in the buffer

Get a Serial instance and configure/open it later 
>>> ser = serial.Serial()
>>> ser.baudrate = 19200
>>> ser.port = 0
>>> ser
Serial(port='COM1', baudrate=19200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=0, rtscts=0)
>>> ser.open()
>>> ser.isOpen()
True
>>> ser.close()
>>> ser.isOpen()
False

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,          # baud rate
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
interCharTimeout=None   # Inter-character timeout, None to disable
)

The port is immediately opened on object creation, if a port is given. It is not opened if port is None. 
Options for read timeout: 
timeout=None            # wait forever
timeout=0               # non-blocking mode (return immediately on read)
timeout=x               # set timeout to x seconds (float allowed)

Methods of Serial instances
open()                  # open port
close()                 # close port immediately
setBaudrate(baudrate)   # change baud rate on an open port
inWaiting()             # return the number of chars in the receive buffer
read(size=1)            # read "size" characters
write(s)                # write the string s to the port
flushInput()            # flush input buffer, discarding all it's contents
flushOutput()           # flush output buffer, abort output
sendBreak()             # send break condition
setRTS(level=1)         # set RTS line to specified logic level
setDTR(level=1)         # set DTR line to specified logic level
getCTS()                # return the state of the CTS line
getDSR()                # return the state of the DSR line
getRI()                 # return the state of the RI line
getCD()                 # return the state of the CD line

Attributes of Serial instances
Read Only: 
portstr                 # device name
BAUDRATES               # list of valid baudrates
BYTESIZES               # list of valid byte sizes
PARITIES                # list of valid parities
STOPBITS                # list of valid stop bit widths

New values can be assigned to the following attributes, the port will be reconfigured, even if it's opened at that time: 
port                    # port name/number as set by the user
baudrate                # current baud rate setting
bytesize                # byte size in bits
parity                  # parity setting
stopbits                # stop bit with (1,2)
timeout                 # timeout setting
xonxoff                 # if Xon/Xoff flow control is enabled
rtscts                  # if hardware flow control is enabled

Exceptions
serial.SerialException

Constants
parity: 
    serial.PARITY_NONE
serial.PARITY_EVEN
serial.PARITY_ODD

stopbits: 
    serial.STOPBITS_ONE
serial.STOPBITS_TWO

bytesize: 
    serial.FIVEBITS
serial.SIXBITS
serial.SEVENBITS
serial.EIGHTBITS