其实网上已经有许多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. 爬虫(BeautifulSoup--select--class的选择)

    <div class="item name" title="中央公园"> <a href="/Attraction_Review-g ...

  2. vue/axios请求拦截

    import axios from 'axios';import { Message } from 'element-ui';import Cookies from 'js-cookie';impor ...

  3. 修改GeoJson的网址

    http://geojson.io       可以打开自己的json  然后修改

  4. 01_搭建Linux虚拟机(下)_我的Linux之路

    原文发布在特克斯博客www.susmote.com ​ 上一节已经给大家讲解了如何用VMware安装虚拟机,但是只讲了在VMware里面的操作 接下来我们讲在Linux内部的安装步骤 首先我们启动Li ...

  5. 201621123057 《Java程序设计》第7周学习总结

    1. 本周学习总结 1.1 思维导图:Java图形界面总结 1.2 可选:使用常规方法总结其他上课内容. 2.书面作业 1. GUI中的事件处理 1.1 写出事件处理模型中最重要的几个关键词. 答: ...

  6. 学号:201621123032 《Java程序设计》第1周学习总结

    1:本周学习总结 JDK,JRE,JVM三者的含义和关系.JDK是java开发工具包,包含了java的运行环境,java工具和类文库.例如java.javac.jar....可以把 .java编译成. ...

  7. Ubuntu安装使用latex

    TeX Live is a TeX distribution to get up and running with the TeX document production system. To ins ...

  8. MySQL“Another MySQL daemon already running with the same unix socket” 报错信息处理

    Mysql "Another Mysql daemon already running with the same unix socket" 解决办法:rm var/lib/mys ...

  9. python入门(10)使用List和tuple

    python入门(10)使用List和tuple list Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 比如,列出班里所有同学的名字,就可 ...

  10. Django 相关

    Web框架本质 其实所有的Web应用本质就是一个socket服务端,而用户的浏览器就是一个socket客户端.简单的socket代码如下: import socket sk = socket.sock ...