python 之serial、pyusb 使用开发
说明:本次是在windows 系统操作实现的。
serial
使用场景,获取得力扫码枪的扫码数据,该扫码枪支持三种通讯接口设置,如下图

即插即用的是 USB-KBW功能,插上去即可获取扫码数据,第二种是通过USB虚拟串口功能实现的,即通过com 口,
使用前可以通过扫码这三种方式中的其中一种进行设置通讯方式。
首先介绍第二种方式
第二种方式打开后,本机打开记事本,扫码是获取不到扫码数据的,询问客服,客服说该扫码枪不支持该功能。
但是通过程序监控com口是可以实现获取数据的。具体是通过serial模块进行操作的,具体介绍如下:
安装 pyserial模块
pip install pyserial
# 介绍一下serial的相关方法 open() #打开端口
close() #立即关闭端口
setBaudrate(波特率) #在打开的端口上更改波特率
inWaiting() #返回接收缓冲区中的字符数
read(size = 1) #读取“size”字符
write(s) #将字符串s写入端口
flushInput() #刷新输入缓冲区,丢弃所有的内容
flushOutput() #刷新输出缓冲区,中止输出
sendBreak() #发送中断条件
setRTS(level = 1) #设置RTS线路为指定的逻辑电平
setDTR(level = 1) #设置DTR行为指定的逻辑级别
getCTS() #返回CTS行的状态
getDSR() #返回DSR行的状态
getRI() #返回RI行的状态
getCD() #返回CD行的状态
实例介绍
检查是否有使用端口欧
# FileName : demo.py
# Author : Adil
# DateTime : 2019/9/1 7:03
# SoftWare : PyCharm import serial
# 这里使用的是windwos
from serial.tools.list_ports_windows import * plist = list(comports()) if len(plist) <= 0:
print ("The Serial port can't find!")
else:
plist_0 =list(plist[0])
serialName = plist_0[0]
serialFd = serial.Serial(serialName,9600,timeout = 60)
print ("check which port was really used >",serialFd.name)
实际读取端口数据
# FileName : test.py
# Author : Adil
# DateTime : 2019/9/1 7:25
# SoftWare : PyCharm import serial ser = serial.Serial('COM6', 9600,timeout=0.5)
# ser = serial.Serial('COM6', 9600) print(ser.name) print(ser.port) if not ser.isOpen():
ser.open()
print('com3 is open', ser.isOpen()) # 获取一行信息
def recv(serial):
print('')
data = ''
while serial.inWaiting() > 0:
print(serial.inWaiting())
print('')
# data += str(serial.read(15)) # ok 要配合timeout 使用, 否则要传入已知 的 size
# data += str(serial.readline()) # ok 要配合timeout 使用
# data += str(serial.readlines()) # ok 要配合timeout 使用
# data += str(serial.readall()) # ok 要配合timeout 使用
data += str(serial.read_all()) # ok 要配合timeout 使用 print("************************************")
#print(serial.read(13))
print('准备打印data')
# data = str(serial.read(19))
print(data)
print('data:%s'%data)
print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~") return data # cursor.execute("DROP TABLE IF EXISTS productinfo") '''
sql="""CREATE TABLE productinfo(
code CHAR(18),
price double(9,2),
info CHAR(25))"""
cursor.execute(sql)
''' sum = 0.0
while True:
print('')
data = recv(ser)
print('')
if data != '':
print('')
print(data)
break ser.close()
print ser.name#打印设备名称
print ser.port#打印设备名
ser.open() #打开端口
s = ser.read(10)#从端口读10个字节
ser.write("hello")#向端口些数据
ser.close()#关闭端口
data = ser.read(20)#是读20个字符
data = ser.readline() #是读一行,以/n结束,要是没有/n就一直读,阻塞。
data = ser.readlines()和ser.xreadlines()#都需要设置超时时间
ser.baudrate = 9600 #设置波特率
ser.isOpen() #看看这个串口是否已经被打开
获得串行口状态、属性
串行口的属性:
name:设备名字
portstr:已废弃,用name代替
port:读或者写端口
baudrate:波特率
bytesize:字节大小
parity:校验位
stopbits:停止位
timeout:读超时设置
writeTimeout:写超时
xonxoff:软件流控
rtscts:硬件流控
dsrdtr:硬件流控
interCharTimeout:字符间隔超时
属性的使用方法:
ser=serial.Serial("/dev/ttyAMA0",9600,timeout=0.5)
ser.open()
print ser.name
print ser.port
print ser.baudrate#波特率
print ser.bytesize#字节大小
print ser.parity#校验位N-无校验,E-偶校验,O-奇校验
print ser.stopbits#停止位
print ser.timeout#读超时设置
print ser.writeTimeout#写超时
print ser.xonxoff#软件流控
print ser.rtscts#硬件流控
print ser.dsrdtr#硬件流控
print ser.interCharTimeout#字符间隔超时
ser.close()
设置串行口状态
需要用的常量
bytesize:FIVE BITS、SIXBITS、SEVENBITS、EIGHTBITS
parity: PARITY_NONE, PARITY_EVEN, PARITY_ODD, PARITY_MARK, PARITY_SPACE
stopbits: STOPBITS_ONE, STOPBITS_ONE_POINT_FIVE, STOPBITS_TWO
异常:
ValueError:参数错误
SerialException:找不到设备或不能配置
ser.baudrate=9600#设置波特率
ser.bytesize=8#字节大小
ser.bytesize=serial.EiGHTBITS#8位数据位
ser.parity=serial.PARITY_EVEN#偶校验
ser.parity=serial.PARITY_NONE#无校验
ser.parity=serial.PARITY_ODD#奇校验
ser.stopbits=1#停止位
ser.timeout=0.5#读超时设置
ser.writeTimeout=0.5#写超时
ser.xonxoff#软件流控
ser.rtscts#硬件流控
ser.dsrdtr#硬件流控
ser.interCharTimeout#字符间隔超时
Read
是读一行,以/n结束,要是没有/n就一直读,阻塞。
使用readline()时应该注意:打开串口时应该指定超时,否则如果串口没有收到新行,则会一直等待。如果没有超时,readline会报异常。
其中,read(value)方法的参数value为需要读取的字符长度。 如果想要全部读取,提供两个方法:
inWaiting:监测接收字符。
inWaitting返回接收字符串的长度值,然后把这个值赋给read做参数。
data =readall()::读取全部字符。
data = ser.read()可以读一个字符
data = ser.read(20) 是读20个字符
data = ser.readline() 是读一行,以/n结束,要是没有/n就一直读,阻塞。
data = ser.readlines()和ser.xreadlines()都需要设置超时时间
import serial
import serial.tools.list_ports #测试调试输出开关,正式发布需调整为False
mytest = True
#mytest = False def getPort():
port_serial=[]#返回串口列表
port_list = list(serial.tools.list_ports.comports()) if len(port_list) <= 0:
print("The Serial port can't find!")
else:
#if(mytest):print("port_list: ",port_list)
for port in port_list:
#if(mytest):print("port: ",port)
port_serial.append(str(port).split(' ')[0])
# if(mytest):print("port_serial: ",port_serial) return(port_serial) '''
** Descriptions: 发送串口数据
** Parameters:
** Returned value:
** Created By: yanerfree
** Created on: 2018年10月16日
** Remarks:以二进制读取
'''
def send_data(serial_port="COM6", baudrate=115200, bytesize=8,
parity=serial.PARITY_NONE,stopbit=1,
timeout=5, filename="F:\test.txt"):
serial_port_1 = serial_port
baudrate_1 = int(baudrate)
bytesize_1 = int(bytesize)
parity_1 = parity[:1]
stopbit_1 = int(stopbit)
timeout_1 = timeout
filename_1 = filename
print(serial_port_1,baudrate_1,bytesize_1,parity_1,stopbit_1,timeout_1,filename_1)
try:
print("初始化串口")
# ser_port = serial.Serial("COM6",115200,timeout=1.5,parity=serial.PARITY_NONE,
# stopbits=serial.STOPBITS_ONE,
# bytesize=serial.EIGHTBITS)
ser_port = serial.Serial(serial_port_1, baudrate_1,bytesize_1,parity_1,stopbit_1, timeout_1)
print("串口是否打开:",ser_port.isOpen())
if not ser_port.isOpen():
ser_port.open()
print("串口是否打开:",ser_port.isOpen()) f = open(filename_1,'rb')#打开或者新建一个文件
i=0
while 1:
i = i + 1
print("读取文 件第 %d 行"%i)
#fileData=f.readline().strip('\n').encode(encoding='utf_8')#编码转换成字节发送
fileData=f.readline().strip(b'\n')
fileData=fileData.strip(b'\r')
if fileData==b'':
break
#fileData_1=(fileData+'SDSA\r\n'.encode(encoding='utf_8'))
fileData_1=(fileData+b'SDSA\r\n')
print("发送数据为:",fileData_1)
ser_port.write(fileData_1)
#print("fileData[-11:]",fileData[-11:])
if fileData[-11:]==b'***[END]***':
#if fileData[-11:]=='***[END]***':
print("检测到文件结束符,退出")
break;
print("等待2s")
time.sleep(2)
except Exception:
print("发送脚本失败")
finally:
f.close()
ser_port.close() '''
** Descriptions: 获取串口数据
** Parameters:
** Returned value:
** Created By: yanerfree
** Created on: 2018年10月17日
** Remarks:二进制保存
'''
def receive_data(serial_port="COM6", baudrate=115200, bytesize=8,
parity=serial.PARITY_NONE,stopbit=1,
timeout=5,filename="F:\test.txt"):
serial_port_1 = serial_port
baudrate_1 = int(baudrate)
bytesize_1 = int(bytesize)
parity_1 = parity[:1]
stopbit_1 = int(stopbit)
timeout_1 = timeout
filename_1 = filename
print(serial_port_1,baudrate_1,bytesize_1,parity_1,stopbit_1,timeout_1,filename_1)
try:
print("初始化串口")
#ser_port = serial.Serial(serial_port, baudrate,bytesize,parity,stopbit, timeout)
ser_port = serial.Serial(serial_port_1, baudrate_1,bytesize_1,parity_1,stopbit_1, timeout_1)
print("串口是否打开:",ser_port.isOpen())
if not ser_port.isOpen():
ser_port.open()
print("串口是否打开:",ser_port.isOpen()) #f = open(filename_1,'w',encoding='utf-8')#打开或者新建一个文件
f = open(filename_1,'wb')#以二进制打开或创建一个文件 while True:
fileData=ser_port.readline()
if(len(fileData)==0 or fileData[-6:]!=b'SDSA\r\n'):
continue;
print("接收到的数据:",fileData)
fileData1=fileData.split(b'SDSA\r\n')[0]
fileData2=fileData1+b'\n'#'0X0D'
filedata_str=fileData1.decode(encoding='utf_8')
content = filedata_str + '\n'
print("保存的数据为:",fileData2)
#saveFile(filename_1,fileData1)
f.write(fileData2)
if filedata_str[-11:]=='***[END]***':
break;
sleep(1)
except Exception:
print("获取脚本失败")
finally:
f.close()
ser_port.close()
if mytest: print("串口是否打开:",ser_port.isOpen())
pyusb
安装模块
pip install pyusb
在设备列表中找到要使用的USB,如下图所示:

请注意上述的VID_0A12以及PID_0001;这个在使用USB接口时要用到VID以及PID;
# FileName : usbdemo.py
# Author : Adil
# DateTime : 2019/9/1 10:26
# SoftWare : PyCharm import usb all_devs = usb.core.find(find_all=True) print(all_devs)
for d in all_devs:
if (d.idVendor == 'VID_04F2') & (d.idProduct == 'PID_B541'):
print(d)
遇到报错:“usb.core.NoBackendError No backend available”
如果执行时遇到上面的错误,解决办法
最近一个案子是要用到USB信息交互,获取电脑连接的USB设备,主要是用到pyusb的库,按照网上的教程和代码,但是遇到了报错:usb.core.NoBackendError No backend available ,网上关于这个错误的解决方案也有不少,但是大部分都是英文,而且有些试了下并没有效果,不过好在最后还是完美解决,这里记录下。
我是根据他的解决方案来解决的,我的操作系统是Windows10_64位。
首先,打开链接,网页会自动下载libusb-1.0.20的压缩包
打开压缩包,选择MS64\dll\libusb-1.0.dll,复制到C:\Windows\System32
然后选择同目录下的libusb-1.0.lib到Python环境,我用的环境是conda的Python,所以就复制到D:\Anaconda3\Lib下
然后执行程序即可打印usb信息。
python 之serial、pyusb 使用开发的更多相关文章
- [Python] 利用Django进行Web开发系列(二)
1 编写第一个静态页面——Hello world页面 在上一篇博客<[Python] 利用Django进行Web开发系列(一)>中,我们创建了自己的目录mysite. Step1:创建视图 ...
- 程序员带你十天快速入门Python,玩转电脑软件开发(四)
本系列文章立志于从一个已经习得一门编程语言的基础之上,全面介绍Python的相关开发过程和相关经验总结.本篇文章主要是基于上一篇的程序员带你十天快速入门Python,玩转电脑软件开发(三)的基础之上, ...
- 程序员带你十天快速入门Python,玩转电脑软件开发(三)
声明:本次教程主要适用于已经习得一门编程语言的程序员.想要学习第二门语言.有梦想,立志做全栈攻城狮的你 . 如果是小白,也可以学习本教程.不过可能有些困难.如有问题在文章下方进行讨论.或者添加QQ群5 ...
- 程序员带你十天快速入门Python,玩转电脑软件开发(二)
关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 如果你真想学习,请评论学过的每篇文章,记录学习的痕迹. 请把所有教程文章中所提及的代码,最少敲写三遍,达到 ...
- 程序员带你十天快速入门Python,玩转电脑软件开发(一)
关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 如果你真想学习,请评论学过的每篇文章,记录学习的痕迹. 请把所有教程文章中所提及的代码,最少敲写三遍,达到 ...
- Nginx+Python+uwsgi+Django的web开发环境安装及配置
Nginx+Python+uwsgi+Django的web开发环境安装及配置 nginx安装 nginx的安装这里就略过了... python安装 通常系统已经自带了,这里也略过 uwsgi安装 官网 ...
- Python十分适合用来开发网页爬虫
Python十分适合用来开发网页爬虫,理由如下:1.抓取网页自身的接口比较与其他静态编程语言,如java,c#,c++,python抓取网页文档的接口更简练:比较其他动态脚本语言,如perl,shel ...
- 在windows下使用多版本Python安装相应的虚拟开发环境
在windows下面使用多版本Python安装相应的虚拟开发环境 在搭建一个项目的时候,希望使用最新版的Python3.7版本,但是Python3.6的版本也要留下,那么问题来了,如何解决这个问题 ...
- Python windows serial
Python windows serial 一.参考文章: Serial port programming http://www.cnblogs.com/2zhyi/p/3405339.html py ...
- python 3 serial module install
/************************************************************************* * python 3 serial module ...
随机推荐
- BayaiM__MySQL 5.7 新特性详解
原创 作者:bayaim 时间:2016-06-15 11:40:50 122 0 阅读(22130) | 评论(43443) | 转发(3232 ...
- spark streaming checkpointing windows
spark streaming的相关概念: spark的核心是创建一个RDD对象,然后对RDD对象进行计算操作等 streaming可以理解为是 一个连续不断的数据流 ,然后将每个固定时间段里的数据构 ...
- 1. Go语言—初始
一.golang语言特性 1. 垃圾回收 内存自动回收,再也不需要开发人员管理内存 开发人员专注业务实现,降低了心智负担 只需要new分配内存,不需要释放 2. 天然并发 从语言层面支持并发,非常简单 ...
- NOIP模拟赛 最佳组合
题目描述 Description \(Bzeroth\) 大陆最终还是覆灭了,所以你需要为地灾军团服务了. 地灾军团军师黑袍不擅长写题面,所以你只需要看简化版的题意即可. 给定 \(3\) 个长度均为 ...
- git--配置文件、.gitignore
配置文件 git给我们提供了三种配置文件的方法,一种是项目配置文件,一种是全局配置文件,还有一种是系统配置文件. 在我们第一次使用git commit提交代码的时候,git让我们配置用户名和邮箱 全局 ...
- CF-1175 B.Catch Overflow!
题目大意:有一个初始变量,值为0,三种操作 for x 一个循环的开始,循环x次 end 一个循环的结束 add 将变量值加一 问最后变量的值是否超过2^32-1,若超过,输出一串字符,不超过则输出变 ...
- POJ2976Dropping tests(分数规划)
传送门 题目大意:n个二元组a[i],b[i],去掉k个,求sigma a[i]/ sigma b[i]的最大值 代码: #include<iostream> #include<cs ...
- ubuntu串口连接linux车机设备
一.用到的命令或者程序 1.dmesg命令 2.minicom软件 二.开搞 1.安装minicom sudo apt-get install minicom 2.查看串口信息 dmesg | gre ...
- ROS机器人路径规划介绍--全局规划
ROS机器人路径规划算法主要包括2个部分:1)全局路径规划算法:2)局部路径规划算法: 一.全局路径规划 global planner ROS 的navigation官方功能包提供了三种全局路径规划器 ...
- VMware exsi虚拟机磁盘扩容
创建Linux时分配磁盘空间随着使用的增加,使用率逐渐升高,需要对/root进行扩容,此时需要在添加或者扩展一下磁盘. 查看Linux版本信息 [root@localhost ~]# cat /etc ...