python串口通信_Python实现串口通信(pyserial)

importserialimportserial.tools.list_portsclassCommunication():#初始化

def __init__(self,com,bps,timeout):

self.port=com

self.bps=bps

self.timeout=timeoutglobalRettry:#打开串口,并得到串口对象

self.main_engine= serial.Serial(self.port,self.bps,timeout=self.timeout)#判断是否打开成功

if(self.main_engine.is_open):

Ret=TrueexceptException as e:print("---异常---:", e)#打印设备基本信息

defPrint_Name(self):print(self.main_engine.name) #设备名字

print(self.main_engine.port)#读或者写端口

print(self.main_engine.baudrate)#波特率

print(self.main_engine.bytesize)#字节大小

print(self.main_engine.parity)#校验位

print(self.main_engine.stopbits)#停止位

print(self.main_engine.timeout)#读超时设置

print(self.main_engine.writeTimeout)#写超时

print(self.main_engine.xonxoff)#软件流控

print(self.main_engine.rtscts)#软件流控

print(self.main_engine.dsrdtr)#硬件流控

print(self.main_engine.interCharTimeout)#字符间隔超时

#打开串口

defOpen_Engine(self):

self.main_engine.open()#关闭串口

defClose_Engine(self):

self.main_engine.close()print(self.main_engine.is_open) #检验串口是否打开

#打印可用串口列表

@staticmethoddefPrint_Used_Com():

port_list=list(serial.tools.list_ports.comports())print(port_list)#接收指定大小的数据

#从串口读size个字节。如果指定超时,则可能在超时后返回较少的字节;如果没有指定超时,则会一直等到收完指定的字节数。

defRead_Size(self,size):return self.main_engine.read(size=size)#接收一行数据

#使用readline()时应该注意:打开串口时应该指定超时,否则如果串口没有收到新行,则会一直等待。

#如果没有超时,readline会报异常。

defRead_Line(self):returnself.main_engine.readline()#发数据

defSend_data(self,data):

self.main_engine.write(data)#更多示例

#self.main_engine.write(chr(0x06).encode("utf-8")) # 十六制发送一个数据

#print(self.main_engine.read().hex()) # # 十六进制的读取读一个字节

#print(self.main_engine.read())#读一个字节

#print(self.main_engine.read(10).decode("gbk"))#读十个字节

#print(self.main_engine.readline().decode("gbk"))#读一行

#print(self.main_engine.readlines())#读取多行,返回列表,必须匹配超时(timeout)使用

#print(self.main_engine.in_waiting)#获取输入缓冲区的剩余字节数

#print(self.main_engine.out_waiting)#获取输出缓冲区的字节数

#print(self.main_engine.readall())#读取全部字符。

#接收数据

#一个整型数据占两个字节

#一个字符占一个字节

defRecive_data(self,way):#循环接收数据,此为死循环,可用线程实现

print("开始接收数据:")whileTrue:try:#一个字节一个字节的接收

ifself.main_engine.in_waiting:if(way ==0):for i inrange(self.main_engine.in_waiting):print("接收ascii数据:"+str(self.Read_Size(1)))

data1= self.Read_Size(1).hex()#转为十六进制

data2 = int(data1,16)#转为十进制

if (data2 == "exit"): #退出标志

break

else:print("收到数据十六进制:"+data1+"收到数据十进制:"+str(data2))if(way == 1):#整体接收

#data = self.main_engine.read(self.main_engine.in_waiting).decode("utf-8")#方式一

data = self.main_engine.read_all()#方式二

if (data == "exit"): #退出标志

break

else:print("接收ascii数据:", data)exceptException as e:print("异常报错:",e)

Communication.Print_Used_Com()

Ret=False #是否创建成功标志

Engine1= Communication("com12",115200,0.5)if(Ret):

Engine1.Recive_data(0)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值