Appearance
1. Ubuntu系统下Arduino UNO R4 WiFi上传问题排查与解决
问题现象
- Arduino IDE编译成功,但上传失败。
- 错误日志显示:
SAM-BA operation failed、identifyChip()=nRF52840-QIAA。 - 在Windows系统下上传完全正常,但在Ubuntu下反复失败。
排查过程
| 步骤 | 操作 | 发现 |
|---|---|---|
| 1 | 检查USB设备 | lsusb显示板子ID为2341:1002 (CMSIS-DAP模式),而非2341:0064 |
| 2 | 尝试切换模式 | 双击/长按RESET,模式未能切换 |
| 3 | 检查串口占用 | sudo lsof /dev/ttyACM0发现端口被otbr-agent占用 |
| 4 | 停止冲突服务 | sudo systemctl stop otbr-agent后上传成功 |
根本原因
系统服务 otbr-agent (OpenThread Border Router) 自动占用 /dev/ttyACM0 串口,导致Arduino IDE的烧录工具 bossac 无法与板子正常通信。
解决方案
永久禁用 otbr-agent 服务
bash
sudo systemctl stop otbr-agent
sudo systemctl disable otbr-agent临时释放端口
bash
sudo fuser -k /dev/ttyACM0关键命令速查
| 用途 | 命令 |
|---|---|
| 查看串口设备 | ls -l /dev/ttyACM* |
| 查看USB设备 | lsusb |
| 查看端口占用 | sudo lsof /dev/ttyACM0 |
| 停止服务 | sudo systemctl stop <服务名> |
| 禁用服务 | sudo systemctl disable <服务名> |
| 强制释放端口 | sudo fuser -k /dev/ttyACM0 |
| 使用pyocd烧录 | pyocd load -t cortex_m sketch.elf |
调试启示
- 端口占用是隐形杀手:当硬件驱动看起来都正常时,系统后台服务占用串口是首要排查方向。
- 问题分层排查:
硬件 → 驱动 → 系统服务/端口 → IDE/工具。 - 善用系统工具:
lsusb、dmesg、lsof、systemctl是解决Linux硬件问题的利器。
结论
关闭 otbr-agent 服务后,Arduino UNO R4 WiFi 在 Ubuntu 下的上传功能恢复正常。该问题本质是系统服务与开发工具的资源竞争,而非硬件或代码本身的缺陷。
2. 在U8g2中部分中文不显示的问题排查与解决
问题现象
- 在U8g2库中显示汉字时,部分汉字显示正常,部分显示为空白或乱码。
- 代码编译通过,但屏幕上的中文显示不完整。
- 例如:
"你好温度"可能显示为"你好□"或"你好 度"。
排查过程
| 步骤 | 操作 | 发现 |
|---|---|---|
| 1 | 检查代码中的字体设置 | u8g2.setFont(u8g2_font_wqy12_t_chinese1) 或类似设置 |
| 2 | 确认U8g2库版本 | U8g2库支持多种中文字体,但不同字体包含的汉字数量不同 |
| 3 | 查阅U8g2字体文档 | U8g2的内置中文字体分为不同等级,覆盖的汉字数量不同 |
| 4 | 更换字体测试 | 使用 u8g2_font_wqy12_t_gb2312a 后所有汉字正常显示 |
根本原因
U8g2内置的中文字体按包含的汉字数量分为不同等级:
| 字体名称 | 包含汉字数量 | 说明 |
|---|---|---|
u8g2_font_wqy12_t_chinese1 | 约 1000+ 字 | 常用汉字,覆盖日常使用频率最高的汉字 |
u8g2_font_wqy12_t_chinese2 | 约 2000+ 字 | 扩展汉字,包含更多汉字 |
u8g2_font_wqy12_t_chinese3 | 约 5000+ 字 | 完整汉字集,覆盖绝大部分汉字 |
u8g2_font_wqy12_t_gb2312a | 约 3000+ 字 | GB2312 一级汉字,覆盖常用汉字,兼容性较好 |
u8g2_font_wqy12_t_gb2312b | 约 3000+ 字 | GB2312 二级汉字,覆盖生僻字 |
问题原因:使用了 chinese1 或 chinese2 级别的字体,而你的文字中包含的某个汉字超出了该字体所包含的字符集范围,导致该字符无法渲染。
解决方案
使用 gb2312a 字体(推荐,经验证有效)
cpp
// 使用 GB2312 一级汉字字体
u8g2.setFont(u8g2_font_wqy12_t_gb2312a);字体选择速查
| 使用场景 | 推荐字体 | 说明 |
|---|---|---|
| 显示少量常用汉字(如:你好、开始、停止) | u8g2_font_wqy12_t_chinese1 | 节省内存 |
| 显示中等数量汉字(如:传感器数据、状态信息) | u8g2_font_wqy14_t_chinese2 | 平衡内存与覆盖范围 |
| 显示大量/生僻汉字(如:完整段落、诗词) | u8g2_font_wqy16_t_chinese3 | 覆盖最全,占用内存最多 |
| 显示常用汉字,兼容性好 | u8g2_font_wqy12_t_gb2312a | GB2312 一级汉字,已验证有效 |
| 显示生僻字或繁体字 | u8g2_font_wqy12_t_gb2312b | GB2312 二级汉字 |
| 代码文件为 GB2312 编码 | u8g2_font_wqy12_t_gb2312 | GB2312 编码 |
| 代码文件为 UTF-8 编码 | u8g2_font_wqy12_t_chinese3 | 配合 enableUTF8Print() 使用 |
关键命令/代码
启用 UTF-8 支持
cpp
u8g2.enableUTF8Print(); // 在 setup() 中调用设置字体(推荐方案)
cpp
u8g2.setFont(u8g2_font_wqy12_t_gb2312a); // 经验证可解决中文缺字问题查看 U8g2 支持的字体列表
bash
grep -E "u8g2_font_wqy[0-9]+_t_" ~/Arduino/libraries/U8g2/src/clib/u8g2_fonts.c查看具体字体定义
bash
cat ~/Arduino/libraries/u8g2_wqy/src/u8g2_wqy.h | grep "u8g2_font"调试启示
- 字符集是关键:中文字体包含的字符数量有限,不同字体覆盖范围不同。
- 编码需匹配:代码文件编码(UTF-8/GB2312)需与字体编码匹配。
- 优先使用 gb2312a:
gb2312a字体覆盖 GB2312 一级汉字(3755个常用字),能满足绝大部分中文显示需求,且已验证有效。
结论
U8g2 中部分中文不显示是因为所选字体包含的汉字数量不足。将字体从 chinese1/chinese2 更换为 u8g2_font_wqy12_t_gb2312a 后,问题即可解决。