python使用Serial模块读取串口数据
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
python使⽤Serial模块读取串⼝数据前⾔
pyserial 模块封装了对串⼝的访问,兼容各种平台。
使⽤
模块安装
pip install pyserial
初始化
import serial
ser = serial.Serial('com1', 9600, timeout=1)
ser = serial.Serial("/dev/ttyUSB0", 9600, timeout=0.5) # 使⽤USB连接串⾏⼝
ser = serial.Serial("/dev/ttyAMA0", 9600, timeout=0.5) # 使⽤树莓派的GPIO⼝连接串⾏⼝
ser = serial.Serial(1, 9600, timeout=0.5)# winsows系统使⽤com1⼝连接串⾏⼝
ser = serial.Serial("com1", 9600, timeout=0.5)# winsows系统使⽤com1⼝连接串⾏⼝
ser = serial.Serial("/dev/ttyS1", 9600, timeout=0.5)# Linux系统使⽤com1⼝连接串⾏⼝
不同平台下初始化
对象属性
name——设备名字
port——读或者写端⼝
baudrate——波特率
bytesize——字节⼤⼩
parity——校验位
stopbits——停⽌位
timeout——读超时设置
writeTimeout——写超时
xonxoff——软件流控
rtscts——硬件流控
dsrdtr——硬件流控
interCharTimeout——字符间隔超时
对象常⽤⽅法
ser.isOpen()——查看端⼝是否被打开
ser.open() ——打开端⼝
ser.close()——关闭端⼝
ser.read()——从端⼝读字节数据。
默认1个字节
ser.read_all()——从端⼝接收全部数据
ser.write("hello")——向端⼝写数据
ser.readline()——读⼀⾏数据
ser.readlines()——读多⾏数据
in_waiting()——返回接收缓存中的字节数
flush()——等待所有数据写出
flushInput()——丢弃接收缓存中的所有数据
flushOutput()——终⽌当前写操作,并丢弃发送缓存中的数据。
实例
#coding=gb18030
import threading
import time
import serial
class ComThread:
def__init__(self, Port='COM3'):
self.l_serial = None
self.alive = False
self.waitEnd = None
self.port = Port
self.ID = None
self.data = None
def waiting(self):
if not self.waitEnd is None:
self.waitEnd.wait()
def SetStopEvent(self):
if not self.waitEnd is None:
self.waitEnd.set()
self.alive = False
self.stop()
def start(self):
self.l_serial = serial.Serial()
self.l_serial.port = self.port
self.l_serial.baudrate = 115200
self.l_serial.timeout = 2
self.l_serial.open()
if self.l_serial.isOpen():
self.waitEnd = threading.Event()
self.alive = True
self.thread_read = None
self.thread_read = threading.Thread(target=self.FirstReader) self.thread_read.setDaemon(1)
self.thread_read.start()
return True
else:
return False
def SendDate(self,i_msg,send):
lmsg = ''
isOK = False
if isinstance(i_msg):
lmsg = i_msg.encode('gb18030')
else:
lmsg = i_msg
try:
# 发送数据到相应的处理组件
self.l_serial.write(send)
except Exception as ex:
pass;
return isOK
def FirstReader(self):
while self.alive:
time.sleep(0.1)
data = ''
data = data.encode('utf-8')
n = self.l_serial.inWaiting()
if n:
data = data + self.l_serial.read(n)
print('get data from serial port:', data)
print(type(data))
n = self.l_serial.inWaiting()
if len(data)>0 and n==0:
try:
temp = data.decode('gb18030')
print(type(temp))
print(temp)
car,temp = str(temp).split("\n",1)
print(car,temp)
string = str(temp).strip().split(":")[1]
str_ID,str_data = str(string).split("*",1)
print(str_ID)
print(str_data)
print(type(str_ID),type(str_data))
if str_data[-1]== '*':
break
else:
print(str_data[-1])
print('str_data[-1]!=*')
except:
print("读卡错误,请重试!\n")
self.ID = str_ID
self.data = str_data[0:-1]
self.waitEnd.set()
self.alive = False
def stop(self):
self.alive = False
self.thread_read.join()
if self.l_serial.isOpen():
self.l_serial.close()
#调⽤串⼝,测试串⼝
def main():
rt = ComThread()
rt.sendport = '**1*80*'
try:
if rt.start():
print(rt.l_)
rt.waiting()
print("The data is:%s,The Id is:%s"%(rt.data,rt.ID))
rt.stop()
else:
pass
except Exception as se:
print(str(se))
if rt.alive:
rt.stop()
print('')
print ('End OK .')
temp_ID=rt.ID
temp_data=rt.data
del rt
return temp_ID,temp_data
if__name__ == '__main__':
#设置⼀个主函数,⽤来运⾏窗⼝,便于若其他地⽅下需要调⽤串⼝是可以直接调⽤main函数 ID,data = main()
print("******")
print(ID,data)
View Code。