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

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

 #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

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

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

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

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

             n = self.l_serial.inWaiting()#获取接收到的数据长度
if n:
#读取数据并将数据存入data
data = data + self.l_serial.read(n)
#输出接收到的数据
print('get data from serial port:', data)
#显示data的类型,便于如果出错时检查错误
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'
<class 'bytes'>
<class 'str'>
ID:4A622E29
卡中块24数据为:1*80* ID:4A622E29 卡中块24数据为:1*80* 1
80*
<class 'str'> <class 'str'>

串口助手完整代码如下:

 #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_serial.name)
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)

python3 Serial 串口助手的接收读取数据的更多相关文章

  1. XCOM串口助手打印不出数据

    本次实验是在基于原子的战舰开发板上的做定时器捕获实验,程序源码下载到板子上运行正常.指示灯正常显示,打开XCOM识别不来串口,原因:硬件上没有插USB转串口线: 连接上USB转串口线,软件上以显示CH ...

  2. 31.用python中的serial向串口发送和接收数据(案例一)

    代码功能说明:1.向串口助手发送十六进制数据:0X01,0X03,0X00,0X00,0X00,0X01,0X84,0X0A: 2.用串口助手向代码发送数据,并将发送过来的数据保存在数据库中,按数据和 ...

  3. STM32 HAL库利用DMA实现串口不定长度接收方法

    参考:https://blog.csdn.net/u014470361/article/details/79206352 我这里使用的芯片是 F1 系列的,主要是利用 DMA 数据传输方式实现的,在配 ...

  4. QT串口助手(三):数据接收

    作者:zzssdd2 E-mail:zzssdd2@foxmail.com 一.前言 开发环境:Qt5.12.10 + MinGW 实现的功能 串口数据的接收 ascii字符形式显示与hex字符形式显 ...

  5. VS编程,C#串口通讯,通过串口读取数据的一种方法

    一.可能需要的软件:1.虚拟串口vspd(Virtual Serial Port Driver,用来在电脑上虚拟出一对串口,模拟通讯. 2.友善串口调试助手,用来发送.读取数据. 二.思路1.查询本机 ...

  6. C#串口通信—向串口发送数据,同步接收返回数据

    最近写C#串口通信程序,系统是B/S架构.SerialPort类有一个DataReceived事件,用来接收串口返回的数据,但这种方式在C/S架构下很好用,但B/S就不好处理了.所以写了一个同步模式接 ...

  7. QT串口助手(四):数据发送

    作者:zzssdd2 E-mail:zzssdd2@foxmail.com 一.前言 开发环境:Qt5.12.10 + MinGW 实现的功能 串口数据的发送 ascii字符与hex字符的相互转换 自 ...

  8. live555从RTSP服务器读取数据到使用接收到的数据流程分析

    本文在linux环境下编译live555工程,并用cgdb调试工具对live555工程中的testProgs目录下的openRTSP的执行过程进行了跟踪分析,直到将从socket端读取视频数据并保存为 ...

  9. Python3 Tcp未发送/接收完数据即被RST处理办法

    一.背景说明 昨天一个同事让帮忙写个服务,用于接收并返回他那边提交过来的数据,以便其查看提交的数据及格式是否正确. 开始想用django写个接口,但写接口接口名称就得是定死的,他那边只能向这接口提交数 ...

随机推荐

  1. Java注解(2)-注解处理器(运行时|RetentionPolicy.RUNTIME)

    如果没有用来读取注解的工具,那注解将基本没有任何作用,它也不会比注释更有用.读取注解的工具叫作注解处理器.Java提供了两种方式来处理注解:第一种是利用运行时反射机制:另一种是使用Java提供的API ...

  2. hibernate框架学习笔记8:一对多关系案例

    两个实体类:客户与联系人,一个客户可以有多个联系人 客户类: package domain; import java.util.HashSet; import java.util.Set; //客户实 ...

  3. Beta冲刺第五天

    一.昨天的困难 没有困难. 二.今天进度 1.林洋洋:日程刷新重构. 2.黄腾达:创建协作日程当选择只触发一次时自动填充1,并禁用input. 3.张合胜:修复列表显示日程重复单位的格式化. 三.明日 ...

  4. 团队项目7——团队冲刺(beta版本)

    beta版本冲刺计划安排:http://www.cnblogs.com/ricardoCYF/p/8018413.html 12.06:http://www.cnblogs.com/ricardoCY ...

  5. linux 50个常用命令

    1.ls命令 ls是list的缩写,常用命令为ls(显示出当前目录列表),ls -l(详细显示当前目录列表),ls -lh(人性化的详细显示当前目录列表),ls -a(显示出当前目录列表,包含隐藏文件 ...

  6. c# windows service 实现监控其他程序是否被关闭,关闭则报警

    namespace MonitorService { public partial class MonitorSv : ServiceBase { string AppName = "&qu ...

  7. Vue.js自己从官网整理的东东

    1.采用简洁的模板语法来声明渲染数据: <div id="app"> {{ message }} </div> var app = new Vue({ el ...

  8. tomcat-theory

    (一) java类:applet,servlet,jsp JSP:.jsp-->.java-->(JVM).classJDK:javac,.java-->.classweb:Serv ...

  9. Linux搭建Apache+Tomcat实现负载均衡

    一.首先需要安装java,详见http://www.cnblogs.com/fun0623/p/4350004.html 二.编译安装Apache,详见http://www.cnblogs.com/f ...

  10. SpringBoot实现多环境配置

    1.为什么需要配置多环境配置 在实际的开发中,我们往往需要在不同的环境中使用不同的数据库.缓存配置,如果使用同一套配置文件,在不同环境部署的时候手动去修改配置文件,会使部署变得很繁琐.使用多环境配置文 ...