python的串口網上有很多例子,這裏了只是把認爲好的整理到一起。
首先,應該安裝serial模塊,還能開始後續的操作。我用的python2.6,serial模塊可以在這裏下載安裝serial模塊下載
1,字符串的發送接收
短接串口的2、3腳,創建一個文本,如:
- 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
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
或者你可以稍微添加幾句,變成你任意輸入後打印出你的鍵入信息。
- 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
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),代碼如下:
- 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)
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函數,
- list='aabbccddee'
- hexer=list.decode("hex")
- print hexer
list='aabbccddee'
hexer=list.decode("hex")
print hexer
需要注意一點,如果字符串list的長度爲奇數,則decode會報錯,可以按照實際情況,用字符串的切片操作,在字符串的開頭或結尾加一個'0'
假如在串口助手以十六進制發送字符串"abc",那麼你在python中則這樣操作“self.l_serial.write(”\x61\x62\x63") ”
當然,還有另外一個方法:
- strSerial = "abc"
- strHex = binascii.b2a_hex(strSerial)
- #print strHex
- strhex = strHex.decode("hex")
- #print strhex
- 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);
同樣可以達到相同目的。
那麼,串口方面的就整理完了。
額外一個小知識:
索引:也稱作是下標操作,那麼python就會爲你抓取序列中對應位置的項目。它是從0開始計數,那麼str[0]即爲第一個項目, str[3]爲第四個。(str只是一個參考序列)。當然呢,python有點不同是它可以是負數,位置就是從序列尾開始計算的。str[-1]表示序列的最後一個元素,而str[-2]爲倒數第二個。
切片操作:顧名思義,就是可以連續一整塊,把什麼切成幾段,但那一段是連續的。它是序列名後跟一個方括號,方括號有一對可選的數字,並用冒號分割。數是可選的,但冒號是必須的。例如str[1:3]返回從位置1開始,包括位置2,但是不包括位置3,返回的是一個含有兩個項目的切片。類似,str[:]返回整個序列的拷貝。同樣,它也是可以用負數的。