[pyserial]使用Python控制串口

本文介绍了如何在Python中使用pyserial模块来控制串口通信,特别是在树莓派上的应用。作者分享了一个自封装的串口访问类,便于在不同项目中复用,适合学习和交流。

最近在折腾树莓派,用到了串口,为了在自己的程序(基于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'))
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值