USB-TTL 串口通信代码例程
一、Arduino平台 - 基础串口收发
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>
SoftwareSerial mySerial(2, 3); // RX=2, TX=3
void setup() {
Serial.begin(115200); // 硬件串口(调试用)
mySerial.begin(9600); // 软串口(通过USB-TTL连接其他设备)
Serial.println("软串口测试启动");
}
void loop() {
if (mySerial.available()) {
char c = mySerial.read();
Serial.print("[软串口收到] ");
Serial.println(c);
}
if (Serial.available()) {
char c = Serial.read();
mySerial.print(c);
Serial.print("[已转发] ");
Serial.println(c);
}
}
三、ESP32 - 多串口通信示例
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() {
while (Serial2.available()) {
char c = Serial2.read();
Serial.print("[UART2] ");
Serial.println(c);
}
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)
#include "main.h"
UART_HandleTypeDef huart1;
uint8_t rx_buf[64];
uint8_t tx_buf[64];
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时序不对 |
检查自动下载电路,手动进入下载模式 |