最近在折腾树莓派,用到了串口,为了在自己的程序(基于Python)中可以控制串口的收发,便研究了下如何使用Python控制串口
在Python中控制串口,我使用的是pyserial模块,为了方便自己在其他地方的使用,封装了一个串口访问的类方便调用,在这记录下,整体类代码如下,仅供学习交流。
# coding:UTF-8
import serial
import time
import serial.tools.list_ports
'''
串口功能封装,实现的功能包括
1.自动获取计算机中的列表
2.配置串口参数包括串口号、波特率、数据位、校验位、停止位
3.收发数据
4.打开关闭串口
'''
class serial_tools:
'''
初始化:实例化类后执行的函数,实现功能如下
1.调用串口
2.设置runing状态标志位,判断串口是否处于打开状态,用于后面返回接口状态并根据状态进行打开关闭串口操作
3.打印初始化信息
'''
def __init__(self,window):
self.ser=serial.Serial()
self.runing=True
print('from '+window+' initialing serial tools...')
def Com_list(self):
'''
获取串口列表:获取计算机中所有串口,以列表形式返回。若没有实际串口,也没有虚拟串口则返回‘无可用串口’
'''
plist = list(serial.tools.list_ports.comports())
if len(plist) <= 0:
return ['无可用串口']
else:
list_com=[]
for i in range(len(plist)):
list_com.append(str(plist[i]))
return list_com
def format_serial_config(self, s_config):
'''
格式化串口配置信息:将数据位、校验位、停止位转化为pyserial中可识别的属性值,返回字典
'''
s_bytesize={'5':serial.FIVEBITS,'6':serial.SIXBITS,'7':serial.SEVENBITS,'8':serial.EIGHTBITS}
s_parity = {'None': serial.PARITY_NONE, 'Odd': serial.PARITY_ODD, 'Even': serial.PARITY_EVEN, 'Mark': serial.PARITY_MARK, 'Space': serial.PARITY_SPACE}
s_stopbits={'1':serial.STOPBITS_ONE,'1.5':serial.STOPBITS_ONE_POINT_FIVE,'2':serial.STOPBITS_TWO}
s_config['bytesize'] = s_bytesize[s_config['bytesize']]
s_config['parity'] = s_parity[s_config['parity']]
s_config['stopbits'] = s_stopbits[s_config['stopbits']]
return s_config
def rec_serial_data(self):
'''
接收数据
输入:串口连接对象
输出:接收内容
'''
try:
#print('start receive.....')
while self.runing:
while self.ser.inWaiting()>0:
return self.ser.readline()
except Exception as e:
if 'hEvent' in str(e):
pass
else:
print('%s:rec_serial_data---Exception---%s'%(time.ctime(),e))
def connect_com(self,s_config):
'''
打开串口,并接收数据
输入:串口配置信息(comnum - 串口号, combpt - 波特率, timeout - 超时时间, bytesize - 数据位, stopbits - 停止位, parity - 校验位)
输出:串口打开结果,布尔值
'''
try:
print('choose com is %s'%(s_config['comnum']))
s_config=self.format_serial_config(s_config)
if s_config['comnum']!=0 and s_config['combpt']!="" and s_config['timeout']!="":
print('start setting....')
self.ser.port=s_config['comnum']
self.ser.baudrate=s_config['combpt']
self.ser.timeout=s_config['timeout']
self.ser.parity=s_config['parity']
self.ser.bytesize=s_config['bytesize']
self.ser.stopbits=s_config['stopbits']
print('port:%s, baudrate:%s, timeout:%s, parity:%s, bytesize:%s, stopbits:%s'%(s_config['comnum'],s_config['combpt'],s_config['timeout'],s_config['parity'],s_config['bytesize'],s_config['stopbits']))
print('settings finished')
print('opening port %s...'%s_config['comnum'])
self.ser.open()
self.runing=True
print('open port %s finished'%s_config['comnum'])
if self.ser.isOpen():
print('open port %s successed\n-----'%s_config['comnum'])
return True
else:
print('open port %s failed\n-----'%s_config['comnum'])
return False
except Exception as e:
print('%s:connect_com---Exception---%s'%(time.ctime(),e))
return e
def close_com(self):
'''
关闭串口
输出:串口打开是否成功,布尔值
'''
try:
print('closing port...')
if self.ser.isOpen():
self.runing=False
self.ser.close()
print('close port finished\n-----')
return False
else:
print('port not open\n-----')
return True
except Exception as e:
print('%s:close_com---Exception---%s'%(time.ctime(),e))
return e
def send_serial_data(self,data):
'''
发送数据
输入:要发送的数据data
'''
if data is not '':
self.ser.write(data.encode('UTF-8'))
本文介绍了如何在Python中使用pyserial模块来控制串口通信,特别是在树莓派上的应用。作者分享了一个自封装的串口访问类,便于在不同项目中复用,适合学习和交流。

8707

被折叠的 条评论
为什么被折叠?



