pythonserial串⼝通信时read、readline、read_all等⽅法的区别
1.概况
serial在读取数据的时候具有⼏种⽅法,下⾯将做出解析
2.介绍
本⽂需要⽤到的⼏种⽅法和属性
⽅法功能
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 = ad_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\x0 0\x00\x00\x00\x00\xfd\x00\x00\xd1_'
可以看到数据读取成功了,这⾥我们运⽤到的ad_all⽅法,返回出了传感器的全部数据,但是是bytes数组的16进制形式,这种bytes数组流是python中特有的数据类型
(3)让我们再尝试⼀下让传感器持续的发送回数据,这也不难,设置⼀个死循环和⼀个休眠函数就可以了
import serial
if __name__ =='__main__':
python怎么读取串口数据serial = serial.Serial("COM6",115200, timeout=0.01)
while(1):
serial.write([0x01,0x04,0x01,0xA1,0x00,0x17,0xE0,0x1A])
data = adlines()
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\x0 0\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\x 00\x00\x00\x00\x00\x00\xfe\x00\x00\xff\xf0'
'''
4.总结
在平时串⼝通信中,最好使⽤ad_all()⽅法,在配合好合适的timeout
timeout的参考资料:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论