树莓派测试引脚程序-UART,SPI,I2C 等接口功能测试
·
UART 回环测试
import os
import serial
import time
# 确认 UART0 映射的端口
def detect_uart0_port():
for port in ['/dev/ttyS0', '/dev/ttyAMA0']:
if os.path.exists(port):
return port
print("未找到 UART0 端口")
return None
# 回环测试
def loopback_test(port, baudrate=115200, timeout=1, duration=10):
sent_count = received_count = lost_count = 0
with serial.Serial(port, baudrate, timeout=timeout) as ser:
print(f"成功打开串口: {port}")
sent_data = b'Hello'
start_time = time.time()
while time.time() - start_time < duration:
ser.write(sent_data) # 发送数据
sent_count += 1
print(f"发送: {sent_data.decode()}")
data = ser.read(len(sent_data)) # 接收数据
if data == sent_data:
received_count += 1
print(f"接收: {data.decode()}")
else:
lost_count += 1
print("丢包")
# 每次发送接收后统计
print(f"发送次数: {sent_count} | 接收次数: {received_count} | 丢包次数: {lost_count}")
time.sleep(1) # 控制发送频率
print(f"\n回环测试完成 | 发送次数: {sent_count} | 接收次数: {received_count} | 丢包次数: {lost_count}")
print(f"丢包率: {(lost_count / sent_count) * 100:.2f}%")
def main():
uart_port = detect_uart0_port()
if uart_port:
loopback_test(uart_port)
if __name__ == "__main__":
main()

SPI 回环测试
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
树莓派5 SPI 回环演示 (物理引脚: MOSI=19 ↔ MISO=21)
用法:
sudo python3 rpi5_spi_loop_hello_hi.py # 默认 /dev/spidev0.0, 500kHz, mode 0
sudo python3 rpi5_spi_loop_hello_hi.py -D 0.1 # 指定设备 /dev/spidev0.1
sudo python3 rpi5_spi_loop_hello_hi.py -s 1000000 -m 0 # 改速率/模式
先在物理引脚把 MOSI(19) 与 MISO(21) 短接,GND 共地;不需要外部从设备。
"""
import argparse
import sys
import time
try:
import spidev
except Exception:
print("需要安装 python3-spidev: sudo pip3 install spidev")
raise
def xfer(spi, payload: bytes) -> bytes:
"""发送并回读 payload。"""
rx = spi.xfer2(list(payload))
return bytes(rx)
def open_spi(bus: int, dev: int, speed: int, mode: int, bpw: int = 8) -> spidev.SpiDev:
spi = spidev.SpiDev()
spi.open(bus, dev)
spi.max_speed_hz = speed
spi.mode = mode
spi.bits_per_word = bpw
return spi
def main():
parser = argparse.ArgumentParser(description="树莓派5 SPI MOSI(19)<->MISO(21) 回环测试")
parser.add_argument("-D", "--device", default="0.0", help="spidev 设备 (bus.dev),默认 0.0")
parser.add_argument("-s", "--speed", type=int, default=500000, help="SPI 速率(Hz),默认 500000")
parser.add_argument("-m", "--mode", type=int, default=0, choices=[0, 1, 2, 3], help="SPI 模式,默认 0")
parser.add_argument("-r", "--repeat", type=int, default=1, help="每条消息重复次数,默认 1")
args = parser.parse_args()
if "." not in args.device:
print("设备格式应为 bus.dev,例如 0.0 或 0.1")
return 2
bus, dev = map(int, args.device.split("."))
print("提示:请先把物理引脚 MOSI(19) 与 MISO(21) 短接;GND 共地。")
print(f"使用 /dev/spidev{bus}.{dev} 速率={args.speed}Hz 模式={args.mode}\n")
spi = None
try:
spi = open_spi(bus, dev, args.speed, args.mode)
payloads = [b"hello", b"hi"]
ok_all = True
for _ in range(args.repeat):
for p in payloads:
rx = xfer(spi, p)
ok = (rx == p)
print(f"发送={p!r:10s} 接收={rx!r:10s} -> {'成功' if ok else '失败'}")
if not ok:
ok_all = False
time.sleep(0.05)
print("\n测试结果:", "全部成功" if ok_all else "存在失败(请检查接线和配置)")
return 0 if ok_all else 1
except FileNotFoundError:
print(f"/dev/spidev{bus}.{dev} 不存在;请启用 SPI 接口:sudo raspi-config -> Interface Options -> SPI")
return 1
except PermissionError:
print("权限不足:请使用 sudo 运行。")
return 1
except Exception as e:
print("异常:", repr(e))
return 1
finally:
if spi:
spi.close()
if __name__ == "__main__":
sys.exit(main())

扫描 I2C 地址
#!/usr/bin/env python3
# i2c_scan.py 用法: python3 i2c_scan.py [bus] # bus默认1
import sys
try: from smbus2 import SMBus
except: from smbus import SMBus
bus = int(sys.argv[1]) if len(sys.argv)>1 else 1
found = []
with SMBus(bus) as s:
for a in range(0x03, 0x78):
try:
s.write_quick(a); found.append(a); continue
except OSError: pass
try:
s.read_byte(a); found.append(a)
except OSError: pass
print(f"Bus {bus}:", " ".join(f"0x{a:02X}" for a in found) or "None")

拉低BCM-GPIO6
#!/usr/bin/python
# -*- coding:utf-8 -*-
import os
import sys
import logging
import RPi.GPIO
import time
OUT1 = 6
GPIO = RPi.GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(OUT1, GPIO.OUT)
try:
GPIO.output(OUT1, 0)
except KeyboardInterrupt:
logging.info("ctrl + c:")
exit()
更多推荐
所有评论(0)