python串口編程
① python3.5 讀取串口中的數據怎麼解碼
1、安裝串口庫
2、採用默認通信參數
import serial
t = serial.Serial('com1',9600)
n = t.write('you are my world')print t.portstrprint n
str = t.read(n)print str
3、可以自己設置參數
import timeimport serialser = serial.Serial( #下面這些參數根據情況修改 port='COM1', baudrate=9600, parity=serial.PARITY_ODD, stopbits=serial.STOPBITS_TWO, bytesize=serial.SEVENBITS)data = ''while ser.inWaiting() > 0: data += ser.read(1)if data != '': print data
注意:Python與多個串口通信的時候,要確定埠號。如果有時間的話,可以自己寫一個查詢所有埠的信息,不想這么麻煩的話,下載個串口助手,自己看埠信息,在py文件中修改serial.Serial()裡面的埠號。
② 如何用python實現串口通信
Python非常適合寫一些測試的腳本,如快速的串口通信測試等。如果使用VC++ QT開發,可能用時較多,使用python,如果掌握使用方法,可以直接讀寫測試,配合設備或是串口助手,很快驗證與實現。
Python有沒有現成的串口API直接調用呢?經過實踐驗證,需要安裝一個叫 Pyserial的組件即可。這個可以在github上下載。
在windows 7 64bit 上可以使用嗎?當然可以使用,我安裝的python3.5為64位的。把下載後的文件,其中有一個serial的文件夾,拷貝到python35安裝路徑, C:\Python35\Lib\site-packages\serial
網上可以搜一下windows的安裝包,安裝完也是:C:\Python35\Lib\site-packages\serial ,可以用最新的版本,替換即可。
測試的方法:在python IDE里測試:
>>> import serial
這里如果報錯,是python版本與pyserial版本沒有配合好。如果正常,不返回,即可以導入serial模塊。
>>> ser=serial.Serial("COM5",115200)
這里為COM5,115200的波特率。如果打不開,請檢查安裝環境。
>>> ser.write('hello,serial test'.encode())
17
發送測試(如果返回位元組數,說明返回成功),這里需要轉換一個編碼為位元組。
以上測試,可以使用現在的設備或是串口助手,如安裝Virtual Serial Port Driver 7.2 虛擬串口軟體,設置一對串口,進行自發自收的測試。
>>> print(ser.readline())
b'abcdefg\r\n'
這里是串口接收,有接收的超時。設備或是串口助手發送一個字元串,以回車換行結束,這里就可以收到列印出來。
也可以用ser.read(),這里只接收一個字元來實現。
上面已經實現了基本的串口操作。
關閉串口為:
>>> ser.close()
如果使用python,一般寫個py文件,就像windows bat 批處理一樣,這是python強大的地方。如果寫一個py腳本呢?其實只要把上面的命令,一條條寫下來,就是一個腳本,測試如下:
import serialser=serial.Serial("COM5",115200,timeout=0.5)for i in range(0,100-1):ser.write('hello\r\n'.encode())print(ser.readline());ser.close()
③ 如何用python寫個串口通信的程序
使用 pyserial 就可以處理串口通信,這個包是跨平台的。
http://pyserial.sourceforge.net/
示常式序在這里:
https://pyserial.readthedocs.io/en/latest/examples.html#wxpython-examples
importserial
#創建serial實例
serialport=serial.Serial()
serialport.port='COM1'
serialport.baudrate=9600
serialport.parity='N'
serialport.bytesize=8
serialport.stopbits=1
serialport.timeout=0.6
try:
serialport.open()
serialport.setDTR(True)
serialport.setRTS(True)
exceptException,ex:
printex
#發送數據
serialport.write(raw_data)
#根據項目要求,可以開一個線程掃描接收數據
④ 如何用python寫個串口通信的程序
使用pyserial庫,是最簡單的!!!
import serial
ser = serial.Serial() # open 'COM1', baudrate=9600, etc
ser.write('string out')
ser.read(1) # read 1 byte from COM port
# ...
ser.close()<img id="selectsearch-icon" src="https://gss0.bdstatic.com/70cFsjip0QIZ8tyhnq/img/iknow/qb/select-search.png" alt="搜索">
⑤ python對串口藍牙模塊的操作
python提供了豐富的mole 對串口的操作同樣有對應的mole:serial
環境:python3.5 藍牙模塊:HC-05 波特率38400
首先導入serial模塊(通過pip install serial 安裝)
獲取串口ser 通過serial.Serial(地址,波特率,超時時間)
創建線程監聽串口數據
使用 ser.in_waiting() 獲知數據量 這個函數返回當前串口收到的數據長度
收取數據後進行詳細操作
⑥ python 串口
help(serial)看一下幫助裡面的屬,要區分大小寫
⑦ 樹莓派怎麼樣用 Python 控制 GPIO 來發送串口指令
python GPIO
1、先安裝python-dev,輸入以下指令。
sudo
apt-get install python-dev
2、安裝RPi.GPIO,依次輸入以下指令。
1)下載:$ wget http://raspberry-gpio-python.googlecode.com/files/RPi.GPIO-0.5.3a.tar.gz
2)解壓縮:$ tar xvzf RPi.GPIO-0.5.3a.tar.gz
3)進入解壓之後的目錄 :$ cd RPi.GPIO-0.5.3a
4)啟動安裝 :$ sudo python setup.py install
3、例子:
[python] view plain
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time
# BOARD編號方式,基於插座引腳編號
GPIO.setmode(GPIO.BOARD)
# 輸出模式
GPIO.setup(11, GPIO.OUT)
while True:
GPIO.output(11, GPIO.HIGH)
time.sleep(1)
GPIO.output(11, GPIO.LOW)
time.sleep(1)
4、執行:
sudo python led.py
5、說明:
1)GPIO.setmode(GPIO.BOARD),採用插座引腳編號方式。
2)由於採用插座引腳編號方式,此處的11腳相當於BCM2835寄存器編號方式的引腳11。
python GPIO
1、說明:
WiringPi是應用於樹莓派平台的GPIO控制庫函數,WiringPi遵守GUN Lv3。wiringPi使用C或者C++開發並且可以被其他語言包轉,例如python、ruby或者PHP等。
wiringPi包括一套gpio控制命令,使用gpio命令可以控制樹莓派GPIO管腳。用戶可以利用gpio命令通過shell腳本控制或查詢
GPIO管腳。wiringPi是可以擴展的,可以利用wiringPi的內部模塊擴展模擬量輸入晶元,可以使用
MCP23x17/MCP23x08(I2C
或者SPI)擴展GPIO介面。另外可通過樹莓派上的串口和Atmega(例如arino等)擴展更多的GPIO功能。另外,用戶可以自己編寫擴展模
塊並把自定義的擴展模塊集成到wiringPi中。WiringPi支持模擬量的讀取和設置功能,不過在樹莓派上並沒有模擬量設備。但是使用
WiringPi中的軟體模塊卻可以輕松地應用AD或DA晶元。
⑧ 用Python控制串口連接的ESP8266無線晶元,如何操作
1、確定一下串口沒問題(可以嘗試用其他編程語言操作)
2、看下下面博客,試試能不能解決問題。
http://cache.content.com/c?m=&p=&newp=&user=&fm=sc&query=python+serial+%C4%A3%BF%E9&qid=d941882f0009a361&p1=5
⑨ 有沒有python的串口庫
串口模塊的波特率比較特別,找了幾個串口工具都不支持。。。所以,乾脆用python自己來寫了,其實已經好奇好久了,別人的工具各種不順手。
需要pyserial的支持,兼容各種平台,不需要新編譯二進制文件。
先貼一個定時發送的代碼:
6. exception:serial.SerialException
另一個完整收發的例子,單片機數據以TLV(Type,Length,Value)格式發上來
#!/usr/bin/env python
# it's a program of luo, [email protected]
import serialimport arrayimport osimport signalfrom time import sleep
flag_stop = Falsedef onsignal_int(a,b): print "sigint!"
global flag_stop
flag_stop = True
signal.signal(signal.SIGINT, onsignal_int)
signal.signal(signal.SIGTERM, onsignal_int)
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout = 0.001)print "serial.isOpen() =",ser.isOpen()
cmd_send = ""cmd_send = cmd_send.decode("hex")
stop = "7b04047d0d0a"stop = stop.decode("hex")
cmd_back = ""cmd_length = 0x00cmd_count = 0x00s = ser.write(cmd_send)while True:
sleep(0.1)
if flag_stop: # read data until Ctrl+c
ser.write(stop) # send cmd stop before exit
print "reset cmd has been sent!"
sleep(0.05) break
text = ser.read(1) # read one, with timout
if text: # check if not timeout
n = ser.inWaiting() # look if there is more to read
if n:
text = text + ser.read(n) #get it
cmd_back = cmd_back + text
text = ""
if len(cmd_back) < 2: # go back if no enough data recvd
continue
if cmd_length == 0x00: # new loop
cmd_length = ord(cmd_back[1]) # Type(1 byte),Length of Value(1 byte),Value
print "new cmd length,",cmd_length
if (cmd_length + 0x02) > len(cmd_back): # do nothing until all bytes is recvd
continue
# so far, we have got a full cmd
hex_list = [hex(ord(i)) for i in cmd_back] # more readable than data.encode("hex")
print "In buffer:",hex_list
cmd_back = cmd_back[cmd_length+2:] # remove this cmd(TLV) from buffer
cmd_length = 0
cmd_count += 1
print "==> %d cmds recvd."%(cmd_count) print "-------------"
ser.close()
——————
⑩ python - serial communication(串口通信)
由於測試工作的需要,在C端產品上經常使用串口進行通信,而測試腳本大部分時候又採用python編寫,於是就不得不了解並熟悉python下的串口通信實現方法了,整理如下以備隨時使用:
一、說明
pyserial封裝了python環境下對串口的訪問,其兼容各種平台,並有統一的操作介面。通過python屬性訪問串口設置,並可對串口的各種配置參數(如串口名,波特率、停止校驗位、流控、超時等等)做修改,再進行串口通信的類與介面封裝後,非常方便地被調用和移植。
二、模塊安裝
pip insatll pyserial
三、初始化與參數說明
import serial
ser = serial.Serial('COM3', 115200, timeout=0.5, ....................)
下面看看 serial.Serial 原生類
四、不同平台下初始化
ser=serial.Serial("/dev/ttyUSB0",9600,timeout=0.5)#使用USB連接串列口ser=serial.Serial("/dev/ttyAMA0",9600,timeout=0.5)#使用樹莓派的GPIO口連接串列口ser=serial.Serial(1,9600,timeout=0.5)#winsows系統使用COM1口連接串列口ser=serial.Serial("COM1",9600,timeout=0.5)#winsows系統使用COM1口連接串列口ser=serial.Serial("/dev/ttyS1",9600,timeout=0.5)#Linux系統使用COM1口連接串列口
五、串口屬性
ser.name #串口名稱
ser.port #埠號
ser.baudrate #波特率
ser.bytesize #位元組大小
ser.parity #校驗位N-無校驗,E-偶校驗,O-奇校驗
ser.stopbits #停止位
ser.timeout #讀超時設置
ser.writeTimeout #寫超時
ser.xonxoff #軟體流控
ser.rtscts #硬體流控
ser.dsrdtr #硬體流控
ser.interCharTimeout #字元間隔超時
六、串口常用方法
isOpen():查看埠是否被打開。
open() :打開埠『。
close():關閉埠。
read(size=1):從埠讀位元組數據。默認1個位元組。
read_all():從埠接收全部數據。
write(data):向埠寫數據。
readline():讀一行數據。
readlines():讀多行數據。
in_waiting():返回輸入緩存中的位元組數。
out_waiting():返回輸出緩存中的位元組數。
flush():等待所有數據寫出。
flushInput():丟棄接收緩存中的所有數據。
flushOutput():終止當前寫操作,並丟棄發送緩存中的數據。
sendBreadk(ration=0.25):發送BREAK條件,並於ration時間之後返回IDLE
setBreak(level=True):根據level設置break條件。
setRTS(level=True):設置請求發送(RTS)的控制信號
setDTR(level=True):設置數據終端准備就緒的控制信號
七、類與介面封裝
import time
import serial
import serial.tools.list_ports
# 串口操作類
class serialCommunication(object):
def __init__(self, port, bps, timeout):# 可配置更多參數
port_list =self.show_usable_com()
if len(port_list) >0:
if portnot in port_list:
self.port = port_list[0]
else:
self.port = port
else:
print("no usable serial, please plugin your serial board")
return
self.bps = bps
self.timeout = timeout
try:
# 初始化串口,並得到串口對象,根據需要可拓展更多參數
self.ser = serial.Serial(self.port, self.bps, 8, 'N', 1, timeout=self.timeout, write_timeout=self.timeout)
except Exception as e:# 拋出異常
print("Exception={}".format(e))
# 顯示可用串口列表
@staticmethod
def show_usable_com():
serialport_list = []
portInfo_list =list(serial.tools.list_ports.comports())
if len(portInfo_list) <=0:
print("can not find any serial port!")
else:
print(portInfo_list)
for i in range(len(portInfo_list)):
plist =list(portInfo_list[i])
print(plist)
serialport_list.append(plist[0])
print(serialport_list)
return serialport_list
# 輸出串口基本信息
def serial_infor(self):
print(self.ser.name)# 設備名字
print(self.ser.port)# 讀或者寫埠
print(self.ser.baudrate)# 波特率
print(self.ser.bytesize)# 位元組大小
print(self.ser.parity)# 校驗位
print(self.ser.stopbits)# 停止位
print(self.ser.timeout)# 讀超時設置
print(self.ser.writeTimeout)# 寫超時
print(self.ser.xonxoff)# 軟體流控
print(self.ser.rtscts)# 軟體流控
print(self.ser.dsrdtr)# 硬體流控
print(self.ser.interCharTimeout)# 字元間隔超時
# 打開串口
def serial_open(self):
try:
if not self.ser.isOpen():
self.ser.open()
except Exception as e:# 拋出異常
print("serial_open Exception={}".format(e))
self.ser.close()
# 讀取指定大小的數據
# 從串口讀size個位元組。如果指定超時,則可能在超時後返回較少的位元組;如果沒有指定超時,則會一直等到收完指定的位元組數。
def serial_read_with_size(self, size):
try:
self.serial_open()
return self.ser.read(size).decode("utf-8")
except Exception as e:
print("serial_read_all Exception={}".format(e))
self.ser.close()
# 讀取當前串口緩存中的所有數據
def serial_read_data(self):
try:
self.serial_open()
datalen =self.ser.inWaiting()
if datalen ==0:
return None
return self.ser.read(datalen).decode("utf-8")
except Exception as e:
print("serial_read_data Exception={}".format(e))
self.ser.close()
# 讀串口全部數據,注意timeout的設置
# 在設定的timeout時間范圍內,如果讀取的位元組數據是有效的(就是非空)那就直接返回,
# 否則一直會等到設定的timeout時間並返回這段時間所讀的全部位元組數據。
def serial_read_all(self):
try:
self.serial_open()
return self.ser.read_all().decode("utf-8")
except Exception as e:
print("serial_read_all Exception={}".format(e))
self.ser.close()
# 讀一行數據
# 使用readline()時應該注意:打開串口時應該指定超時,否則如果串口沒有收到新行,則會一直等待。
# 如果沒有超時,readline會報異常。
def serial_read_line(self):
try:
self.serial_open()
return self.ser.readline().decode("utf-8")
except Exception as e:
print("serial_read_line Exception={}".format(e))
self.ser.close()
# 讀多行數據,返回行列表
def serial_read_lines(self):
try:
self.serial_open()
return self.ser.readlines().decode("utf-8")
except Exception as e:
print("serial_read_lines Exception={}".format(e))
self.ser.close()
# 寫數據
def serial_write_data(self, data):
try:
self.serial_open()
self.ser.flushOutput()
data_len =self.ser.write(data.encode('utf-8'))
return data_len
except Exception as e:
print("serial_write_data Exception={}".format(e))
return 0
# 寫行數據,注意參數差異
def serial_write_lines(self, lines):
self.ser.writelines(lines)
# 清除串口緩存
def serial_clean(self):
try:
if self.ser.isOpen():
self.ser.flush()
except Exception as e:
print("serial_clean Exception={}".format(e))
# 關閉串口
def serial_close(self):
try:
if self.ser.isOpen():
self.ser.close()
except Exception as e:
print("serial_clean Exception={}".format(e))
if __name__ =='__main__':
testSerial = serialCommunication("COM10", 1500000, 0.5)
testSerial.serial_open()
testSerial.serial_infor()
testSerial.serial_write_data("ifconfig eth0\n")
time.sleep(0.1)
data = testSerial.serial_read_all()
print(data)
testSerial.serial_close()
八、其他
1)ser.VERSION表示pyserial版本; 另外,ser.name表示設備名稱
2)埠設置可以被讀入字典,也可從字典載入設置:
getSettingDict():返回當前串口設置的字典
applySettingDict(d):應用字典到串口設置
3) Readline()是讀一行,以/n結束,要是沒有/n就一直讀,阻塞。注意:打開串口時應該指定超時,否則如果串口沒有收到新行,則會一直等待。
4)serial.read_all 與 serial.read_all()區別
serial.read_all:讀取串口所有的參數信息
serial.read_all():超時時間內從串口讀取的所有數據
5) 異常信息
exception serial.SerialException
exception serial.SerialTimeoutException