Skip to content

1. Ubuntu系统下Arduino UNO R4 WiFi上传问题排查与解决

问题现象

  • Arduino IDE编译成功,但上传失败。
  • 错误日志显示:SAM-BA operation failedidentifyChip()=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/工具
  • 善用系统工具lsusbdmesglsofsystemctl 是解决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 二级汉字,覆盖生僻字

问题原因:使用了 chinese1chinese2 级别的字体,而你的文字中包含的某个汉字超出了该字体所包含的字符集范围,导致该字符无法渲染。

解决方案

使用 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_gb2312aGB2312 一级汉字,已验证有效
显示生僻字或繁体字u8g2_font_wqy12_t_gb2312bGB2312 二级汉字
代码文件为 GB2312 编码u8g2_font_wqy12_t_gb2312GB2312 编码
代码文件为 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)需与字体编码匹配。
  • 优先使用 gb2312agb2312a 字体覆盖 GB2312 一级汉字(3755个常用字),能满足绝大部分中文显示需求,且已验证有效。

结论

U8g2 中部分中文不显示是因为所选字体包含的汉字数量不足。将字体从 chinese1/chinese2 更换为 u8g2_font_wqy12_t_gb2312a 后,问题即可解决。