0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

raspberrypi CDC ACM

0
Last updated at Posted at 2025-12-29

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 ポートを確認してください"
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?