python3 Serial 串口助手的接收读取数据

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

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

 1 #coding=gb18030
 2
 3 import threading
 4 import time
 5 import serial
 6
 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+*,因此我的提取方法如下:

            #获取还没接收到的数据长度
            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‘>

串口助手完整代码如下:

  1 #coding=gb18030
  2
  3 import threading
  4 import time
  5 import serial
  6
  7 class ComThread:
  8     def __init__(self, Port=‘COM3‘):
  9         self.l_serial = None
 10         self.alive = False
 11         self.waitEnd = None
 12         self.port = Port
 13         self.ID = None
 14         self.data = None
 15
 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 = False
 24         self.stop()
 25
 26     def start(self):
 27         self.l_serial = serial.Serial()
 28         self.l_serial.port = self.port
 29         self.l_serial.baudrate = 115200
 30         self.l_serial.timeout = 2
 31         self.l_serial.open()
 32         if self.l_serial.isOpen():
 33             self.waitEnd = threading.Event()
 34             self.alive = True
 35             self.thread_read = None
 36             self.thread_read = threading.Thread(target=self.FirstReader)
 37             self.thread_read.setDaemon(1)
 38             self.thread_read.start()
 39             return True
 40         else:
 41             return False
 42
 43     def SendDate(self,i_msg,send):
 44         lmsg = ‘‘
 45         isOK = False
 46         if isinstance(i_msg):
 47             lmsg = i_msg.encode(‘gb18030‘)
 48         else:
 49             lmsg = i_msg
 50         try:
 51             # 发送数据到相应的处理组件
 52             self.l_serial.write(send)
 53         except Exception as ex:
 54             pass;
 55         return isOK
 56
 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                         break
 88                     else:
 89                         print(str_data[-1])
 90                         print(‘str_data[-1]!=*‘)
 91                 except:
 92                     print("读卡错误,请重试!\n")
 93
 94         self.ID = str_ID
 95         self.data = str_data[0:-1]
 96         self.waitEnd.set()
 97         self.alive = False
 98
 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)
时间: 2024-11-09 07:58:27

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

stm32RS485串口通信——中断接收发送数据

功能:通过PC机的串口调试助手发送数据给串口A,串口B接收到串口A发送的数据,再由串口B将接收到的数据返回给PC机的串口调试助手. PC->串口A->串口B->PC. 实验平台:stm32f407 /********************************************************************* 本平台具有六个串口: com1  485 com2 com3  232 需一个管脚控制DTU com4 485 com5  调试串口  TTL com6

XCOM串口助手打印不出数据

本次实验是在基于原子的战舰开发板上的做定时器捕获实验,程序源码下载到板子上运行正常.指示灯正常显示,打开XCOM识别不来串口,原因:硬件上没有插USB转串口线: 连接上USB转串口线,软件上以显示CH340串口,但是按下按键接收串口不显示数据. 排除程序自身问题,查看原理图,对比原理图发现硬件上跳帽没有连接上. 最终解决,数据打印成功: 总结: 1.检查程序,排除程序问题: 2.有原理图到实物排除硬件问题. 原文地址:https://www.cnblogs.com/conglinlixian/p

串口通信基础,接收,发送数据

通信接口背景知识 设备之间通信的方式 一般情况下,设备之间的通信方式可以分成并行通信和串行通信两种.它们的区别是: 串行通信的分类 1.按照数据传送方向,分为: 单工:数据传输只支持数据在一个方向上传输:    半双工:允许数据在两个方向上传输.但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信:它不需要独立的接收端和发送端,两者可以合并一起使用一个端口.    全双工:允许数据同时在两个方向上传输.因此,全双工通信是两个单工通信方式的结合,需要独立的接收端和发送端.

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

最近写C#串口通信程序,系统是B/S架构.SerialPort类有一个DataReceived事件,用来接收串口返回的数据,但这种方式在C/S架构下很好用,但B/S就不好处理了.所以写了一个同步模式接收返回数据的方法,不使用DataReceived事件.经过测试,可以正常使用(不支持多线程调用). 一.Machine类 1.Machine类有一个静态变量,定义如下: private static SerialPort serialPort = null; 2.向串口发送数据,同步接收返回数据的方

stm32+dht11温湿度数据实验-stm32将采集dht11温湿度通过usart1在串口助手打印

网上其实已经介绍了很多dht11这种单线通讯协议 这里就不多重复大佬们的工作了,直接上keil5工程 keil5工程百度网盘链接:https://pan.baidu.com/s/1HDNe7gUM_dplRzR_j17wtA 提取码:xpfj 另外我把dht11.c和dht11.h直接贴在下面,小伙伴可以直接移植到自己的代码中就行了 之后会把stm32的两个实验组合起来实现一个简单的室内温度计,温湿度数据显示在oled上,学以致用嘛 岂不美哉 1 #ifndef __DHT11_H 2 #def

【转载】串口中怎样接收一个完整数据包的解析

这里以串口作为传输媒介,介绍下怎样来发送接收一个完整的数据包.过程涉及到封包与解包.设计一个良好的包传输机制很有利于数据传输的稳定性以及正确性.串口只是一种传输媒介,这种包机制同时也可以用于SPI,I2C的总线下的数据传输.在单片机通信系统(多机通信以及PC与单片机通信)中,是很常见的问题. 一.根据帧头帧尾或者帧长检测一个数据帧 1.帧头+数据+校验+帧尾 这是一个典型的方案,但是对帧头与帧尾在设计的时候都要注意,也就是说帧头.帧尾不能在所传输的数据域中出现,一旦出现可能就被误判.如果用中断来

java串口助手开发记录

转载:http://blog.sina.com.cn/s/blog_ad0672d601017qjs.html 一.首先搭建平台,我用的是eclipse+rxtx+SWT. 安装eclipse就是安装java包后,然后下载eclipse即可.因为eclipse是绿色的,不用安装,下载即可用. 下载rxtx.在网上下载rxtx包含串口开发的常用函数,是开源社区的一个产物,与sun公司的comm包相同,只是调用前的导入语句由import javax.comm.*变为import gnu.io.*而已

C#:蓝牙串口读数据和写数据

原文:C#:蓝牙串口读数据和写数据 首次使用C#编写与COM口有关的程序,期间遇到了很多问题,写下自己的经验总结,如有错漏,欢迎批评指正! 1.新建一个串口类(nbsp;SerialPort类) 1 //Create a serial port for bluetooth 2 SerialPort BluetoothConnection = new SerialPort(); 2.串口端口号搜索: string[] Ports = SerialPort.GetPortNames();or (in

单片机第13课:串口通信---向计算机发送数据

JP3接P0口. #include<reg51.h> #define uchar unsigned char uchar flag,num; // void initSer(); void main() { // initSer(); while(1) { //从计算机接收到的数据马上发送给计算机 if(flag==1) { //关闭中断,否则又要进入中断服务程序,会引起恶性循环 ES = 0; flag = 0; //发送数据,向发送缓存器中写入数据 SBUF = num; while(!T