如何使用Python 3捕获Arduino Nano输出到树莓派3的轮询串口数据?
在Python 3中捕获Arduino Nano到树莓派的串口轮询数据
嘿,这事儿不难搞定!你要抓Arduino通过/dev/ttyUSB0发过来的土壤湿度数据,用Python 3的话,最常用的就是pyserial库——专门处理串口通信的工具,能帮你轻松搞定数据捕获。
首先得先安装这个库,打开树莓派的终端,跑这个命令:
pip install pyserial
接下来给你写个实用的示例代码,完全适配你给出的那种连续输出的缓冲区数据:
import serial # 初始化串口,这里的参数必须和Arduino代码里的串口设置完全匹配! ser = serial.Serial( port='/dev/ttyUSB0', baudrate=9600, # 重点!Arduino里Serial.begin(xxx)的数值要和这个一致,一般默认是9600 parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=1 # 设置1秒超时,避免程序一直卡着等数据 ) try: # 无限循环轮询数据 while True: # 读取串口缓冲区里的所有数据,转成字符串并去掉首尾空白 raw_data = ser.read_all().decode('utf-8').strip() if raw_data: # 你的数据是连续拼接的,比如"Soil Moisture = 697 Soil Moisture = 699..." # 我们用" Soil"作为分隔符,把每个湿度条目拆出来 data_entries = raw_data.split(' Soil') # 遍历处理每个条目,跳过空字符串 for entry in data_entries: if entry: # 把拆分时去掉的"Soil"补回来,然后打印每条独立数据 full_entry = f"Soil{entry}" print(full_entry) except KeyboardInterrupt: # 按Ctrl+C的时候,优雅关闭串口并退出程序 ser.close() print("\n串口已关闭,程序退出")
给你划几个必须注意的点:
- 波特率必须匹配:如果Arduino代码里写的是
Serial.begin(115200),那这里的baudrate也要改成115200,不然会读出一堆乱码 - 权限问题:如果运行脚本时提示无法访问
/dev/ttyUSB0,把你的树莓派用户加入dialout组就行:sudo usermod -aG dialout pi,改完记得重新登录或者重启设备 - 数据处理逻辑:因为你的串口数据是连续输出拼接在一起的,所以用
split(' Soil')拆分每个独立的湿度记录,这样就能把每条数据单独打印出来,不会混在一起
要是你还遇到问题,比如乱码或者读不到数据,先检查串口线有没有插好,Arduino的串口设置是不是和代码里的一致,一般都能解决~
内容的提问来源于stack exchange,提问作者boobie
相关产品推荐
相关产品推荐

