Python-Serial 串口助手的接收读取数据
其实网上已经有许多python语言书写的串口,但大部分都是python2写的,没有找到一个合适的python编写的串口助手,只能自己来写一个串口助手,由于我只需要串口能够接收读取数据就可以了,故而这个串口助手只实现了数据的接收读取。
创建串口助手首先需要创建一个类,重构类的实现过程如下:
1 #coding=gb180302 3 import threading4 import time5 import serial6 7 class ComThread:8 def __init__(self, Port='COM3'):9 #构造串口的属性 10 self.l_serial = None 11 self.alive = False 12 self.waitEnd = None 13 self.port = Port 14 self.ID = None 15 self.data = None 16 #定义串口等待的函数 17 def waiting(self): 18 if not self.waitEnd is None: 19 self.waitEnd.wait() 20 21 def SetStopEvent(self): 22 if not self.waitEnd is None: 23 self.waitEnd.set() 24 self.alive = False 25 self.stop() 26 #启动串口的函数 27 def start(self): 28 self.l_serial = serial.Serial() 29 self.l_serial.port = self.port 30 self.l_serial.baudrate = 115200 31 #设置等待时间,若超出这停止等待 32 self.l_serial.timeout = 2 33 self.l_serial.open() 34 #判断串口是否已经打开 35 if self.l_serial.isOpen(): 36 self.waitEnd = threading.Event() 37 self.alive = True 38 self.thread_read = None 39 self.thread_read = threading.Thread(target=self.FirstReader) 40 self.thread_read.setDaemon(1) 41 self.thread_read.start() 42 return True 43 else: 44 return False
创建好类后,就要实现串口读取的功能,其读取数据的函数如下:
首先要创建一个字符串来存放接收到的数据:
data = ''data = data.encode('utf-8')#由于串口使用的是字节,故而要进行转码,否则串口会不识别
在创建好变量来接收数据后就要开始接收数据:
1 n = self.l_serial.inWaiting()#获取接收到的数据长度 2 if n: 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+*,因此我的提取方法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
|
其输出结果为:
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'>
串口助手完整代码如下:
1 #coding=gb180302 3 import threading4 import time5 import serial6 7 class ComThread: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 def waiting(self):17 if not self.waitEnd is None:18 self.waitEnd.wait()19 20 def SetStopEvent(self):21 if not self.waitEnd is None:22 self.waitEnd.set()23 self.alive = False24 self.stop()25 26 def start(self):27 self.l_serial = serial.Serial()28 self.l_serial.port = self.port29 self.l_serial.baudrate = 11520030 self.l_serial.timeout = 231 self.l_serial.open()32 if self.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 return True40 else:41 return False42 43 def SendDate(self,i_msg,send):44 lmsg = ''45 isOK = False46 if isinstance(i_msg):47 lmsg = i_msg.encode('gb18030')48 else:49 lmsg = i_msg50 try:51 # 发送数据到相应的处理组件52 self.l_serial.write(send)53 except Exception as ex:54 pass;55 return isOK56 57 def FirstReader(self):58 while self.alive:59 time.sleep(0.1)60 61 data = ''62 data = data.encode('utf-8')63 64 n = self.l_serial.inWaiting()65 if n: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 break88 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 def stop(self): 100 self.alive = False 101 self.thread_read.join() 102 if self.l_serial.isOpen(): 103 self.l_serial.close() 104 #调用串口,测试串口 105 def main(): 106 rt = ComThread() 107 rt.sendport = '**1*80*' 108 try: 109 if rt.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 except Exception as se: 117 print(str(se)) 118 119 if rt.alive: 120 rt.stop() 121 122 print('') 123 print ('End OK .') 124 temp_ID=rt.ID 125 temp_data=rt.data 126 del rt 127 return temp_ID,temp_data 128 129 130 if __name__ == '__main__': 131 132 #设置一个主函数,用来运行窗口,便于若其他地方下需要调用串口是可以直接调用main函数 133 ID,data = main() 134 135 print("******") 136 print(ID,data)
来源:https://www.cnblogs.com/attentle/p/7098408.html
Python-Serial 串口助手的接收读取数据相关推荐
- Linux下的Ubuntu16.04系统配置并使用USB转串口(串口转USB),最终使用python的serial和pyserial包实现串口的打开并读取数据
1. USB转串口的配置 1.1 首先使用 lsmod | grep usbserial 指令查看系统是否包含USB转串口驱动,如果没有信息输出不代表没有驱动,我这边就是没有信息输出,且看后面分析: ...
- python二维数组按列读取数据
python二维数组按列读取数据 a=np.array([[1,2,3],[1,2,3]]) a[:,1] 输出array([2, 2])
- STM32F103RC串口发送数据1使LED闪烁---串口助手作为主机发送数据1,单片机作为从机接收
主要是一个函数的使用, 串口助手发送的数据1 这个是接收1 if(USART_RX_BUF[0]=='1') 主函数这样写会 接收数据1 使LED闪烁 int main(void){ u8 t;u8 ...
- SSCOM串口助手对于接收到的中文编码字符串的兼容性测试
下面是用Python写的测试代码 #!/usr/bin/python # -*- coding: utf-8 -*- """ 单元测试:Python串口发送中文,SSCO ...
- STM32串口通信串口助手收不到数据
问题: 已经确定代码是没有问题的,但是串口调试助手就是收不到消息 解决办法: 别急,我来帮你 右击工程,选择Options for Target 'test' 然后...... 这里打勾, 然后,OK ...
- XCOM串口助手打印不出数据
本次实验是在基于原子的战舰开发板上的做定时器捕获实验,程序源码下载到板子上运行正常.指示灯正常显示,打开XCOM识别不来串口,原因:硬件上没有插USB转串口线: 连接上USB转串口线,软件上以显示CH ...
- python实现从word固定表格读取数据写入到excel固定位置
#前提:同事的工作是每天做合同下单,每天要从好多个word中粘贴数据到excel太麻烦了,然后让帮忙看看能不能做一个.exe的程序,每次自动填写,需要手敲的地方在自行填写,也会方便很多,于是有了这篇~ ...
- python实现mqtt_Python实现MQTT接收订阅数据
一.背景 目前MQTT的标准组织官网:http://www.mqtt.org,里面列出了很多支持的软件相关资源. 一个轻量级的MQTT服务器是:http://www.mosquitto.org,可以运 ...
- python串口通信的接收与发送_31.用python中的serial向串口发送和接收数据(案例一)...
代码功能说明:1.向串口助手发送十六进制数据:0X01,0X03,0X00,0X00,0X00,0X01,0X84,0X0A: 2.用串口助手向代码发送数据,并将发送过来的数据保存在数据库中,按数据和 ...
最新文章
- 漫画详解:厌氧君和好氧君,谁才是明日之子?
- 多媒体计算机系统是能进行获取,第六章 7 多媒体计算机系统.pdf
- 区块链智能合约入门:Hello world(2)
- aix 查看目前java进程_问一个 AIX 的命令 ps -ef|grep java
- jmeter java接口,jmeter并发测试java接口 | 学步园
- go 错误处理总结
- postman发送Post请求
- 分析了 Stack Overflow、Reddit 等 9 个榜单,Python 第一的地位稳了!
- vue-element超初级教学
- 【读书笔记《Android游戏编程之从零开始》】11.游戏开发基础(SurfaceView 游戏框架、View 和 SurfaceView 的区别)...
- linux驱动访问内存,linux驱动笔记八(内存与IO访问)
- CSS长度单位及区别 em ex px pt in
- 构建根文件系统之启动第一个程序(韦大仙)
- idea 正则表达式替换
- LAMP之PHP服务的安装(libphp7.so方式)
- 持续更新免费的 API,做一个 API 的搬运工
- 下载网页TS流视频无需手动合并
- PyCharm大学生教育账户激活
- 计算机RRC是什么指令,srb0 srb1 srb2的区别_srb什么意思_srb1 RRC建立请求
- selenium上传附件的两种方式(普通上传和借助AutoIt识别Windows上传窗口)
热门文章
- webpack打包 iPhone7 iOS10.3.3 hybird vue H5离线包白屏问题
- 延时队列方案选择及优缺点分析
- 三星 android 5.0 root,三星e330s 5.0 root教程及获取5.0的root权限
- 企业私域流量带给企业的四个价值
- 提升Python学习效率的方法
- 碳排放数据查询网站汇总-权威
- SIFT特征原理及步骤
- django中定时任务的实现
- 计算机技术应用论文范文,计算机技术应用论文2400字_计算机技术应用毕业论文范文模板.doc...
- 如何进行链路捆绑(详细实验流程)