mfsljtpq 发表于 2025-9-22 16:09:28

Ai8051U-32Bit 串口打印数据用CDC/HID-串口助手不能正常显示

Ai8051U-32Bit 串口打印数据,不能正常显示,请问是什么原因?


设置打印语句
printf("ir_pwm_init ok! \r\n");

在CDC/HID-串口助手中可以正常显示
接收←ir_pwm_init ok!


设置打印数据
printf("KeyCode = %u\r\n", KeyCode);


printf("KeyCode = %bu\r\n", KeyCode);

printf("KeyCode = %d\r\n", KeyCode);


在CDC/HID-串口助手中不能正常显示
接收←............................................


但在sscom5.13.1中可以正常显示
收←◆KeyCode = 15





国芯人工智能 发表于 2025-9-22 16:12:00

您好,关于您在使用 Ai8051U-32Bit 芯片时,通过 printf 函数进行串口打印时出现的数据在 CDC/HID-串口助手 中无法正常显示的问题,结合您提供的现象,我们可以从以下几个方面进行专业分析和排查:

一、问题现象回顾

1. 正常情况:
打印语句 printf("irpwminit ok! \r\n"); 在 CDC/HID 串口助手中可以正常显示。
输出示例:接收←irpwminit ok!

2. 异常情况:
打印语句 printf("KeyCode = %u\r\n", KeyCode); 在 CDC/HID 助手中无法显示完整内容。
输出示例:接收←
但在 sscom5131 串口助手中可以正常显示:
输出示例:收←◆KeyCode = 15

二、可能原因分析

1. 串口通信配置不一致

尽管 CDC/HID 和 sscom5131 都是串口工具,但它们在底层串口配置(如波特率、数据位、停止位、校验位)上可能存在细微差异。建议您确认以下几点:
波特率设置是否一致(如 9600、115200)
数据位是否为 8 位
停止位是否为 1
校验位是否为无校验
建议操作: 在两个串口工具中均手动设置串口参数,确保与芯片的串口初始化配置完全一致。

2. 缓冲区处理机制不同

CDC/HID 工具与 sscom5131 的缓冲区处理方式可能不同,尤其是在处理格式化输出(如 %u)时,可能存在如下问题:
CDC/HID 对非 ASCII 字符或控制字符(如 \r\n)处理不兼容;
缓冲区未及时刷新,导致数据未完整接收;
接收窗口未及时刷新或存在缓存延迟。
建议操作: 在每次 printf 后调用 fflush(stdout);,确保输出缓冲区的内容立即发送。

3. printf 函数的实现方式不同

嵌入式系统中 printf 函数通常为简化版本,可能不支持某些格式化参数,或对缓冲区大小有限制。若 KeyCode 值较大,可能导致字符串转换失败或缓冲区溢出。
建议操作:
检查 printf 是否支持 %u;
替换为 printf("KeyCode = %d\r\n", (int)KeyCode); 测试;
或使用 sprintf 配合自定义串口发送函数进行调试输出。

4. 串口驱动或 CDC/HID 工具本身兼容性问题

某些串口工具在处理特定设备(如基于 CDC 的虚拟串口)时存在兼容性问题,尤其在处理高速或连续输出时表现不佳。
建议操作:
尝试使用其他串口工具(如 XCOM、Tera Term、RealTerm)进行测试;
更新 CDC 虚拟串口驱动至最新版本。

5. 数据传输过程中出现乱码或丢失

在使用 printf 打印变量时,若变量值变化较快或串口波特率设置过高,可能导致数据丢失或乱码,进而被 CDC/HID 工具过滤或丢弃。
建议操作:
降低串口波特率(如从 115200 改为 9600)进行测试;
增加打印间隔时间(如添加延时);
检查芯片串口发送是否启用中断或DMA,是否影响数据完整性。

三、推荐调试步骤

1. 确认串口配置一致性
检查芯片串口初始化代码;
确保 CDC/HID 工具中串口参数与代码中一致。

2. 验证 printf 支持格式
尝试替换 %u 为 %d 或其他格式符;
若使用自定义 printf 实现,检查其支持的格式列表。

3. 强制刷新缓冲区
   c
   printf("KeyCode = %u\r\n", KeyCode);
   fflush(stdout); // 强制刷新输出缓冲区

4. 使用 sprintf + 自定义串口发送函数
   c
   char buffer;
   sprintf(buffer, "KeyCode = %u\r\n", KeyCode);
   UARTSendString(buffer); // 假设 UARTSendString 为自定义串口发送函数

5. 更换串口调试工具
推荐尝试:
Tera Term(支持日志记录和高级设置)
RealTerm(适合调试二进制/高速串口)
XCOM(国产工具,界面简洁)

6. 检查波特率与硬件限制
若波特率设置过高(如 921600),可能导致芯片或主机端无法及时处理;
建议优先使用 115200 进行调试。

四、结论

综上所述,CDC/HID 串口助手无法正常显示 printf("KeyCode = %u\r\n", KeyCode); 打印信息 的原因可能包括:
串口参数配置不一致;
printf 实现不支持 %u 或缓冲区处理问题;
CDC/HID 工具对接收数据的处理机制存在兼容性;
数据传输速率过高或缓冲区未及时刷新。

建议您通过上述步骤逐一排查,尤其是使用 fflush(stdout) 和更换调试工具的方式,可快速定位问题所在。

如需进一步分析,建议提供以下信息:
芯片串口初始化代码;
printf 使用的底层实现(标准库或自定义);
CDC/HID 工具的具体版本;
使用的开发环境(如 Keil、IAR、GCC 等)。

如需技术支持或进一步协助,请随时联系。祝您调试顺利!

[本文内容由国芯人工智能辅助生成,仅供参考]

AI芯 发表于 2025-9-22 16:53:30

推荐优先看的 printf_usb()及usb不停电下载演示视频
https://www.stcaimcu.com/thread-19077-1-1.html
(出处: 国芯人工智能技术交流网站)
printf函数 的 格式参数; USB接口 使用 printf 打印数据
https://www.stcaimcu.com/thread-6864-1-1.html
(出处: 国芯人工智能技术交流网站)

mfsljtpq 发表于 2025-9-22 17:09:18

AI芯 发表于 2025-9-22 16:53
推荐优先看的 printf_usb()及usb不停电下载演示视频
https://www.stcaimcu.com/thread-19077-1-1.html
(出 ...
格式都试过了,用的uart1 P3.6 P3.7,有打印,只是用CDC/HID-串口助手不能正常显示

ercircle 发表于 2025-9-25 11:23:09

mfsljtpq 发表于 2025-9-22 17:09
格式都试过了,用的uart1 P3.6 P3.7,有打印,只是用CDC/HID-串口助手不能正常显示 ...



AUXR寄存器值被定时器初始化错改了




mfsljtpq 发表于 2025-9-25 11:59:42

ercircle 发表于 2025-9-25 11:23
AUXR寄存器值被定时器初始化错改了
好的,感谢。请问有支持 矩阵按键单键短按长按,组合键最多支持3键最长5秒的Demo吗

ercircle 发表于 2025-9-25 15:12:29

mfsljtpq 发表于 2025-9-25 11:59
好的,感谢。请问有支持 矩阵按键单键短按长按,组合键最多支持3键最长5秒的Demo吗 ...


8 x 8 (或A x B?) 矩阵按键 按键处理 单击或长按? - I/O读写及点灯,外部中断 ,所有I/O都支持的普通I/O中断,按键扫描 国芯人工智能技术交流网站 - AI32位8051交流社区
这个挺常见论坛里搜索就行

mfsljtpq 发表于 2025-9-25 15:33:56

ercircle 发表于 2025-9-25 15:12
8 x 8 (或A x B?) 矩阵按键 按键处理 单击或长按? - I/O读写及点灯,外部中断 ,所有I/O都支持的普通I ...

好,感谢,我去学习下

mfsljtpq 发表于 2025-9-26 17:32:04

ercircle 发表于 2025-9-25 15:12
8 x 8 (或A x B?) 矩阵按键 按键处理 单击或长按? - I/O读写及点灯,外部中断 ,所有I/O都支持的普通I ...
请问可以打印这个吗,试了下没有__FUNCTION__
printf("%s %s %d\n\r", __FILE__, __FUNCTION__, __LINE__);

ercircle 发表于 2025-9-26 19:45:11

mfsljtpq 发表于 2025-9-26 17:32
请问可以打印这个吗,试了下没有__FUNCTION__
printf("%s %s %d\n\r", __FILE__, __FUNCTION__, __LINE__) ...

看keil帮助文档里只有这些:


页: [1]
查看完整版本: Ai8051U-32Bit 串口打印数据用CDC/HID-串口助手不能正常显示