乐鑫技术交流
直播中

蒋美燕

7年用户 922经验值
私信 关注
[问答]

ESP32-C3调试USB CDC-ACM,不希望putchar后边必须跟上换行符\"n\",要怎么实现?


我的项目在使用ESP32-C3,目前在调试USB CDC-ACM,我的程序中程序中希望通过USB CDC-ACM来putchar(向上位机传输字符)和getchar(从上位机获取字符)即可,不希望putchar后边必须跟上换行符"n", 请问有什么解决之道吗?感谢!

1. idf.py menuconfig -> Component config -> ESP System Setting -> Channel for console output -> USB Serial/JTAG Controlller

2. ESP32C3的USB口只可作为JTAG和CDC-ACM, CDC-ACM在上电进入SPI-Flash烧录模式时可作为烧录串口,
在上电进入正常模式下可作为标准Unix Console控制台, 可以执行标准Unix系统调用

3. Caution: 由于unix上标准输入输出都是带有缓存的, 一般是行缓存, 对于标准输出, 需要输出的数据并不
是直接输出到终端上, 而是首先缓存到某个地方, 当遇到行刷新标志或者该缓存已满的情况下, 才会把缓
存的数据显示到终端设备上, 实践证明, ESP32C3下编程 putc/putchar/printf只会将字符放到发送缓冲
区, 只有缓冲区存满了(4096字节)或者执行了printf("n")缓冲区中的字符才会发送出去!

在标准Unix环境下解决的方法有:
a. fflush(stdout)刷新标准输出缓冲区
b. setvbuf(stdout,NULL,_IONBF,0)关闭stdout缓冲区

但是ESP32C3 USB Console是硬件实现, a/b两种方法目前都无效!


回帖(1)

陈秀英

2024-6-18 16:19:56
要实现在ESP32-C3上使用USB CDC-ACM进行调试,同时避免在putchar后自动添加换行符"n",可以按照以下步骤操作:

1. 首先,确保你的项目已经配置为使用USB CDC-ACM作为控制台输出。你已经通过`idf.py menuconfig`进行了配置,这是正确的。

2. 接下来,需要修改ESP-IDF的源代码,以禁用在putchar函数中自动添加换行符的功能。这可以通过修改`components/esp_system/port/soc/esp32c3/port.c`文件实现。

3. 在`port.c`文件中,找到`void _putchar(char c)`函数。这个函数是ESP-IDF中实现putchar的地方。

4. 修改`_putchar`函数,使其不再在每个字符后添加换行符。你可以通过以下方式实现:

```c
void _putchar(char c) {
    if (c == 'n') {
        // 如果字符是换行符,发送回车符
        esp_rom_uart_tx_one_char('r');
    } else {
        // 否则,只发送当前字符
        esp_rom_uart_tx_one_char(c);
    }
}
```

5. 保存修改并重新编译你的项目。

6. 烧录修改后的固件到ESP32-C3。

7. 现在,当你使用putchar函数发送字符时,它将不再自动添加换行符。

请注意,这种方法可能会影响其他依赖于自动换行功能的代码。如果你的项目中有其他地方使用了putchar,可能需要对这些部分进行相应的修改。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分