在用platformIO开发ESP32时,串口监视器返回乱码,如何解决?

在用platformIO开发ESP32时,串口监视器返回乱码,如何解决?
如:

E (164) esp_core_dump_flash: Incorr���� size of core dump image: 0
�eMn!
        AP����WIFI
�B      STA��
 S

可能波特率设置不一致~

检查下串口监视器与单片机波特率是否不一致,不一致也会出现乱码,其次,修改下编码看看

这个看起来虽然有乱码,但部分字符是正常显示的,所以波特率应该没错,或者说应该大体正确。
你是USB串口芯片直接在板上,还是外接串口线,如果是外接串口线,可能是干扰导致,如果是直接在板上,可能是部分USB串口芯片在高波特率下不太稳定,比如CH343

串口监视器返回乱码的原因可能有很多,以下是一些可能的解决方法:

确认串口波特率设置正确
在使用串口监视器时,需要确认波特率设置正确。ESP32的默认波特率为115200,如果您的串口监视器设置的波特率不正确,可能会导致乱码的问题。

确认串口连接线路正确
确认连接ESP32和电脑的串口线路正确。如果线路接触不良或者线路质量差,可能会导致乱码的问题。

在代码中设置正确的串口属性
在ESP32的代码中,需要设置正确的串口属性,包括波特率、数据位、停止位和校验位等。如果代码中设置的串口属性与串口监视器不匹配,也可能导致乱码的问题。

确认编码格式设置正确
在使用串口监视器时,还需要注意编码格式的问题。如果串口监视器使用的编码格式与ESP32代码中设置的编码格式不匹配,可能会导致乱码的问题。一般情况下,串口监视器使用的编码格式为UTF-8,而ESP32的默认编码格式为ASCII。如果您的代码中使用了非ASCII字符,需要设置正确的编码格式。

尝试使用其他串口监视器
如果以上方法都无法解决问题,可以尝试使用其他串口监视器,例如Putty、Tera Term等。有时候不同的串口监视器对于乱码的处理方式不同,可能会有不同的效果。

总之,串口监视器返回乱码的问题可能有多种原因,需要逐一排查和解决。如果以上方法都无法解决问题,可以尝试搜索相关资料或者联系技术支持人员。


if __name__ == "__main__":
    try:
        # On MSYS2 we need to run idf.py with "winpty" in order to be able to cancel the subprocesses properly on
        # keyboard interrupt (CTRL+C).
        # Using an own global variable for indicating that we are running with "winpty" seems to be the most suitable
        # option as os.environment['_'] contains "winpty" only when it is run manually from console.
        WINPTY_VAR = "WINPTY"
        WINPTY_EXE = "winpty"
        os.system("chcp 437")
        if ("MSYSTEM" in os.environ) and (
            not os.environ.get("_", "").endswith(WINPTY_EXE) and WINPTY_VAR not in os.environ
        ):


该回答引用ChatGPT4与博主@晓码自在合作编写:

在 platformIO 开发 ESP32 时,如果串口监视器返回乱码,有几个可能的原因:

  1. 串口波特率设置错误。ESP32 的默认串口波特率是 115200,如果你设置的波特率不同,会导致返回乱码。检查你的 platformIO 配置文件platformio.ini 中的
serial_baud 设置,确保为 115200
  1. 终端字体设置错误。有些字体不支持中文,会显示为乱码。你可以更改终端字体设置,选择支持中文的字体,如微软雅黑等。

  2. serial.rx_buffer_size 配置太小。ESP32 有时会有较长的串口打印,如果 buffer 太小会 trunc 掉部分内容,显示为乱码。你可以在platformio.ini 中设置:

serial.rx_buffer_size = 1024 

  1. 代码中使用了 Serial.print 打印中文。ESP32 的 Serial 类的默认编码是 ASCII,不支持中文,你需要指定支持 UTF-8 编码的串口打印函数:
Serial.print(String("中文").c_str()); // 错误,会乱码 
Serial.print(String("中文").c_str()); // 正确,支持中文

  1. 硬件连接出现问题。检查你的 ESP32 是否正确连接了串口转 USB 模块,是否所有线都正确连接。这可能也会导致串口输出乱码。

通常情况下,检查 platformio.ini 的配置(特别是 serial_baud 和 serial.rx_buffer_size),使用支持 UTF-8 的串口输出函数,更改终端字体到支持中文的字体,就可以解决大部分串口输出乱码的问题。

引用chatgpt:
该问题通常是由于串口波特率或编码格式设置错误引起的。下面是一些可能的解决方法:

  1. 确保串口波特率设置正确。您可以尝试在串口监视器中更改波特率以查看是否有改进。
  2. 确保正确设置了串口编码格式,通常为“UTF-8”。
  3. 如果使用的是Windows系统,尝试更改串口监视器的字体以查看是否有改进。
  4. 如果您正在使用Arduino IDE,可以通过单击“工具”菜单并选择正确的串口波特率和编码格式来更改这些设置。
  5. 如果问题仍然存在,可以尝试重新安装串口驱动程序或更新Arduino IDE和相关库文件。
    希望这些提示可以帮助您解决该问题。
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你看下这篇博客吧, 应该有用👉 :用ESP32打造一个物联网红外测温打卡机/春节结束急着上班?哒咩,再努力奋斗也要先测体温
  • 除此之外, 这篇博客: 补充第一章:ESP32定时器的使用中的 ESP32的软定时器接口介绍 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    创建定时器函数:esp_timer_create();

    函数原型

    esp_err_t esp_timer_create

    (

    const esp_timer_create_args_t* create_args,

    esp_timer_handle_t* out_handle

    )

    函数功能

    创建定时器函数

    参数

    [in]create_args:定时器结构体

    typedef struct {

        esp_timer_cb_t callback;        //定时器时间到回调

        void* arg;                      //要传入回调的参数

    esp_timer_dispatch_t dispatch_method;   //从任务或ISR调用回调

     const char* name;               //定时器名称,esp_timer_dump函数使用

    } esp_timer_create_args_t;

    [in]out_handle:定时器句柄

    返回值

    ESP_OK:成功

    ESP_ERR_INVALID_ARG : 参数错误

    ESP_ERR_INVALID_STATE:定时器已经运行

    启动单次定时器函数:esp_timer_start_once();基本同下

    启动周期定时器函数:esp_timer_start_periodic();

    函数原型

    esp_err_t esp_timer_start_periodic

    (

    esp_timer_handle_t timer,

    uint64_t period

    )

    函数功能

    启动周期定时器

    参数

    [in]timer:定时器句柄

    [in]period:定时周期,单位微秒,1000表示1ms

    返回值

    ESP_OK:成功

    ESP_ERR_INVALID_ARG : 参数错误

    ESP_ERR_INVALID_STATE:定时器已经运行


    停止定时器函数:esp_timer_stop();

    函数原型

    esp_err_t esp_timer_stop

    (

    esp_timer_handle_t timer

    );

    函数功能

    停止定时器

    参数

    [in]timer:定时器句柄

    返回值

    ESP_OK:成功

    ESP_ERR_INVALID_STATE:定时器已经停止

    删除定时器函数:esp_timer_delete();

    函数原型

    esp_err_t esp_timer_delete

    (

    esp_timer_handle_t timer

    );

    函数功能

    删除定时器

    参数

    [in]gpio_num:引脚编号,0~34(存在部分)

    [in]pull:IO模式,可以设置:

    0:输出低

    1:输出高

     

    返回值

    ESP_OK:成功

    ESP_ERR_INVALID_ARG : 参数错误

    获取定时器时间函数:esp_timer_get_time();

     

    函数原型

    int64_t esp_timer_get_time()

    函数功能

    设置IO输出值

    参数

    none

    返回值

    自调用esp计时器init以来的微秒数(通常在应用程序启动的早期发生)

     

    更多更详细接口请参考

    官方指南

     

     

     


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

出现串口监视器返回乱码的情况,通常有以下几种原因:

  1. 串口速度设置不一致

请确保在串口监视器、代码中以及在主板上串口初始化部分,串口的波特率设置一致,否则就会出现返回乱码的现象。

通常,ESP32开发板的波特率为115200,而串口监视器默认的波特率也是115200。所以如果报错的信息中出现乱码,可以考虑将浏览器或其他串口监视器中的波特率设置与代码和开发板的波特率设置保持一致,再重新打开串口监视器。

  1. 编码格式不一致

请检查代码和串口监视器使用的编码格式是否一致。通常使用的编码格式为UTF-8,如果代码中使用的编码格式和串口监视器使用的编码格式不一致,就会导致监视器返回乱码。

如果使用的是VS Code的话,可以在底部栏中查看文件的编码格式,如下图所示。此外,可以在VS Code的“设置”中搜索“文件编码格式”,查看和更改默认编码格式。

  1. 其他原因

有时候还会因为flash设置不当,出现核心转储问题,导致串行通信端口产生乱码。此时,可以考虑重新烧录flash,或者将程序上传到板子上进行调试。

总之,出现串口监视器返回乱码的情况,需要逐一排查以上问题,定位具体原因。如果以上方案都无法解决问题,可以尝试更换串口监视器或更换设备端口。

当你使用PlatformIO开发ESP32时,出现串口监视器返回乱码的情况,有可能是因为波特率设置不正确、串口驱动程序不匹配、串口接线不稳定等原因造成的。

以下是几种可能的解决方法:

  1. 确认波特率。在platformIO中,串口监视器的波特率需要设置与代码中 Serial.begin() 或 Serial1.begin() 中的参数一致才能正常输出。请确认波特率设置是否正确。

  2. 更换串口驱动程序。有些系统自带的串口驱动程序可能不支持某些芯片或板卡。你可以尝试下载并安装官方或者第三方提供的串口驱动程序来替代原有的驱动程序。

  3. 检查串口接线。如果串口接线存在不稳定的情况,可能会导致数据传输错误和乱码输出。建议使用优质的USB转TTL连线,并确认连接方式和引脚接线是否正确。

  4. 调整串口缓存大小。有时候调整串口缓存大小也可以解决乱码问题。可以在PlatformIO项目配置文件 platformio.ini 中的 [env: esp32] 模块下添加 serial_upload.maximum_ram_size=327680 参数来适当调整串口缓存大小。

  5. 在代码中添加Serial.flush()函数。使用Serial.println()或其他输出函数时,有可能会存在缓存未及时清空导致的输出乱码问题。在代码中添加Serial.flush()函数可以清空串口缓冲区并保证数据能够正确输出。

如果以上方法无法解决问题,则可能需要调整操作系统、更换硬件设备或更新 PlatformIO 等其他方法来解决。

如果在使用PlatformIO开发ESP32时,串口监视器返回乱码,有可能是以下原因导致的:

  1. 串口波特率设置不正确。确保串口波特率设置与代码中的波特率一致。
  2. 串口线接触不良。请检查串口连接线是否插好,线材是否损坏,是否插反等。
  3. 串口芯片与ESP32供电电压不一致。请确保串口芯片和ESP32使用的是相同的电压,否则会导致数据传输错误。
  4. 串口监视器编码设置有误。请确保串口监视器的编码设置与ESP32发送数据的编码格式一致。通常使用的编码格式是UTF-8或ASCII码。
    针对以上可能的原因,可以尝试以下解决方案:
  5. 检查并设置正确的串口波特率。具体操作方法:在PlatformIO中打开串口监视器,点击波特率设置,选择与代码中设置一致的波特率。
  6. 检查并重新插好串口连接线,或替换损坏的线材。
  7. 确认串口芯片和ESP32使用相同的电压。
  8. 尝试使用不同编码格式,例如在串口监视器中选择UTF-8或ASCII码编码格式,查看是否能够正常显示数据。
    如果以上解决方案无效,还可以尝试将ESP32连接到其他电脑,或者使用其他的串口监视器软件,以确保问题不是由于硬件故障或软件设置问题所导致的。

试试下面的方法

  1. 确保程序中使用的波特率和串口监视器中设置的波特率一致。可以用Serial.begin()函数设置波特率,在串口监视器中也要设置相同的波特率。

  2. 尝试更改串口监视器中的编码方式。有些串口监视器默认使用的是ASCII编码,但是在ESP32中,有些字符可能使用的是UTF-8或者其他编码方式。可以尝试更改编码方式,看看是否可以解决乱码问题。

  3. 调整串口波特率。有时候,由于硬件的原因,使用特定的波特率会导致数据传输出错。可以尝试不同的波特率,看看是否可以解决问题。

  4. 试着在程序中增加延时。有时候,ESP32和串口之间的数据传输速度可能过快,导致数据丢失或者乱码。可以尝试在程序中增加延时,看看是否可以解决问题。