说明:本次是在windows 系统操作实现的。

使用场景,获取得力扫码枪的扫码数据,该扫码枪支持三种通讯接口设置,如下图

即插即用的是 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

importserial#这里使用的是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

importserial

ser= serial.Serial(‘COM6‘, 9600,timeout=0.5)#ser = serial.Serial(‘COM6‘, 9600)

print(ser.name)print(ser.port)if notser.isOpen():

ser.open()print(‘com3 is open‘, ser.isOpen())#获取一行信息

defrecv(serial):print(‘2‘)

data= ‘‘

while serial.inWaiting() >0:print(serial.inWaiting())print(‘3‘)#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("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")returndata#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

whileTrue:print(‘1‘)

data=recv(ser)print(‘4‘)if data != ‘‘:print(‘5‘)print(data)breakser.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()都需要设置超时时间

importserialimportserial.tools.list_ports#测试调试输出开关,正式发布需调整为False

mytest =True#mytest = False

defgetPort():

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 inport_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=filenameprint(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 notser_port.isOpen():

ser_port.open()print("串口是否打开:",ser_port.isOpen())

f= open(filename_1,‘rb‘)#打开或者新建一个文件

i=0while 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)exceptException: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=filenameprint(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 notser_port.isOpen():

ser_port.open()print("串口是否打开:",ser_port.isOpen())#f = open(filename_1,‘w‘,encoding=‘utf-8‘)#打开或者新建一个文件

f = open(filename_1,‘wb‘)#以二进制打开或创建一个文件

whileTrue:

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)exceptException:print("获取脚本失败")finally:

f.close()

ser_port.close()if mytest: print("串口是否打开:",ser_port.isOpen())

python 扫描枪_python 之serial、pyusb 使用开发相关推荐

  1. python串口类_Python中serial的使用

    一.概述 pyserial模块封装了对串口的访问. 二.特性 在支持的平台上有统一的接口. 通过python属性访问串口设置. 支持不同的字节大小.停止位.校验位和流控设置. 可以有或者没有接收超时. ...

  2. python守护多线程_Python守护进程(多线程开发)入门实例

    这篇文章主要为大家详细介绍了Python守护进程(多线程开发)入门实例,具有一定的参考价值,可以用来参考一下. 对python这个高级语言感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧! ...

  3. python微信集成_Python微信公众号后台开发005:集成智能聊天机器人​

    ​给公众号集成一个智能聊天机器人 一.前述 ChatterBot是一个基于机器学习的聊天机器人引擎,构建在python上,主要特点是可以自可以从已有的对话中进行学(jiyi)习(pipei). 二.具 ...

  4. 如何用python做界面_Python+AutoIt实现界面工具开发

    原标题:Python+AutoIt实现界面工具开发 前言 不同于Linux服务器上的命令行操作,在windows系统上用户的使用习惯还是倾向于使用有界面的工具.如果工具是命令行交互操作的方式,可能是有 ...

  5. python扫描目录下文件_Python扫描目录读取文件,不考虑子目录

    这篇文章主要为大家详细介绍了Python扫描目录读取文件,不考虑子目录,具有一定的参考价值,可以用来参考一下. 感兴趣Python扫描目录读取文件,不考虑子目录的小伙伴,下面一起跟随512笔记的小编罗 ...

  6. python获取usb扫描枪数据线_GitHub - liz7up/USB4ScanGun: USB扫描枪识别,已获取对应扫描枪返回值的测试程序...

    USB4ScanGun PS:最近在测试点东西,要看这个项目的朋友麻烦用稍早前的版本.之后测试结果也会写在这里,或者博客中的.--2014年9月28日 USB扫描枪识别,已获取对应扫描枪返回值的测试程 ...

  7. python获取usb扫描枪数据_GitHub - RobinGitHub/USB4ScanGun: USB扫描枪识别,已获取对应扫描枪返回值的测试程序...

    USB4ScanGun PS:最近在测试点东西,要看这个项目的朋友麻烦用稍早前的版本.之后测试结果也会写在这里,或者博客中的.--2014年9月28日 USB扫描枪识别,已获取对应扫描枪返回值的测试程 ...

  8. CPT-1166/1266蓝牙无线扫描枪

    CPT-1166/1266蓝牙无线扫描枪特性: 安全线性成像技术,标准激光扫描枪 可视距离大于50米 重量:200g 工作时间:50小时 景深:大于63cm 理想的零售业应用  扫描枪:蓝牙Class ...

  9. Python学习教程(Python学习视频_Python学些路线):Day05 总结和练习

    Python学习教程(Python学习视频_Python学些路线):总结和练习 练习清单 寻找"水仙花数". 寻找"完美数". "百钱百鸡" ...

最新文章

  1. 《OpenCV3编程入门》学习笔记9 直方图与匹配(五)模板匹配
  2. fancybox关闭弹出窗体parent.$.fancybox.close();
  3. 雅虎开源可以提升流操作速度的DataSketches
  4. locate: database too small: /var/db/locate.databas
  5. 《C++ Primer 5th》笔记(7 / 19):类
  6. foreman容器化部署
  7. 站内搜索(ELK)之数据表字典类型字段的索引思路
  8. 中国现代远程与继续教育网 统考 大学英语(B)考试大纲
  9. Elasticsearch5.X 搜索引擎框架 安装配置及analysis-ik中文分词插件安装
  10. 用matlab解拉格朗日,用MATLAB实现拉格朗日插值
  11. 【广东大学生网络攻防大赛-WriteUp(非官方)】Pwn | jmp_rsp
  12. 天津大学材料与化工考研考情与难度、参考书及上岸前辈备考经验
  13. 使用php生成条形码
  14. 一招教你解决Rational rose画时序图(Sequence diagram)时找不到参与者(Actor)的尴尬现场
  15. java计算两个经纬度之间的直线距离
  16. 还原魔方的软件(十月三十日更新)
  17. 论文《Reasoning With Neural Tensor Networks for Knowledge Base Completion》的学习笔记
  18. STL全特化 偏特化 成员特化
  19. canvas绘图有锯齿毛边问题的解决
  20. 4年小Java的心路历程,工作感悟

热门文章

  1. 程序员的算法课(8)-贪心算法:理解霍夫曼编码
  2. 你需要知道的基础算法知识——STL和基础数据结构(六)
  3. 【docker系列】docker基本常用命令
  4. 用java做登录界面_求用JAVA编写的登陆界面!
  5. (开源)XMind2TestCase一个高效的测试用例设计解决方案
  6. git-stash简单用法
  7. 【Jquery系列】之DOM属性
  8. 《为iPad而设计:打造畅销App》——抓住iPad的核心用法
  9. JAVA并发,线程异常捕获
  10. Unity3D 优化相关