1:軟件開發目的html
因爲開發的儀器中須要ADC對電壓進行轉換,轉換後的結果須要進行積分運算。因爲是處於原型機的開發,積分過程涉及許多算法的優化。爲了下降ADC芯片通信的單片機的開銷以及開發難度,準備將全部數據送入上位機進行處理。上位機的通信能夠採用網線,USB HID以及UART的方式,就目前本身的能力來講基於UART的通信是最力所能及的,硬件能夠採用RS232或者RS485。幾年前基於VB開發過一個GUI軟件,可是VB不能跨平臺,若是想讓程序複用在Win,Linux以及MacOs上必須使用跨平臺的GUI編程語言。Qt5.x能夠說是首選的框架,所以這裏開始一個新的系列將軟件開發過程的一些學習心得寫在這個系列裏面。git
2:參考github
GitHub上有許多開源的代碼,經過關鍵詞「pyqt serial」能夠找到這些代碼。如下推薦幾個我的以爲參考價值比較高的項目算法
https://github.com/Oslomayor/PyQt5-SerialPort-Stable 一個簡單串口調試軟件,具備最基本的接收和發送數據的功能。編程
https://github.com/Junboo/MotoControl 一個比較高級的軟件,是做者是用來開發給電機調速的軟件,具備數據的實時可視化功能。(項目較大完整zip有100多Mb,網速很差的不太容易下載)api
https://github.com/gamesun/MyTerm 一個比較高級的串口調試軟件,有更多高級的選項。框架
3:學習筆記編程語言
在這個系列裏主要以學習PyQt這個工具爲主,附帶會有一些下位機的硬件結構以及編程。目前本人使用的下位機主要有兩大平臺,對於簡單開發採用開源的Arduino(Avr單片機),對於複雜的開發直接採用Cortex M4(stm32 F407)系列。Avr單片機負責實時性不強功能單一的應用,採用Arduino的開源軟件開發,編寫單線程任務。M4單片機負責複雜性任務的應用,採用Keil軟件並使用官方的標準庫,軟件則基於多任務的FreeRTOS系統進行編程。目前的上位機平臺是Win7 以及 Debian的樹莓派進行交叉開發。Win上的開發軟件是VS Code以及PyQt自帶的Qt-Designer,使用的Qt版本是PyQt5.9。主要的學習資料是GitHub上的例子,電子工業出版社的《PyQt5快速開發與實踐》,以及Qt的官網http://doc.qt.io/qt-5/classes.html#s。工具
Qt的官方文檔作的是很不錯的,雖然是C++語言,可是在弄懂Python的面向對象思想後應該是很容易參照的。學習
3.1串口的操做
Python自帶有Pyserial這個庫能夠對串口進行操做,可是PyQt5.1之後,Qt的框架增長了串口的支持,增長了QSerialPort 以及 QSerialPortInfo。在PyQt的參考網頁搜索這兩個類,獲得的結果是
- PyQt5.QtSerialPort.QSerialPort (sip class, in QSerialPort)
- PyQt5.QtSerialPort.QSerialPortInfo (sip class, in QSerialPortInfo)
表示咱們須要使用from PyQt5.QtSerialPort import QSerialPort, QSerialPortInfo 引入這兩個庫
然後經常使用的操做包括如下幾個
1.讀取有效的串口
com_list = QSerialPortInfo.availablePorts() 返回的是個QList類型,是一個複合形式的list類型,能夠採用如下方式獲取裏面的內容
for com in com_list:
com.portName() #返回串口號,如COM1
com.description() #返回設備硬件描述 如USB-SERIAL CH340
com.productIdentifier() #返回設備編號 如29987
com.standardBaudRates() #返回設備的支持波特率列表 如[110, 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 38400, 56000, 57600, 115200, 128000, 256000]
以上是最經常使用的串口信息,其餘的能夠
2.打開串口
打開官方文檔,List of all members, including inherited members能夠找到QSerialPort類的所用方法屬性。
首先要設置端口號
com = QSerialPort()
方法一
com.setPort(com_list[0]) #接收的serialPortInfo類變量,上面經過com_list = QSerialPortInfo.availablePorts() 獲取
方法二
com.setPortName('COM3') #接收文本類型的變量
com.setPortName(com_list[0].portName) #以文本方式從serialPortInfo變量中獲取端口號
然後打開端口
com.open(QIODevice.ReadWrite) #打開方式,只讀,只寫,讀寫。注意這裏和GitHub中的文檔不太同樣。GitHub中的採用self.com.open(QSerialPort.ReadWrite)。應爲QSerialPort固然也重複封裝了讀寫模式的屬性。可是這裏參照官方的文檔。使用QIODevice下的變量,所以在此以前須要from QtCore import QIODevice. Warning: The mode has to be QIODevice::ReadOnly, QIODevice::WriteOnly, or QIODevice::ReadWrite. Other modes are unsupported.
打開口會返回一個操做有效性的布爾值。若是返回True則表示打開成功,所以改爲如下指令更好
if com.open(QIODevice.ReadWrite) == False:
print('Open COM port Failed')
也能夠採用如下方式
com.open(QIODevice.ReadWrite)
if com.error() != 0:
print('Open COM port Failed')
採用這種方式能夠經過讀取com.error()的值獲取具體的錯誤信息,若是是0則表示正確,若是非零的錯誤請參考http://doc.qt.io/qt-5/qserialport.html#SerialPortError-enum
待續
2018年8月26日
#疑問
怎樣設置個人代碼能夠直接複製,而且以編程的顏色方式顯示在特殊的文本框之中呢
#後記
這個系列估計會很長,本人地學專業出生,因此對編程很不在行,應該會有不少錯誤以及疑惑。但願能獲得你們的幫助共同窗習。