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()
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐