Ubuntu+Python环境做上位机

最近需要制作程控电阻箱的上位机,使得大学毕业后就不再接触硬件的我无从下手.拿到机器后不知道怎么与其进行通信,Google上的资料也很少,现将我的环境搭建过程记录下来,希望对和我一样的小白有所帮助.

软件环境:
Ubuntu 16.04
python 3.5
硬件环境:
RS232 串口
SCPI指令的程控电阻箱

先说一下接口问题,串口通信不一定非要使用232(9针)接口,usb-usb或者usb-232都可以,目前主流浏览器大都默认支持这些驱动,需要区别的是Windows上接口名为"COM"口,而Ubuntu上则为"/dev/ttyS*“或”/dev/ttyUSB*",在编程时需要这些接口名称.

Ubuntu上查找接口名可通过dmesg命令,dmesg命令可以查看众多系统信息,包括开机\CPU\RAM\接口信息等等.

向接口发送/读取信息方式

  • cutecom (GUI)

cutecom是一个GUI程序,其作用类似minicom,可以对接口发送信息并读取信息.

sudo apt install cutecom
//一定要用sudo启动cutecom,否则会提示接口没有访问权限
sudo cutecom 

在这里插入图片描述
注: 在cutecom和下面介绍的命令行工具同时开启并访问同一接口的情况下,命令行工具会无法读取接口数据,只能写入,因而命令行工具出现读取超时或读取无反应时,确保cutecom关闭.

  • pyvisa

pyvisa是符合VISA标准的python版本(貌似并不需要安装NI-VISA,而且由于Ubuntu上没有rpm,所以在Ubuntu上安装NI-VISA非常困难)

sudo pip install pyvisa
//安装python版本visa标准
sudo pip install pyvisa-py

安装完成后即可通过python与设备进行通信

import visa
rm = visa.ResourceManager() # visa.ResorceManager('@py')可指定使用python版的visa后端,这里使用默认即可
rm.list_resources()         # 列出可用接口
inst = rm.open_resource('ASRL/dev/ttyS0::INSTR')  # 默认腾讯速率为9600, 无校验位, 停止位为1
inst.write('OUTP:STAT ONL') # 对接口写入
inst.read()                 # 对接口读取

如果read的时候报错:

VisaIOError: VI_ERROR_TMO (-1073807339): Timeout expired before operation completed.

则极有可能是因为命令结束符设置错了,也就是说读取到了输出,但是不知道在哪里结束,造成响应超时. 大多数设备命令结束符为’\r’,也就是回车. 但也有’\n’,比如我的设备就是.通过以下命令可设置结束符:

inst.read_termination = '\n'

write和read配合使用往往会出现输出漏字符现象,这是因为读取过快,需要在write和read之间设置一段延时,可以通过pyvisa自己的delay或系统的time.sleep(1)引入延时.

inst.query(‘命令’)则是更方便的命令,它将write和read合二为一,并且不用考虑漏字符现象,所以更推荐使用:

import visa
...
print(inst.query('OUTP:STAT?')) # 向设备询问当前状态,并打印在终端上
  • pyserial

pyserial是可以让我们以python方式访问接口的封装包,安装方式为:

sudo pip install pyserial

以root用户执行:

import serial
import serial.tools.list_ports
print(list(serial.tools.list_ports.comports())) # 列出可访问接口
ser = serial.Serial("/dev/ttyS0") #默认腾讯速率为9600, 无校验位, 停止位为1
ser.write('OUT:STAT ONL\n'.encode()) #一定记住这里要用'\n'结束符,否则命令无法执行,
ser.readline() # 可读取以'\n'作为结束符的内容

:pyserial读取的内容可以完全显示出来,包括结束符,比如我这里输出结果为

 b'OUTP:STAT OPEN\n'

结束符一般是’\n’, 由于自己是个小白, 对结束符不太了解, 设备的开发文档上写的结束符是’<\n>’, 造成使用serial发送指令时一直不成功,而visa和echo会默认添加’\n’, 使用pyvisa会造成在后期用pyinstaller打包后, 程序找不到visa相关文件的问题, 因而如果是普通设备,建议使用pyserial, 不建议pyvisa.

因而如果你不知道你的设备反回的结束符是什么,可以通过pyserial获知,并结合pyvisa设置结束符,解决读取超时的问题.算是一个意外发现吧.

  • bash

通过bash的重定向就能实现写入,读取功能的实现还不清楚

// 需要超级用户权限,"sudo + 命令"的形式依旧提示权限不够
sudo su
echo "OUTP:STAT ONL" > /dev/ttyS0

折腾一天半,总算是能访问了,下一步打算用pyqt做成图形界面的上位机.(就算死也不用windows)

猜你喜欢

转载自blog.csdn.net/MacwinWin/article/details/84564065
今日推荐