554 字
3 分钟
CH340x自动下载电路调试心得

问题1 识别问题#

大多串口插件比较离谱的筛选规定 只能识别ttyS..和ttyUSB..(ttyCH341USB0:那我走?) 导致默认不显示,自己去open比较麻烦 于是修改驱动,将设备名称命名为ttySCH341USBxx

问题2 自动复位电路调试记录#

TIP

问题的本质 CH340X的DTR#虽然有两种模式,分别是默认为低和高,但Linux驱动会自己设置默认值😂

有RST#和DTR#引脚(注意这里的#号,代表相反的意思)

默认初始状态或者close以后的状态是全0,即DTR,RST都是低电平,DTR#和RST#都是高电平

RST#倒是正好,因为单片机的复位逻辑也是RST#

但DTR#为高就比较麻烦,也就是BOOT引脚为高(和单片机BOOT逻辑正好相反,单片机在下载模式),导致单片机无法正常启动,此时手动按复位键也没有用

ps:也有的单片机BOOT逻辑是BOOT#,这个要看清楚,如果是这样的就不用修改

遂修改一下驱动(开源yyds)

static void ch341_port_shutdown(struct tty_port *port)
{
struct ch341 *ch341 = container_of(port, struct ch341, port);
struct urb *urb;
struct ch341_wb *wb;
int i;
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 16, 0))
usb_autopm_get_interface_no_resume(ch341->data);
ch341->data->needs_remote_wakeup = 0;
ch341->ctrlout = CH341_CTO_D;//add
ch341_set_control(ch341, ch341->ctrlout);//add
usb_autopm_put_interface(ch341->data);
//******existing code
//对于内核版本较小的修改也是类似的
}

经过测试一切正常,单片机可以正常启动

另外附一段软件复位

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <stdlib.h>
int main() {
const char *serial_port = "/dev/ttySCH341USB0"; // 修改为你的串口设备
int fd = open(serial_port, O_RDWR | O_NOCTTY);
if (fd < 0) {
perror("open");
return EXIT_FAILURE;
}
int status;
// 获取当前控制线状态
if (ioctl(fd, TIOCMGET, &status) == -1) {
perror("TIOCMGET");
close(fd);
return EXIT_FAILURE;
}
// 拉高 DTR
status |= TIOCM_DTR;
// 拉高 RTS(RTS# = 低电平,置0)
status |= TIOCM_RTS;
if (ioctl(fd, TIOCMSET, &status) == -1) {
perror("TIOCMSET (DTR low, RTS low)");
close(fd);
return EXIT_FAILURE;
}
printf("DTR# 已拉低,RTS# 已拉低(复位开始)\n");
// 延时100ms(可根据需要修改)
usleep(100000); // 100,000微秒 = 100ms
//拉低RST
status &= ~TIOCM_RTS;
if (ioctl(fd, TIOCMSET, &status) == -1) {
perror("TIOCMSET (RTS high)");
close(fd);
return EXIT_FAILURE;
}
printf("RTS# 已拉高(复位完成)\n");
// 保持状态(可根据需要修改延时或退出前清理)
sleep(1);
close(fd);
return EXIT_SUCCESS;
}
Terminal window
gcc set_dtr_rts_reset.c -o set_dtr_rts_reset
CH340x自动下载电路调试心得
https://blog.zyfang.top/posts/toothbrush/ch340x自动下载电路调试心得/
作者
Fang
发布于
2025-04-01
许可协议
CC BY-NC-SA 4.0