在用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 时,如果串口监视器返回乱码,有几个可能的原因:
serial_baud 设置,确保为 115200。
终端字体设置错误。有些字体不支持中文,会显示为乱码。你可以更改终端字体设置,选择支持中文的字体,如微软雅黑等。
serial.rx_buffer_size 配置太小。ESP32 有时会有较长的串口打印,如果 buffer 太小会 trunc 掉部分内容,显示为乱码。你可以在platformio.ini 中设置:
serial.rx_buffer_size = 1024
Serial.print(String("中文").c_str()); // 错误,会乱码
Serial.print(String("中文").c_str()); // 正确,支持中文
通常情况下,检查 platformio.ini 的配置(特别是 serial_baud 和 serial.rx_buffer_size),使用支持 UTF-8 的串口输出函数,更改终端字体到支持中文的字体,就可以解决大部分串口输出乱码的问题。
引用chatgpt:
该问题通常是由于串口波特率或编码格式设置错误引起的。下面是一些可能的解决方法:
创建定时器函数: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以来的微秒数(通常在应用程序启动的早期发生) |
更多更详细接口请参考
官方指南。
出现串口监视器返回乱码的情况,通常有以下几种原因:
请确保在串口监视器、代码中以及在主板上串口初始化部分,串口的波特率设置一致,否则就会出现返回乱码的现象。
通常,ESP32开发板的波特率为115200,而串口监视器默认的波特率也是115200。所以如果报错的信息中出现乱码,可以考虑将浏览器或其他串口监视器中的波特率设置与代码和开发板的波特率设置保持一致,再重新打开串口监视器。
请检查代码和串口监视器使用的编码格式是否一致。通常使用的编码格式为UTF-8,如果代码中使用的编码格式和串口监视器使用的编码格式不一致,就会导致监视器返回乱码。
如果使用的是VS Code的话,可以在底部栏中查看文件的编码格式,如下图所示。此外,可以在VS Code的“设置”中搜索“文件编码格式”,查看和更改默认编码格式。
有时候还会因为flash设置不当,出现核心转储问题,导致串行通信端口产生乱码。此时,可以考虑重新烧录flash,或者将程序上传到板子上进行调试。
总之,出现串口监视器返回乱码的情况,需要逐一排查以上问题,定位具体原因。如果以上方案都无法解决问题,可以尝试更换串口监视器或更换设备端口。
当你使用PlatformIO开发ESP32时,出现串口监视器返回乱码的情况,有可能是因为波特率设置不正确、串口驱动程序不匹配、串口接线不稳定等原因造成的。
以下是几种可能的解决方法:
确认波特率。在platformIO中,串口监视器的波特率需要设置与代码中 Serial.begin() 或 Serial1.begin() 中的参数一致才能正常输出。请确认波特率设置是否正确。
更换串口驱动程序。有些系统自带的串口驱动程序可能不支持某些芯片或板卡。你可以尝试下载并安装官方或者第三方提供的串口驱动程序来替代原有的驱动程序。
检查串口接线。如果串口接线存在不稳定的情况,可能会导致数据传输错误和乱码输出。建议使用优质的USB转TTL连线,并确认连接方式和引脚接线是否正确。
调整串口缓存大小。有时候调整串口缓存大小也可以解决乱码问题。可以在PlatformIO项目配置文件 platformio.ini 中的 [env: esp32] 模块下添加 serial_upload.maximum_ram_size=327680 参数来适当调整串口缓存大小。
在代码中添加Serial.flush()函数。使用Serial.println()或其他输出函数时,有可能会存在缓存未及时清空导致的输出乱码问题。在代码中添加Serial.flush()函数可以清空串口缓冲区并保证数据能够正确输出。
如果以上方法无法解决问题,则可能需要调整操作系统、更换硬件设备或更新 PlatformIO 等其他方法来解决。
如果在使用PlatformIO开发ESP32时,串口监视器返回乱码,有可能是以下原因导致的:
试试下面的方法
确保程序中使用的波特率和串口监视器中设置的波特率一致。可以用Serial.begin()函数设置波特率,在串口监视器中也要设置相同的波特率。
尝试更改串口监视器中的编码方式。有些串口监视器默认使用的是ASCII编码,但是在ESP32中,有些字符可能使用的是UTF-8或者其他编码方式。可以尝试更改编码方式,看看是否可以解决乱码问题。
调整串口波特率。有时候,由于硬件的原因,使用特定的波特率会导致数据传输出错。可以尝试不同的波特率,看看是否可以解决问题。
试着在程序中增加延时。有时候,ESP32和串口之间的数据传输速度可能过快,导致数据丢失或者乱码。可以尝试在程序中增加延时,看看是否可以解决问题。