找回密码
 立即注册
查看: 167|回复: 3

printf_usb

[复制链接]
  • 打卡等级:常住居民I
  • 打卡总天数:73
  • 最近打卡:2025-10-16 08:44:29
已绑定手机

3

主题

30

回帖

395

积分

中级会员

积分
395
发表于 2025-9-5 15:36:19 | 显示全部楼层 |阅读模式
aicube生成的代码,输出数据不对,求解答 void main(void)
    {
        //<<AICUBE_USER_MAIN_INITIAL_BEGIN>>
        //u16 i, a;
        // 在此添加用户主函数初始化代码
        //<<AICUBE_USER_MAIN_INITIAL_END>>

        SYS_Init();

        //<<AICUBE_USER_MAIN_CODE_BEGIN>>
        // 在此添加主函数中运行一次的用户代码
        //<<AICUBE_USER_MAIN_CODE_END>>
        while (1)
        {
            //<<AICUBE_USER_MAIN_LOOP_BEGIN>>
            // 在此添加主函数中用户主循环代码
            // printf_usb("Hello World !\r\n");
            printf_usb("%d\r\n",(char)0x55);
            delay_ms(1000);
            // 接收数据原样返回,用于测试usb OUT done();
            // 当使用査询方式 if(bUsbOutReady),查询调用 USB 库函数时,在数据处理完成后,//必须调用一次“usb OUT done0;”,这样才能接收下一包数据。
            //<<AICUBE_USER_MAIN_LOOP_END>>
        }
    }     printf_usb("%d\r\n",(char)0x55); 输出的数实际为21978

wechat_2025-09-05_153529_488.png
回复

使用道具 举报 送花

3

主题

1880

回帖

608

积分

等待验证会员

积分
608
发表于 2025-9-5 15:38:00 | 显示全部楼层
根据您提供的代码片段,printfusb("%d\r\n", (char)0x55); 输出的数值为 21978,这表明在使用 printfusb 函数时,格式字符串 %d 被错误地用于输出一个 char 类型的值。由于 char 在 C 语言中通常为有符号类型(即 -128 到 127),当其值为 0x55(即十进制的 85)时,按照 %d 格式化输出,应显示为 85,而非 21978。

问题分析

%d 是用于输出整数(int)类型的格式说明符,而 (char)0x55 的类型是 char。如果系统中 char 被定义为有符号类型,那么 0x55 对应的十进制值为 85,不会导致异常输出。但若 char 被定义为无符号类型(unsigned char),则 0x55 仍然表示 85。

然而,在您的实际运行中,输出结果为 21978,这表明 printfusb 可能将 char 类型误认为是 int 或 short 等其他类型,并以错误的方式进行解释。这可能是由于以下原因:

1. 函数参数类型不匹配:printfusb 的实现可能期望的是 int 类型,但传入的是 char,导致数据被错误解析。
2. 编译器对类型提升的处理:在 C 语言中,char 类型在传递给变参函数(如 printf)时会被自动提升为 int,但在某些情况下,尤其是当 char 被视为无符号时,可能会导致高位字节被错误地保留。
3. printfusb 实现问题:如果 printfusb 是自定义的函数,其内部处理方式可能存在错误,例如未正确识别参数类型或格式说明符。

解决方案建议

1. 显式转换为 int 类型  
   将 (char)0x55 显式转换为 int,以确保传递给 printfusb 的是正确的类型:
  
  1. c
  2.    printfusb("%d\r\n", (int)(0x55));
复制代码

2. 检查 printfusb 的实现  
   如果 printfusb 是自定义函数,请检查其源码,确认其对参数类型的处理是否符合预期。特别是要确保其能够正确识别和处理 char、int 等不同类型的参数。

3. 使用无符号格式说明符  
   如果需要输出 0x55 的十六进制形式,可以使用 %02X 或 %02x 格式说明符:
  
  1. c
  2.    printfusb("0x%02X\r\n", (unsigned char)0x55);
复制代码

4. 验证系统配置  
   检查编译器设置,确认 char 是否为有符号类型(默认为有符号)。可以通过 #ifdef CHARUNSIGNED 进行判断。

总结

printfusb("%d\r\n", (char)0x55); 输出 21978 是由于类型不匹配导致的格式化错误。建议将 char 显式转换为 int,并检查 printfusb 的实现逻辑,以确保其能正确处理输入参数。如需进一步调试,可打印 sizeof(char) 和 sizeof(int) 以确认类型大小及编译器行为。

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

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:84
  • 最近打卡:2025-09-23 10:49:00

25

主题

468

回帖

2934

积分

超级版主

积分
2934
发表于 2025-9-5 16:35:34 | 显示全部楼层
可以参考这个帖子:
https://www.stcaimcu.com/thread-16818-1-2.html
推荐优先看的 printf_usb("Hello World !\r\n")及usb不停电下载



电话:0513-55012946 QQ:2195591714  微信:  19952583740
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:329
  • 最近打卡:2025-10-16 08:46:33
已绑定手机

85

主题

3257

回帖

7200

积分

荣誉版主

无情的代码机器

积分
7200
发表于 2025-9-5 16:40:21 | 显示全部楼层
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-10-16 10:52 , Processed in 0.150232 second(s), 73 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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