PyQt 开发采用串口通信的上位机软件(1)

时间:2024-04-16 10:53:13

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日

 

    

     

 

 

 

 #疑问

怎样设置我的代码可以直接复制,并且以编程的颜色方式显示在特殊的文本框之中呢

 

#后记

这个系列估计会很长,本人地学专业出生,所以对编程很不在行,应该会有很多错误以及疑惑。希望能得到大家的帮助共同学习。