其实网上已经有许多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

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

= 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'>

串口助手完整代码如下:

  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 串口助手的接收读取数据相关推荐

  1. Linux下的Ubuntu16.04系统配置并使用USB转串口(串口转USB),最终使用python的serial和pyserial包实现串口的打开并读取数据

    1. USB转串口的配置 1.1 首先使用 lsmod | grep usbserial 指令查看系统是否包含USB转串口驱动,如果没有信息输出不代表没有驱动,我这边就是没有信息输出,且看后面分析: ...

  2. python二维数组按列读取数据

    python二维数组按列读取数据 a=np.array([[1,2,3],[1,2,3]]) a[:,1] 输出array([2, 2])

  3. STM32F103RC串口发送数据1使LED闪烁---串口助手作为主机发送数据1,单片机作为从机接收

    主要是一个函数的使用, 串口助手发送的数据1 这个是接收1 if(USART_RX_BUF[0]=='1') 主函数这样写会 接收数据1  使LED闪烁 int main(void){ u8 t;u8 ...

  4. SSCOM串口助手对于接收到的中文编码字符串的兼容性测试

    下面是用Python写的测试代码 #!/usr/bin/python # -*- coding: utf-8 -*- """ 单元测试:Python串口发送中文,SSCO ...

  5. STM32串口通信串口助手收不到数据

    问题: 已经确定代码是没有问题的,但是串口调试助手就是收不到消息 解决办法: 别急,我来帮你 右击工程,选择Options for Target 'test' 然后...... 这里打勾, 然后,OK ...

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

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

  7. python实现从word固定表格读取数据写入到excel固定位置

    #前提:同事的工作是每天做合同下单,每天要从好多个word中粘贴数据到excel太麻烦了,然后让帮忙看看能不能做一个.exe的程序,每次自动填写,需要手敲的地方在自行填写,也会方便很多,于是有了这篇~ ...

  8. python实现mqtt_Python实现MQTT接收订阅数据

    一.背景 目前MQTT的标准组织官网:http://www.mqtt.org,里面列出了很多支持的软件相关资源. 一个轻量级的MQTT服务器是:http://www.mosquitto.org,可以运 ...

  9. python串口通信的接收与发送_31.用python中的serial向串口发送和接收数据(案例一)...

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

最新文章

  1. 漫画详解:厌氧君和好氧君,谁才是明日之子?
  2. 多媒体计算机系统是能进行获取,第六章 7 多媒体计算机系统.pdf
  3. 区块链智能合约入门:Hello world(2)
  4. aix 查看目前java进程_问一个 AIX 的命令 ps -ef|grep java
  5. jmeter java接口,jmeter并发测试java接口 | 学步园
  6. go 错误处理总结
  7. postman发送Post请求
  8. 分析了 Stack Overflow、Reddit 等 9 个榜单,Python 第一的地位稳了!
  9. vue-element超初级教学
  10. 【读书笔记《Android游戏编程之从零开始》】11.游戏开发基础(SurfaceView 游戏框架、View 和 SurfaceView 的区别)...
  11. linux驱动访问内存,linux驱动笔记八(内存与IO访问)
  12. CSS长度单位及区别 em ex px pt in
  13. 构建根文件系统之启动第一个程序(韦大仙)
  14. idea 正则表达式替换
  15. LAMP之PHP服务的安装(libphp7.so方式)
  16. 持续更新免费的 API,做一个 API 的搬运工
  17. 下载网页TS流视频无需手动合并
  18. PyCharm大学生教育账户激活
  19. 计算机RRC是什么指令,srb0 srb1 srb2的区别_srb什么意思_srb1 RRC建立请求
  20. selenium上传附件的两种方式(普通上传和借助AutoIt识别Windows上传窗口)

热门文章

  1. webpack打包 iPhone7 iOS10.3.3 hybird vue H5离线包白屏问题
  2. 延时队列方案选择及优缺点分析
  3. 三星 android 5.0 root,三星e330s 5.0 root教程及获取5.0的root权限
  4. 企业私域流量带给企业的四个价值
  5. 提升Python学习效率的方法
  6. 碳排放数据查询网站汇总-权威
  7. SIFT特征原理及步骤
  8. django中定时任务的实现
  9. 计算机技术应用论文范文,计算机技术应用论文2400字_计算机技术应用毕业论文范文模板.doc...
  10. 如何进行链路捆绑(详细实验流程)