cdc_server.py
python cdc_server.py
root@raspberrypi:/home/pi/ptp# python cdc_server.py
[COMMAND] LEDをONにします
[COMMAND] LEDをOFFにします
[COMMAND] LEDをONにします
[COMMAND] LEDをOFFにします
[COMMAND] LEDをONにします
[COMMAND] LEDをOFFにします
[COMMAND] 不明: b'\x00\x00\x00\x01\x00\x02\x00\x00\x011\x00\x02\x00\x00\x00\x10\x00\x00\x00N\x00\x00\x00\x00\x00\x00\x00`\x00\x00\x00\x01\x00\x00\x00`\x00\x00\x00\x01paint.net 4.3.2\x00\xff\xdb\x00C\x00\x06\x14P\x01E\x00\x14P\x01E\x00\x14P\x01E\x00\x14P\x01E\x00\x14P\x01\x8a(\x00\xa2\x80'
[COMMAND] 不明: b'(\x00\xa2\x80'
[COMMAND] 不明: b'(\x00\xa2\x80'
[COMMAND] 不明: b'(\x00\xa2\x80'
[COMMAND] 不明: b'(\x00\xa2\x80'
[COMMAND] 不明: b'(\x00\xa2\x80'
[COMMAND] 不明: b'(\x00\xa2\x80'
cdc_server.py
cdc_server.py
#!/usr/bin/env python3
import os
DEVICE = "/dev/ttyGS0"
def handle_command(line):
line = line.strip()
if line == b"LED ON":
print("[COMMAND] LEDをONにします")
# GPIO処理など
elif line == b"LED OFF":
print("[COMMAND] LEDをOFFにします")
elif line.startswith(b"IMG"):
filename = "received_image.jpg"
data = line[4:] # 先頭 "IMG " をスキップ
with open(filename, "wb") as f:
f.write(data)
print(f"[COMMAND] 画像を保存: {filename}")
else:
print("[COMMAND] 不明:", line)
with open(DEVICE, "rb") as f:
buffer = b""
while True:
chunk = f.read(64)
if chunk:
buffer += chunk
while b"\n" in buffer:
line, buffer = buffer.split(b"\n", 1)
handle_command(line)
setup_cdc_acm_full.sh
setup_cdc_acm_full.sh
!/bin/bash
# Raspberry Pi Zero CDC ACM 一括セットアップ
# configfs マウント + libcomposite モジュールロード + CDC ACM 作成
# 実行前に /boot/config.txt に dtoverlay=dwc2 を追加しておくこと
# /etc/modules に dwc2, libcomposite があることを推奨
set -e
GADGET_DIR=/sys/kernel/config/usb_gadget/cdc_gadget
UDC=$(ls /sys/class/udc | head -n1)
echo "=== CDC ACM Full Setup Start ==="
# --- 0. configfs マウント ---
if ! mount | grep -q configfs; then
echo "[INFO] configfs をマウント中..."
sudo mount -t configfs none /sys/kernel/config
else
echo "[INFO] configfs は既にマウント済み"
fi
# --- 1. libcomposite モジュールロード ---
if ! lsmod | grep -q libcomposite; then
echo "[INFO] libcomposite モジュールをロード中..."
sudo modprobe libcomposite
else
echo "[INFO] libcomposite は既にロード済み"
fi
# --- 2. 以前のガジェットを削除 ---
if [ -d "$GADGET_DIR" ]; then
echo "[INFO] 以前のガジェット解除"
echo "" > "$GADGET_DIR/UDC" || true
rm -rf "$GADGET_DIR"
fi
# --- 3. ガジェット作成 ---
mkdir -p $GADGET_DIR
cd $GADGET_DIR
echo 0x1d6b > idVendor # Linux Foundation
echo 0x0104 > idProduct # Custom Gadget
echo 0x0100 > bcdDevice
echo 0x0200 > bcdUSB
mkdir -p strings/0x409
echo "12345678" > strings/0x409/serialnumber
echo "Raspberry Pi" > strings/0x409/manufacturer
echo "CDC Serial" > strings/0x409/product
mkdir -p configs/c.1
echo 120 > configs/c.1/MaxPower
# CDC ACM function
mkdir -p functions/acm.usb0
ln -s functions/acm.usb0 configs/c.1/
# --- 4. UDC にバインド ---
echo $UDC > UDC
echo "[INFO] CDC ACM Gadget 有効化: $UDC"
# --- 5. /dev/ttyGS0 権限 ---
sleep 1
if [ -e /dev/ttyGS0 ]; then
sudo chmod 666 /dev/ttyGS0
echo "[INFO] /dev/ttyGS0 権限設定完了"
else
echo "[WARN] /dev/ttyGS0 がまだ作成されていません"
fi
echo "=== CDC ACM Full Setup Complete ==="
echo "Windows に接続して COM ポートを確認してください"