USB CDC ACM là gì?

CDC ACM trên STM32: tại sao giống UART về trải nghiệm nhưng khác về implementation, SET_CONTROL_LINE_STATE, DTR và điểm dễ nhầm khi dùng với terminal.

Cập nhật 2 phút đọc
USB cover

CDC ACM (Communication Device Class - Abstract Control Model) làm USB device trông như một cổng serial trên host OS. Không cần driver riêng trên Windows 10+, Linux và macOS.

Giống UART về trải nghiệm

Cắm cáp, mở Tera Term, chọn COM port, đọc log. Trải nghiệm y hệt UART qua USB-UART converter. Về firmware, cũng có hàm gửi (CDC_Transmit_FS) và callback nhận (CDC_Receive_FS).

Khác UART về implementation

  • Không có baud rate thật sự (USB Full Speed cố định 12 Mbps)
  • Không có mức điện áp CMOS/TTL
  • Phải kích hoạt lại endpoint sau mỗi lần nhận (UART tự động nhận liên tục)
  • Cần IAD trong composite device để Windows nhận đúng

SET_CONTROL_LINE_STATE

Khi terminal mở COM port, driver gửi SET_CONTROL_LINE_STATE:

Value=0x0000  DTR=0, RTS=0  → driver Windows tự bind, KHÔNG phải app mở portValue=0x0003  DTR=1, RTS=1  → terminal (Tera Term...) thật sự mở port

Phân biệt hai value này quan trọng khi cần log “greeting” lúc kết nối. Bắn log ngay khi Value=3 thường vẫn bị miss vì app chưa kịp bắt đầu đọc. Delay 100ms sau Value=3 là giải pháp thực tế.

Conflict COM port

CDC chỉ cho một connection tại một thời điểm. Nếu Tera Term đang giữ COM port, Python tool (pyserial) không thể connect - phải đóng Tera Term trước.

Xem chi tiết: bài 6 CDC Debug Channel

Bài viết này hữu ích với bạn?

Chia sẻ, góp ý, hoặc ủng hộ nếu bạn thấy nội dung này có giá trị.

Góp ý

Nội dung liên quan

Một số bài viết, ghi chú hoặc project có liên quan đến nội dung bạn vừa đọc.

Biến note thành bài viết hoàn chỉnh

Notes là nơi ghi nhanh khái niệm.