Python 读取串口数据
serial 读取串口数据
初始化ser
1 |
|
初始化的参数
1 |
|
ser的属性
1 |
|
ser的方法
1 |
|
read()
, readline()
, readlines()
三者的区别
一般情况
这里有个txt的文件,其内容为:
1 |
|
用 read()
的输出为:
1 |
|
read()
每次读取整个文件,它通常将读取到底文件内容放到一个字符串变量中,也就是说 read()
生成文件内容是一个字符串类型。
用 readline()
的输出为:
1 |
|
readline()
每只读取文件的一行,通常也是读取到的一行内容放到一个字符串变量中,返回str类型。
用 readlines()
的输出为
1 |
|
readlines()
每次按行读取整个文件内容,将读取到的内容放到一个列表中,返回 list 类型。
ser
串口发送数据内容为:
1 |
|
用 read()
读取:
1 |
|
用 readline()
读取:
1 |
|
目前我还没有遇到需要用 readlines()
的情况,等遇到了再补充。
去掉换行符和字符串前面b
利用 strip()
或者 rstrip()
删除 value 末尾的空格、换行符、回车符、制表符。
再利用 decode()
或者 decode(’utf-8‘)
对其进行解码,将 bytes 转换为 string。
1 |
|
关于 timeout 参数
这块内容来自python serial库时read、readline、read_all等方法的区别。
虽然说得很有道理,但我不能复现下面内容,以 MARK 为主。
初始化的时候这里的
timeout
是指在设定的timeout
时间范围内,如果读取的字节数据是有效的(就是非空)那就直接返回,否则一直会等到这个设定的timeout
时间并返回这段时间所读的全部字节数据。简单来说你可以理解为每
timeout
秒读一次数据,而如果timeout
太小,数据量太大,可能一次发送不完,会数据未读完的状态。也就是说,如果我的
timeout
设置为 0.01,现在我有一个串口通信的传感器,传感器通过串口使用发送一次数据,传感器如果在 0.01 秒内将所有数据都传输过来,就保存到缓存buffer
中,到了 0.01 秒后就可以读取到传感器发送到buffer
中的数据了;如果传感器在 0.01 秒内没有将数据发送全的话,buffer
中的数据就是不完全的,就会返回不完全的数据;如果传感器在 0.01 秒内发送了数据的话,buffer
也会返回两组合在一起的数据。
timeout
的设置至关重要,如果不是特别高频的数据的话,timeout=0.01
的 100Hz 完全够了,当然timeout
最小支持多少要看你的波特率。如果我 0.3 秒发送了一次数据,timeout
设置 0.01,就可以返回一次完整的数据;如果我 0.01 秒发送一次数据,timeout
设置 0.3,那么一次就会返回 30 次数据,所以这就是timeout
的作用。前面引入了
buffer
的概念,可以直接把buffer
理解为一个文件夹,读数据的方式是和file
是一样的,只是引入的timeout
的概念,使得buffer
内的数据会以1/timeout
的频率进行刷新。如果你把
buffer
当做file
理解,那么readline()
就是读取buffer
中的一行,如果你的数据中存在\n
这样的换行,那么用readline()
先让不合适,很容易产生漏读的问题,而且如果你在一个timeout
周期内没有用readline()
处理完所有你想要的数据的话,buffer
就刷新了,因此推荐用read_all()
或者readlines
来读取。