1. 程式人生 > >Python串列埠程式設計

Python串列埠程式設計

python的串列埠網上有很多例子,這裡了只是把認為好的整理到一起。

首先,應該安裝serial模組,還能開始後續的操作。我用的python2.6,serial模組可以在這裡下載安裝serial模組下載

1,字串的傳送接收

短接串列埠的2、3腳,建立一個文字,如:

  1. import serial  
  2. t = serial.Serial('com12',9600)  
  3. n = t.write('you are my world')  
  4. print t.portstr  
  5. print n  
  6. str = t.read(n)  
  7. print str  
  1. import serial  
  2. t = serial.Serial('com12',9600)  
  3. n = t.write('you are my world')  
  4. print t.portstr  
  5. print n  
  6. str = t.read(n)  
  7. print str  
import serial

t = serial.Serial('com12',9600)
n = t.write('you are my world')
print t.portstr
print n
str = t.read(n)
print str

或者你可以稍微新增幾句,變成你任意輸入後打印出你的鍵入資訊。

  1. import serial  
  2. t = serial.Serial('com12',9600)  
  3. print t.portstr  
  4. strInput = raw_input('enter some words:')  
  5. n = t.write(strInput)  
  6. print n  
  7. str = t.read(n)  
  8. print str  
  1. import serial  
  2. t = serial.Serial('com12',9600)  
  3. print t.portstr  
  4. strInput = raw_input('enter some words:')  
  5. n = t.write(strInput)  
  6. print n  
  7. str = t.read(n)  
  8. print str  
import serial

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

其中,read(value)方法的引數value為需要讀取的字元長度。 如果想要全部讀取,提供兩個方法:

1)inWaiting::監測接收字元。 inWaitting返回接收字串的長度值,然後把這個值賦給read做引數。

2)readall()::讀取全部字元。

===================================================================================================================================

2,十六進位制顯示

十六進位制顯示的實質是把接收到的字元諸葛轉換成其對應的ASCII碼,然後將ASCII碼值再轉換成十六進位制數顯示出來,這樣就可以顯示特殊字元了。

在這裡定義了一個函式,如hexShow(argv),程式碼如下:

  1. import serial  
  2. def hexShow(argv):  
  3.     result = ''  
  4.     hLen = len(argv)  
  5.     for i in xrange(hLen):  
  6.         hvol = ord(argv[i])  
  7.         hhex = '%02x'%hvol  
  8.         result += hhex+' '  
  9.     print 'hexShow:',result  
  10. t = serial.Serial('com12',9600)  
  11. print t.portstr  
  12. strInput = raw_input('enter some words:')  
  13. n = t.write(strInput)  
  14. print n  
  15. str = t.read(n)  
  16. print str  
  17. hexShow(str)  
  1. import serial  
  2. def hexShow(argv):  
  3.     result = ''  
  4.     hLen = len(argv)  
  5.     for i in xrange(hLen):  
  6.         hvol = ord(argv[i])  
  7.         hhex = '%02x'%hvol  
  8.         result += hhex+' '  
  9.     print 'hexShow:',result  
  10. t = serial.Serial('com12',9600)  
  11. print t.portstr  
  12. strInput = raw_input('enter some words:')  
  13. n = t.write(strInput)  
  14. print n  
  15. str = t.read(n)  
  16. print str  
  17. hexShow(str)  
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,十六進位制傳送

十六進位制傳送實質是傳送十六進位制格式的字串,如'\xaa','\x0b'。重點在於怎麼樣把一個字串轉換成十六進位制的格式,有兩個誤區:

1)'\x'+'aa'是不可以,涉及到轉義符反斜槓

2)'\\x'+'aa'和r'\x'+'aa'也不可以,這樣的列印結果雖然是\xaa,但賦給變數的值卻是'\\xaa'

 這裡用到decode函式,

  1. list='aabbccddee'  
  2. hexer=list.decode("hex")  
  3. print  hexer  
  1. list='aabbccddee'  
  2. hexer=list.decode("hex")  
  3. print  hexer  
list='aabbccddee'
hexer=list.decode("hex")
print  hexer

需要注意一點,如果字串list的長度為奇數,則decode會報錯,可以按照實際情況,用字串的切片操作,在字串的開頭或結尾加一個'0'

假如在串列埠助手以十六進位制傳送字串"abc",那麼你在python中則這樣操作“self.l_serial.write(”\x61\x62\x63") ”

當然,還有另外一個方法:

  1. strSerial = "abc"  
  2. strHex = binascii.b2a_hex(strSerial)  
  3. #print strHex   
  4. strhex = strHex.decode("hex")  
  5. #print strhex   
  6. self.l_serial.write(strhex);  
  1. strSerial = "abc"  
  2. strHex = binascii.b2a_hex(strSerial)  
  3. #print strHex  
  4. strhex = strHex.decode("hex")  
  5. #print strhex  
  6. self.l_serial.write(strhex);  
                strSerial = "abc"
                strHex = binascii.b2a_hex(strSerial)
                #print strHex
                strhex = strHex.decode("hex")
                #print strhex
                self.l_serial.write(strhex);

同樣可以達到相同目的。

那麼,串列埠方面的就整理完了。

原始碼