找回密码
 立即注册
查看: 153|回复: 6

stc32G8k64 printf 打印数组内容出错

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-09-22 09:37:42

1

主题

2

回帖

31

积分

新手上路

积分
31
发表于 2025-9-20 15:56:10 | 显示全部楼层 |阅读模式
有哪位大神能帮忙看看,解答下心中的疑惑,万分感谢。在使用stc32G8K64串口调试遇到的一个很奇怪的问题,用printf打印同一个全局变量数组里面的内容,数组里面的数据是正确的,用数组里面的数据进行求和和if判断验证都是对的值,但用printf打印出来值有时候是0,有时候值又是对的能正常显示。串口波特率115200
代码如下:
截图202509201552094932.jpg

截图202509201553074216.jpg
看其中两行代码,前后打印的都不一样,其间没有中断或者其他的去改变数组里面的内容:

两行代码

两行代码

用把数组中的数据赋值给临时变量然后同时打印临时变量和数组中的内容,数组的内容的值打印正确,临时变量打印的值却是0:

打印临时变量

打印临时变量

串口打印如下:

串口打印图

串口打印图





回复

使用道具 举报 送花

3

主题

1880

回帖

608

积分

等待验证会员

积分
608
发表于 2025-9-20 15:58:00 | 显示全部楼层
您好,感谢您的提问。

针对您提到的 STC32G8K64 单片机使用 printf 打印数组内容出现异常的问题,结合您提供的代码截图与串口打印输出截图,我将从以下几个方面进行分析与排查:

一、问题现象描述

从您的串口输出截图来看,printf 打印出的内容出现了乱码或非预期的数值,这通常与以下几种情况有关:

1. 格式字符串与参数类型不匹配;
2. 数组越界访问或未正确初始化;
3. 编译器优化或内存对齐问题;
4. printf 重定向未正确实现;
5. 数组地址传递错误或指针使用不当。

二、代码分析(基于截图内容推测)

由于您提供的为截图,无法直接复制代码内容,但根据常规做法,我们可以推测代码中存在类似如下结构:
  1. c
  2. unsigned char array[10] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A};
  3. printf("array[0] = %d\n", array[0]);
  4. printf("array = %s\n", array); // 错误用法
复制代码

常见错误点分析:

1. %s 用于打印非字符串数组:
printf 中 %s 是用于打印以 \0 结尾的字符串,若您将一个 unsigned char 数组直接以 %s 打印,printf 会一直读取内存直到遇到 0x00,这可能导致乱码、崩溃或打印出不可预测的内容。
正确做法是逐个打印数组元素或将其转换为十六进制字符串。

2. 格式符与变量类型不匹配:
例如使用 %d 打印 unsigned char 类型虽然在大多数情况下可以工作,但在某些编译器或优化设置下可能导致类型提升(如 unsigned char 被提升为 int)从而引发打印错误。
推荐使用明确的格式符,例如使用 %u 打印 unsigned int,或使用强制类型转换确保匹配。

3. 数组地址传递错误:
若您尝试打印数组地址,应使用 %p 格式符,并强制转换为 (void) 类型。
示例:printf("array address: %p\n", (void)array);

三、建议修改方式

方式一:逐个打印数组元素(推荐)
  1. c
  2. for (int i = 0; i < 10; i++) {
  3.     printf("array[%d] = 0x%02X\n", i, array[i]);
  4. }
复制代码
使用 %02X 可以以两位十六进制形式输出,便于查看内存数据。
若您想以十进制输出,可使用 %u,但注意类型转换。

方式二:将数组内容转换为字符串后打印

若您希望一次性打印整个数组内容为字符串形式(例如用于调试),可先将其格式化为字符串:
  1. c
  2. char buffer[100];
  3. sprintf(buffer, "Array: %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X",
  4.         array[0], array[1], array[2], array[3], array[4],
  5.         array[5], array[6], array[7], array[8], array[9]);
  6. printf("%s\n", buffer);
复制代码

四、检查 printf 重定向是否正确

由于 STC32G8K64 属于国产 32 位增强型 8051 内核 MCU,其默认不支持标准库函数的串口输出,需手动实现 putchar 函数以重定向 printf 输出:

示例 putchar 函数:
  1. c
  2. int putchar(int ch) {
  3.     UARTSendByte((unsigned char)ch); // 假设您已实现UARTSendByte函数
  4.     return ch;
  5. }
复制代码
请确保已正确实现 UARTSendByte 或等效串口发送函数。
检查串口波特率设置是否与上位机一致,否则也可能导致乱码。

五、其他建议

1. 编译器优化设置:
某些编译器优化级别可能导致变量未按预期顺序压栈,影响 printf 参数解析。建议在调试阶段关闭优化。

2. 使用调试器查看变量值:
若串口输出不可靠,建议使用调试器(如 Keil MDK + STC-Link)单步调试,查看数组内容是否被正确初始化和访问。

3. 避免在中断中使用 printf:
若您在中断服务函数中调用 printf,可能导致堆栈溢出或死锁。建议只在主循环中使用。

六、总结

| 问题点 | 原因 | 解决方案 |
|--------|------|-----------|
| 使用 %s 打印非字符串数组 | 导致乱码或不可预测行为 | 改为逐个打印或格式化输出 |
| 格式符与变量类型不匹配 | 可能引发打印错误 | 使用 %u 或 %02X 并注意类型转换 |
| 未正确实现 printf 重定向 | 无法正常输出 | 实现 putchar 并验证串口通信 |
| 编译器优化或调试环境问题 | 影响变量访问 | 关闭优化或使用调试器验证 |

七、结语

STC32G8K64 是一款性能较强、资源丰富的国产 32 位 MCU,在调试过程中若出现异常打印行为,建议从变量类型、格式符、串口重定向、调试环境等多方面入手排查。

若您方便,建议将代码原文贴出或上传附件,我可以进一步分析具体问题所在。

祝您调试顺利,如有其他问题欢迎继续交流!

—— 国芯人工智能

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:591
  • 最近打卡:2025-10-15 09:49:21
已绑定手机
已实名认证

116

主题

2889

回帖

7364

积分

版主

积分
7364
发表于 2025-9-21 11:53:56 | 显示全部楼层
请描述问题更清楚一点,目前来看似乎printf工作正常,没有出现乱码或者其他的情况?
逻辑问题需要你解释一下代码内容和异常点,不然直接看代码很难看懂
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:585
  • 最近打卡:2025-10-16 07:20:54
已绑定手机

86

主题

6274

回帖

1万

积分

超级版主

积分
11738
发表于 2025-9-21 19:54:24 | 显示全部楼层
数据类型都是匹配的,输出内容也未发现异常
没有使用过HLW8110,如是数值不正确的问题,建议明确说明数据错在哪里:实验组和对照组、理论值和实际值
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:684
  • 最近打卡:2025-10-16 08:01:01
已绑定手机

54

主题

1917

回帖

4075

积分

论坛元老

积分
4075
发表于 2025-9-21 21:15:22 | 显示全部楼层
会不会是你的逻辑有点问题?
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-09-22 09:37:42

1

主题

2

回帖

31

积分

新手上路

积分
31
发表于 2025-9-22 09:37:42 | 显示全部楼层
jw*** 发表于 2025-9-21 21:15
会不会是你的逻辑有点问题?

逻辑哪里问题,printf打印同一个数组里面的内容,其中就间隔两行代码数据打印都不一样,其间的代码没有去改变数组里面的内容。但是用把数组的数据赋值給一个临时变量,然后打印临时变量也是0,但是把数组里面的数据进行求和,求和的值又是对的,单个打印就是显示0
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-09-22 09:37:42

1

主题

2

回帖

31

积分

新手上路

积分
31
发表于 2025-9-22 09:52:48 | 显示全部楼层
Debu*** 发表于 2025-9-21 19:54
数据类型都是匹配的,输出内容也未发现异常
没有使用过HLW8110,如是数值不正确的问题,建议明确说明数据错 ...

串口打印截图第一个红框里面的数据就是正确值,数组里面是明确有数据的,进行求和或者if判断等操作值都是对的,但printf打印就是有时候能正常值,有时候为0,其间就间隔两行代码,打印的结果都不一样,其间的代码没有去改变数组的内容,更没有中断去改变数组的值。
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-10-16 10:27 , Processed in 0.134634 second(s), 82 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表