python3.6串口编程实例_python3 Serial 串口助手的接收读取数据

其实网上已经有许多python语言书写的串口,但大部分都是python2写的,没有找到一个合适的python编写的串口助手,只能自己来写一个串口助手,由于我只需要串口能够接收读取数据就可以了,故而这个串口助手只实现了数据的接收读取。

创建串口助手首先需要创建一个类,重构类的实现过程如下:

1 #coding=gb18030

2

3 importthreading4 importtime5 importserial6

7 classComThread:8 def __init__(self, Port='COM3'):9 #构造串口的属性

10 self.l_serial =None11 self.alive =False12 self.waitEnd =None13 self.port =Port14 self.ID =None15 self.data =None16 #定义串口等待的函数

17 defwaiting(self):18 if not self.waitEnd isNone:19 self.waitEnd.wait()20

21 defSetStopEvent(self):22 if not self.waitEnd isNone:23 self.waitEnd.set()24 self.alive =False25 self.stop()26 #启动串口的函数

27 defstart(self):28 self.l_serial =serial.Serial()29 self.l_serial.port =self.port30 self.l_serial.baudrate = 115200

31 #设置等待时间,若超出这停止等待

32 self.l_serial.timeout = 2

33 self.l_serial.open()34 #判断串口是否已经打开

35 ifself.l_serial.isOpen():36 self.waitEnd =threading.Event()37 self.alive =True38 self.thread_read =None39 self.thread_read = threading.Thread(target=self.FirstReader)40 self.thread_read.setDaemon(1)41 self.thread_read.start()42 returnTrue43 else:44 return False

创建好类后,就要实现串口读取的功能,其读取数据的函数如下:

首先要创建一个字符串来存放接收到的数据:

data = ''data= data.encode('utf-8')#由于串口使用的是字节,故而要进行转码,否则串口会不识别

在创建好变量来接收数据后就要开始接收数据:

1 n = self.l_serial.inWaiting()#获取接收到的数据长度

2 ifn:3 #读取数据并将数据存入data

4 data = data +self.l_serial.read(n)5 #输出接收到的数据

6 print('get data from serial port:', data)7 #显示data的类型,便于如果出错时检查错误

8 print(type(data))

将数据接收完后,就要对接收到的数据进行处理,提取出有用信息,由于下位机使用的协议不一样,因此处理的方法也不一样,我使用的协议是**+ID+*Data+*,因此我的提取方法如下:

#获取还没接收到的数据长度

n = self.l_serial.inWaiting()

#判断是否已经将下位机传输过来的数据全部提取完毕,防止之前没有获取全部数据

if len(data)>0 and n==0:

try:

#将数据转换为字符型

temp = data.decode('gb18030')

#输出temp类型,看转码是否成功

print(type(temp))

#输出接收到的数据

print(temp)

将数据按换行分割并输出

car,temp = str(temp).split("\n",1)

print(car,temp)

#将temp按':'分割,并获取第二个数据

string = str(temp).strip().split(":")[1]

#由于前面分割后的数据类型是列表,因此需要转换成字符串,而后按照'*'分割,得到的也就是我们需要的Id和data

str_ID,str_data = str(string).split("*",1)

print(str_ID)

print(str_data)

print(type(str_ID),type(str_data))

#判断data最后一位是否是'*',若是则退出,若不是则输出异常

if str_data[-1]== '*':

break

else:

print(str_data[-1])

print('str_data[-1]!=*')

except:

print("读卡错误,请重试!\n")

其输出结果为:

get data from serial port:b'ID:4A622E29\n\xbf\xa8\xd6\xd0\xbf\xe924\xca\xfd\xbe\xdd\xce\xaa:1*80*\r\n'

ID:4A622E29

卡中块24数据为:1*80*ID:4A622E29 卡中块24数据为:1*80*

1

80*

串口助手完整代码如下:

1 #coding=gb18030

2

3 importthreading4 importtime5 importserial6

7 classComThread:8 def __init__(self, Port='COM3'):9 self.l_serial =None10 self.alive =False11 self.waitEnd =None12 self.port =Port13 self.ID =None14 self.data =None15

16 defwaiting(self):17 if not self.waitEnd isNone:18 self.waitEnd.wait()19

20 defSetStopEvent(self):21 if not self.waitEnd isNone:22 self.waitEnd.set()23 self.alive =False24 self.stop()25

26 defstart(self):27 self.l_serial =serial.Serial()28 self.l_serial.port =self.port29 self.l_serial.baudrate = 115200

30 self.l_serial.timeout = 2

31 self.l_serial.open()32 ifself.l_serial.isOpen():33 self.waitEnd =threading.Event()34 self.alive =True35 self.thread_read =None36 self.thread_read = threading.Thread(target=self.FirstReader)37 self.thread_read.setDaemon(1)38 self.thread_read.start()39 returnTrue40 else:41 returnFalse42

43 defSendDate(self,i_msg,send):44 lmsg = ''

45 isOK =False46 ifisinstance(i_msg):47 lmsg = i_msg.encode('gb18030')48 else:49 lmsg =i_msg50 try:51 #发送数据到相应的处理组件

52 self.l_serial.write(send)53 exceptException as ex:54 pass;55 returnisOK56

57 defFirstReader(self):58 whileself.alive:59 time.sleep(0.1)60

61 data = ''

62 data = data.encode('utf-8')63

64 n =self.l_serial.inWaiting()65 ifn:66 data = data +self.l_serial.read(n)67 print('get data from serial port:', data)68 print(type(data))69

70 n =self.l_serial.inWaiting()71 if len(data)>0 and n==0:72 try:73 temp = data.decode('gb18030')74 print(type(temp))75 print(temp)76 car,temp = str(temp).split("\n",1)77 print(car,temp)78

79 string = str(temp).strip().split(":")[1]80 str_ID,str_data = str(string).split("*",1)81

82 print(str_ID)83 print(str_data)84 print(type(str_ID),type(str_data))85

86 if str_data[-1]== '*':87 break

88 else:89 print(str_data[-1])90 print('str_data[-1]!=*')91 except:92 print("读卡错误,请重试!\n")93

94 self.ID =str_ID95 self.data = str_data[0:-1]96 self.waitEnd.set()97 self.alive =False98

99 defstop(self):100 self.alive =False101 self.thread_read.join()102 ifself.l_serial.isOpen():103 self.l_serial.close()104 #调用串口,测试串口

105 defmain():106 rt =ComThread()107 rt.sendport = '**1*80*'

108 try:109 ifrt.start():110 print(rt.l_serial.name)111 rt.waiting()112 print("The data is:%s,The Id is:%s"%(rt.data,rt.ID))113 rt.stop()114 else:115 pass

116 exceptException as se:117 print(str(se))118

119 ifrt.alive:120 rt.stop()121

122 print('')123 print ('End OK .')124 temp_ID=rt.ID125 temp_data=rt.data126 delrt127 returntemp_ID,temp_data128

129

130 if __name__ == '__main__':131

132 #设置一个主函数,用来运行窗口,便于若其他地方下需要调用串口是可以直接调用main函数

133 ID,data =main()134

135 print("******")136 print(ID,data)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值