在使用 ESP8266 在屏幕显示中文字符的时候, 需要用到中文字符库. 根据网上的资料, 常用的库是 u8g2.
u8g2 库中包括了中文字库 wqy. 这个字库包括了不同大小的几个字符集, chinese1, chinese2, chinese3, gb2312a, gb2312b, gb2312. 前几个demo字符集小但是绝大部分文字都没有收录, 而直接使用后面的几个字符集又会报错:
.../.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/bin/ld.exe: .pio\build\esp12e\firmware.elf section `.rodata' will not fit in region `dram0_0_seg'
.../.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/bin/ld.exe: address 0x40026778 of .pio\build\esp12e\firmware.elf section `.bss' is not within region `dram0_0_seg'
.../.platformio/packages/toolchain-xtensa/xtensa-lx106-elf/bin/ld.exe: address 0x40026778 of .pio\build\esp12e\firmware.elf section `.bss' is not within region `dram0_0_seg'
不难看出, 是内存不够用了. 为了解决这个问题, 网上可以查到的简单解决办法, 例如使用 --gc-sections
等参数都不管用.
此时只好尝试使用别人的魔改库, 参考了这篇文章后成功了, 可以使用最大的 u8g2_font_wqy16_t_gb2312
. 具体方法是: 在 .pio/libdeps
里面先安装标准版本的 u8g2 和 wqy 库. 之后把魔改的文件直接覆盖已有文件. (否则, platformio 会自动重新下载标准版本.)
于是仔细检查了一下文件的区别, 发现主要不同的只有 u8g2 库更新了这些文件: (此处下载的是 u8g2 v1.8.0, wqy (commit: 34d1bf7))
src/u8g2_fonts.h
src/U8g2_for_Adafruit_GFX.cpp
进一步对比发现, 魔改版新增的内容如下:
$ diff modified/u8g2_fonts.h standard/u8g2_fonts.h
61,67d60
< #if defined(ESP8266)
< uint8_t u8x8_pgm_read_esp(const uint8_t * addr); /* u8x8_8x8.c */
< # define U8X8_FONT_SECTION(name) __attribute__((section(".text." name)))
< # define u8x8_pgm_read(adr) u8x8_pgm_read_esp(adr)
< # define U8X8_PROGMEM
< #endif
<
$ diff ~/u8g21.cpp ~/u8g22.cpp
40c40
< #include "u8g2_fonts.h"
---
>
44,51c44
< #if defined(ESP8266)
< uint8_t u8x8_pgm_read_esp(const uint8_t * addr)
< {
< uint32_t bytes;
< bytes = *(uint32_t*)((uint32_t)addr & ~3);
< return ((uint8_t*)&bytes)[(uint32_t)addr & 3];
< }
< #endif
---
>
估计直接修改这两个文件也是可行的.