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日
#疑问
怎样设置个人代码能够直接复制,而且以编程的颜色方式显示在特殊的文本框之中呢
#后记
这个系列估计会很长,本人地学专业出生,因此对编程很不在行,应该会有不少错误以及疑惑。但愿能获得你们的帮助共同窗习。