PyQt 開發采用串口通信的上位機軟件(1)


1:軟件開發目的

  由於開發的儀器中需要ADC對電壓進行轉換,轉換后的結果需要進行積分運算。由於是處於原型機的開發,積分過程涉及許多算法的優化。為了降低ADC芯片通訊的單片機的開銷以及開發難度,准備將所有數據送入上位機進行處理。上位機的通訊可以采用網線,USB HID以及UART的方式,就目前自己的能力來說基於UART的通訊是最力所能及的,硬件可以采用RS232或者RS485。幾年前基於VB開發過一個GUI軟件,但是VB不能跨平台,如果想讓程序復用在Win,Linux以及MacOs上必須使用跨平台的GUI編程語言。Qt5.x可以說是首選的框架,因此這里開始一個新的系列將軟件開發過程的一些學習心得寫在這個系列里面。

 

2:參考

  GitHub上有許多開源的代碼,通過關鍵詞“pyqt serial”可以找到這些代碼。以下推薦幾個個人覺得參考價值比較高的項目

https://github.com/Oslomayor/PyQt5-SerialPort-Stable  一個簡單串口調試軟件,具有最基本的接收和發送數據的功能。

https://github.com/Junboo/MotoControl 一個比較高級的軟件,是作者是用來開發給電機調速的軟件,具有數據的實時可視化功能。(項目較大完整zip有100多Mb,網速不好的不太容易下載)

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的參考網頁搜索這兩個類,得到的結果是

  表示我們需要使用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日

 

    

     

 

 

 

 #疑問

怎樣設置我的代碼可以直接復制,並且以編程的顏色方式顯示在特殊的文本框之中呢

 

#后記

這個系列估計會很長,本人地學專業出生,所以對編程很不在行,應該會有很多錯誤以及疑惑。希望能得到大家的幫助共同學習。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM