首页 > 编程语言 >Python 读取 Arduino 串口数据

Python 读取 Arduino 串口数据

时间:2023-08-11 22:35:42浏览次数:53  
标签:file ser Arduino Python read timeout 串口 readline 读取

serial 读取串口数据

初始化ser

import serial

ser = serial.Serial('com1', 9600, timeout=1)

初始化的参数

ser = serial.Serial(
port=None,              
# number of device, numbering starts at
# zero. if everything fails, the user
# can specify a device string, note
# that this isn't portable anymore
# if no port is specified an unconfigured
# an closed serial port object is created

baudrate=9600,          # baud rate
bytesize=EIGHTBITS,     # number of databits
parity=PARITY_NONE,     # enable parity checking
stopbits=STOPBITS_ONE,  # number of stopbits
timeout=None,           # set a timeout value, None for waiting forever
xonxoff=0,              # enable software flow control
rtscts=0,               # enable RTS/CTS flow control
interCharTimeout=None   # Inter-character timeout, None to disable
)

ser的属性

name:设备名字
port:读或者写端口
baudrate:波特率
bytesize:字节大小
parity:校验位
stopbits:停止位
timeout:读超时设置
writeTimeout:写超时
xonxoff:软件流控
rtscts:硬件流控
dsrdtr:硬件流控
interCharTimeout:字符间隔超时

ser的方法

ser.isOpen()                    # 查看端口是否被打开。
ser.open()                      # 打开端口。
ser.close()                     # 关闭端口。
ser.read()                      # 从端口读字节数据。默认1个字节。
ser.read_all()                  # 从端口接收全部数据。
ser.write("hello")              # 向端口写数据。
ser.readline()                  # 读一行数据。
ser.readlines()                 # 读多行数据。
in_waiting()                    # 返回接收缓存中的字节数。
flush()                         # 等待所有数据写出。
flushInput()                    # 丢弃接收缓存中的所有数据。
flushOutput()                   # 终止当前写操作,并丢弃发送缓存中的数据。

read(), readline(), readlines() 三者的区别

一般情况

这里有个txt的文件,其内容为:

111
222
333

read() 的输出为:

# read(size)方法从文件当前位置起读取size个字节,若无参数size,则表示读取至文件结束为止,它范围为字符串对象
file_read = open('file_path')
print(file_read.read())
print(type(file_read.read()))
file_read.close()

# output:
# 111
# 222
# 333
# <class 'str'>

read() 每次读取整个文件,它通常将读取到底文件内容放到一个字符串变量中,也就是说 read() 生成文件内容是一个字符串类型。

readline() 的输出为:

file_readline = open('file_path')
print(file_readline.readline())
print(type(file_readline.readline()))
file_readline.close()

# output:
# 111
# <class 'str'>

readline() 每只读取文件的一行,通常也是读取到的一行内容放到一个字符串变量中,返回str类型。

readlines() 的输出为

file_readlines = open('file_path')
print(file_readlines.readlines())
print(type(file_readlines.readlines()))
file_readlines.close()

# output:
# ['111\n', '222\n', `333\n`]
# <class 'list'>

readlines() 每次按行读取整个文件内容,将读取到的内容放到一个列表中,返回 list 类型。

ser

串口发送数据内容为:

b'Hello/r/n'
Arduino 端的代码为 Serial.println() 所以带/r/n。省麻烦可以用 Serial.print()

read() 读取:

ser = serial.Serial('com1', 9600, timeout=1)
value = ser.read()
print(value)
print(type(value))

# output:
# b'H'
# <class 'bytes'>

readline() 读取:

ser = serial.Serial('com1', 9600, timeout=1)
value = ser.readline()
print(value)
print(type(value))

# output:
# b'Hello/r/n'
# <class 'bytes'>

目前我还没有遇到需要用 readlines() 的情况,等遇到了再补充。

去掉换行符和字符串前面b

利用 strip() 或者 rstrip() 删除 value 末尾的空格、换行符、回车符、制表符。

再利用 decode() 或者 decode(’utf-8‘) 对其进行解码,将 bytes 转换为 string。

value = value.strip().decode()
print(value)
print(type(value))

# output:
# Hello
# <class 'str'>

关于 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 来读取。

标签:file,ser,Arduino,Python,read,timeout,串口,readline,读取
From: https://www.cnblogs.com/wonderhoi/p/17624059.html

相关文章

  • 某公司笔试题 - 字符串拆分(附python代码)
    #输入一个字符串,请按长度为8拆分每个输入字符串并进行输出#长度不是8整数倍的字符串请在后面补数字0,空字符串不处理str=input("请输入一个字符串:")#字符串长度1~7时,输出字符串并用0补齐8位iflen(str)<8andlen(str)>0:print(str+'0'*(8-len(str)))#当字符串的长......
  • 某公司笔试题 - 明明的随机数(附python代码)
    #明明生成了N个1到500之间的随机整数,请你删去其中重复的数字,即相同的数字只保留一个,把其余相同的数去掉,然后再把这些数从小到大排序,按照排好的顺序输出。#数据范围:1<=n<=1000,输入的数字大小满足1<=val<=500importrandomimportnumpyasnptimes=input('请输入需要......
  • Python用 PyMC3 贝叶斯推理案例研究:抛硬币和保险索赔发生结果可视化
    全文链接:https://tecdat.cn/?p=33416原文出处:拓端数据部落公众号介绍在这里,我们将帮助客户将PyMC3用于两个贝叶斯推理案例研究:抛硬币和保险索赔发生。方法:回想一下,我们最初的贝叶斯推理方法是:设置先前的假设,并根据启发式、历史或样本数据建立我们数据的“已知已知”。形......
  • 不了解sys库也敢说Python行?sys模块这些用法你需要知道
    前言“不会用sys模块的Python程序员,和不会开车的司机一样令人捉急。”这句话一点没错,因为sys模块可以让你快速做到:解析命令行参数在运行Python程序时,我们可以在命令行中传递不同的参数,如果不用sys.argv来获取,你将很难处理程序输入。获取Python解释器信息要获取当前运行环境......
  • 【python技巧】文本文件的读写操作
    【python技巧】文本文件的读写操作0.背景最近在写后端接口的时候,需要对.c、.conf等类型的文件进行读写操作,在这里整理一下学习收获。1.file库的文件操作file库是python中用于处理文件的读取、修改等操作,引入方式为importfile1.1打开文件---file.open()使用open()函数......
  • python 监控一个程序是否启动, 启动就关掉这个程序
    要监控一个程序是否启动,并在启动后关闭该程序,可以使用Python的subprocess模块来实现。下面是一个示例代码:importsubprocessimporttime​defcheck_and_close_program(program_name):process=subprocess.Popen(["pgrep",program_name],stdout=subprocess.PIPE,stde......
  • 解锁Python集合的妙用:常用函数与实例深度解析
    Python的集合(Set)是一种无序且不重复的数据结构,拥有强大的去重和集合运算功能。在这篇博客中,我们将深入探讨集合的常用函数,并通过实际案例为你展示其灵活应用。创建集合集合可以通过花括号来创建,也可以使用内置函数set()来转换其他可迭代对象为集合。#创建集合my_set={1,2,3}......
  • python3 定时处理任务的问题?
    作者:27RRRR链接:https://www.zhihu.com/question/30944800/answer/2317117095来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。如果你想在Linux服务器上周期性地执行某个Python脚本,最出名的选择应该是Crontab脚本,但是Crontab具有以下缺点:1.不......
  • 通过python的pymongo连接MongoDB数据库最新方式
    首先导入需要的模块功能fromurllibimportparsefrompymongoimportMongoClient使用pymongo的客户端进行链接self.host="168.9.5.27"self.port=27017self.user="Mr.baba"self.password="PLA_No.1"......
  • Python黑魔法 --- 协程分解与封装
    Python黑魔法---异步IO(asyncio)协程pythonasyncio网络模型有很多中,为了实现高并发也有很多方案,多线程,多进程。无论多线程和多进程,IO的调度更多取决于系统,而协程的方式,调度来自用户,用户可以在函数中yield一个状态。使用协程可以实现高效的并发任务。Python的在3.4中引入了......