USB-TTL

元器件
通信模块
库存 1200

介绍

USB转TTL串口模块,基于CH340G/CH340C芯片,支持USB 2.0转UART,输出3.3V/5V TTL电平,通信速率最高2Mbps,广泛用于单片机调试、固件烧录、串口通信等

规格参数

参数
尺寸约45×17mm
驱动Windows/Linux/macOS免驱或CH340驱动
TTL电平3.3V / 5V可选
USB接口USB 2.0 Type-A / Micro USB
停止位1/1.5/2位
指示灯TX/RX LED
数据位5/6/7/8位
校验位无/奇/偶/标记/空格
主控芯片CH340G/CH340C
输出电压3.3V / 5V(可对外供电最大500mA)
通信速率50bps - 2Mbps

代码例程

USB-TTL 串口通信代码例程(多平台).md

# USB-TTL 串口通信代码例程

## 一、Arduino平台 - 基础串口收发

```cpp
// Arduino通过USB-TTL与PC通信
void setup() {
    Serial.begin(115200);       // 初始化硬件串口,波特率115200
    Serial.println("USB-TTL 模块测试开始");
    Serial.println("请输入任意字符...");
}

void loop() {
    if (Serial.available() > 0) {
        char c = Serial.read();
        Serial.print("接收到: ");
        Serial.println(c);
        
        // 回显并附加信息
        Serial.printf("字符: '%c', ASCII: %d, HEX: 0x%02X\n", c, c, c);
    }
}
```

## 二、Arduino - 使用SoftwareSerial扩展串口

```cpp
#include <SoftwareSerial.h>

// 使用GPIO 2(RX)和GPIO 3(TX)创建软串口,连接USB-TTL模块
SoftwareSerial mySerial(2, 3);  // RX=2, TX=3

void setup() {
    Serial.begin(115200);        // 硬件串口(调试用)
    mySerial.begin(9600);        // 软串口(通过USB-TTL连接其他设备)
    
    Serial.println("软串口测试启动");
}

void loop() {
    // 从USB-TTL(软串口)读取数据,转发到硬件串口
    if (mySerial.available()) {
        char c = mySerial.read();
        Serial.print("[软串口收到] ");
        Serial.println(c);
    }
    
    // 从硬件串口读取数据,通过USB-TTL(软串口)转发出去
    if (Serial.available()) {
        char c = Serial.read();
        mySerial.print(c);
        Serial.print("[已转发] ");
        Serial.println(c);
    }
}
```

## 三、ESP32 - 多串口通信示例

```cpp
// ESP32有3个硬件UART,可同时连接多个USB-TTL模块
HardwareSerial Serial2(2);  // UART2: RX=GPIO16, TX=GPIO17

void setup() {
    Serial.begin(115200);          // USB原生串口(调试)
    Serial2.begin(9600, SERIAL_8N1, 16, 17);  // 接USB-TTL模块
    
    Serial.println("ESP32 多串口测试");
}

void loop() {
    // UART2 → USB Serial
    while (Serial2.available()) {
        char c = Serial2.read();
        Serial.print("[UART2] ");
        Serial.println(c);
    }
    
    // USB Serial → UART2
    while (Serial.available()) {
        char c = Serial.read();
        Serial2.print(c);
    }
    
    delay(10);
}
```

## 四、Python(PC端) - 通过USB-TTL与MCU通信

```python
#!/usr/bin/env python3
"""
PC端通过USB-TTL模块与MCU进行串口通信
需要安装 pyserial: pip install pyserial
"""

import serial
import serial.tools.list_ports
import time

def list_ports():
    """列出所有可用串口"""
    ports = serial.tools.list_ports.comports()
    for port in ports:
        print(f"  {port.device} - {port.description} [VID:{port.vid:04X} PID:{port.pid:04X}]")

def main():
    print("可用串口:")
    list_ports()
    
    # 根据实际COM口修改(Windows: COM3, Linux: /dev/ttyUSB0, macOS: /dev/tty.usbserial-xxx)
    port = "/dev/ttyUSB0"  # Linux
    # port = "COM3"         # Windows
    # port = "/dev/tty.usbserial-1420"  # macOS
    
    baudrate = 115200
    
    try:
        ser = serial.Serial(
            port=port,
            baudrate=baudrate,
            bytesize=serial.EIGHTBITS,
            parity=serial.PARITY_NONE,
            stopbits=serial.STOPBITS_ONE,
            timeout=1.0
        )
        print(f"✓ 已连接 {port} @ {baudrate}bps")
        
        # 发送数据
        ser.write(b"Hello MCU!\n")
        time.sleep(0.1)
        
        # 持续读取
        print("等待接收数据 (Ctrl+C 退出)...")
        while True:
            if ser.in_waiting > 0:
                data = ser.readline()
                print(f"← {data.decode('utf-8', errors='replace').strip()}")
                
    except serial.SerialException as e:
        print(f"✗ 串口错误: {e}")
    except KeyboardInterrupt:
        print("\n用户中断")
    finally:
        if 'ser' in locals() and ser.is_open:
            ser.close()
            print("串口已关闭")

if __name__ == "__main__":
    main()
```

## 五、STM32 HAL - UART收发(通过USB-TTL连接PC)

```c
// STM32 HAL库通过USB-TTL与PC通信
#include "main.h"

UART_HandleTypeDef huart1;
uint8_t rx_buf[64];
uint8_t tx_buf[64];

// UART1初始化 (PA9=TX, PA10=RX, 接USB-TTL模块)
void MX_USART1_UART_Init(void) {
    huart1.Instance = USART1;
    huart1.Init.BaudRate = 115200;
    huart1.Init.WordLength = UART_WORDLENGTH_8B;
    huart1.Init.StopBits = UART_STOPBITS_1;
    huart1.Init.Parity = UART_PARITY_NONE;
    huart1.Init.Mode = UART_MODE_TX_RX;
    huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    huart1.Init.OverSampling = UART_OVERSAMPLING_16;
    HAL_UART_Init(&huart1);
}

// 发送字符串
void uart_send_string(const char *str) {
    HAL_UART_Transmit(&huart1, (uint8_t *)str, strlen(str), HAL_MAX_DELAY);
}

// 中断接收回调
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
    if (huart->Instance == USART1) {
        // 回显收到的数据
        HAL_UART_Transmit(&huart1, rx_buf, 1, HAL_MAX_DELAY);
        // 重新启动接收中断
        HAL_UART_Receive_IT(&huart1, rx_buf, 1);
    }
}

int main(void) {
    HAL_Init();
    SystemClock_Config();
    MX_USART1_UART_Init();
    
    uart_send_string("STM32 UART 通过USB-TTL通信测试\r\n");
    
    // 启动中断接收
    HAL_UART_Receive_IT(&huart1, rx_buf, 1);
    
    uint32_t count = 0;
    char msg[32];
    while (1) {
        sprintf(msg, "计数: %lu\r\n", count++);
        uart_send_string(msg);
        HAL_Delay(1000);
    }
}
```

## 六、常见问题排查

| 问题现象 | 可能原因 | 解决方法 |
|----------|----------|----------|
| 串口无法识别 | 未安装CH340驱动 | 安装对应系统驱动 |
| 收到乱码 | 波特率不匹配 | 确认双方波特率一致 |
| 无任何数据 | TX/RX接反或未共地 | 交换TX/RX,检查GND连接 |
| 数据丢包 | 波特率过高或线太长 | 降低波特率,缩短连线 |
| MCU烧录失败 | RTS/DTR时序不对 | 检查自动下载电路,手动进入下载模式 |

参考资料

暂无参考文献