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

知识库
知识库文档
/firmware/通信模块/USB-TTL/USB-TTL 串口通信代码例程(多平台).md

文档

USB-TTL 串口通信代码例程

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

// 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扩展串口

#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 - 多串口通信示例

// 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通信

#!/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)

// 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时序不对 检查自动下载电路,手动进入下载模式

信息

路径
/firmware/通信模块/USB-TTL/USB-TTL 串口通信代码例程(多平台).md
更新时间
2026/5/26