python serial串口通信时read、readline、read_all等方法的区别

1.概况

serial在读取数据的时候具有几种方法,下面将做出解析

2.介绍

本文需要用到的几种方法和属性

方法 功能
serial.read(size) 读取size字节的数据
serial.readline() 读取一行的数据
serial.readlines() 读取多行的数据,将数据保存到数组里
serial.read_all() 读取一个timeout周期内的全部数据(常用方法)
serial.read_all 读取串口所有的参数信息
serial_timeout(参数) 超时属性,下面具体介绍

在这里插入图片描述

3.解析

(1)为了更好地介绍readAll等方法,我们先实例化一个串口对象,这里我用到了一个传感器来通信数据,在连接上串口的时候,向传感器发送一组十六进制码,会返回一组传感器的参数数据

import serial
if __name__ ='__main__':
	#初始化串口,标志位等其他属性为默认值
	serial =serial.Serial("COM6",115200,timeout=0.01)

这里的timeout是指在设定的timeout时间范围内,如果读取的字节数据是有效的(就是非空)那就直接返回,否则一直会等到这个设定的timeout时间并返回这段时间所读的全部字节数据。

也就是说,如果我的timeout设置为0.01,现在我发送一个16进制数组给传感器,传感器如果在0.01秒内将所有数据都传输过来,就保存到缓存中,到了0.01秒后再自动发送回给我。如果我在0.01秒内没有将数据发送全的话,就会返回不完全的数据;如果我在0.01秒内发送了两次16进制数组的话,传感器就会返回两组合在一起的数据。

所以我0.3秒发送了一次数据,timeout设置0.01,就可以返回一次完整的数据;如果我0.01秒发送一次数据,timeout设置0.3,那么一次就会返回30次数据,所以这就是timeout的作用。

(2)让我们看看是否连接成功,有数据传回来

同时,我们可以看到,我们在串口通信的时候一般只会使用readAll方法,其他方法很大程序上会引起数据缺失,所以不推荐使用。

import serial
if __name__ == '__main__':
    serial = serial.Serial("COM6", 115200, timeout=0.01)
    while(1):
        serial.write([0x01, 0x04, 0x01, 0xA1, 0x00, 0x17, 0xE0, 0x1A])
        data = serial.read_all()
        print(data)

#数据
#b'\x01\x04.\x004\x00C\x000\x00\x00\x002\x00<\x00\x00\x00\n\x00<\x00\x00\x00\n\x00\xd2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\x00\x00\xd1_'

可以看到数据读取成功了,这里我们运用到的serial.read_all方法,返回出了传感器的全部数据,但是是bytes数组的16进制形式,这种bytes数组流是python中特有的数据类型

(3)让我们再尝试一下让传感器持续的发送回数据,这也不难,设置一个死循环和一个休眠函数就可以了

import serial
if __name__ == '__main__':
    serial = serial.Serial("COM6", 115200, timeout=0.01)
    while(1):
        serial.write([0x01, 0x04, 0x01, 0xA1, 0x00, 0x17, 0xE0, 0x1A])
        data = serial.readlines()

        time.sleep(0.5)#线程休眠0.5s不工作
        try:
            print(data)
        except Exception:
            pass

#读出来的数据
'''b'\x01\x04.\x00"\x00\x1f\x00:\x00\x00\x00<\x00\x82\x00\x00\x00\n\x00d\x00\x00\x00\x14\x01\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00W\xbe'
b'\x01\x04.\x00"\x00 \x00:\x00\x00\x002\x00\xb4\x00\x00\x00\n\x00\xb4\x00\x00\x00\x1e\x03z\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00^\x02'
b'\x01\x04.\x00"\x00 \x00:\x00\x00\x002\x002\x00\x00\x00\n\x00Z\x00\x00\x00\x14\x01|\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\xa2n'
b'\x01\x04.\x00G\x00 \x00:\x00\x00\x002\x00<\x00\x00\x00\x00\x00\x8c\x00\x00\x00\x00\x00\x96\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\xff\xf0'
'''

4.总结
在平时串口通信中,最好使用serial.read_all()方法,在配合好合适的timeout
timeout的参考资料:相关链接

你可能感兴趣的:(pyqt5,单片机)