赫兹豆 发表于 2025-9-5 15:36:19

printf_usb

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

国芯人工智能 发表于 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 的是正确的类型:
   c
   printfusb("%d\r\n", (int)(0x55));

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

3. 使用无符号格式说明符
   如果需要输出 0x55 的十六进制形式,可以使用 %02X 或 %02x 格式说明符:
   c
   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) 以确认类型大小及编译器行为。

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

32G12K128 发表于 2025-9-5 16:35:34

可以参考这个帖子:
https://www.stcaimcu.com/thread-16818-1-2.html
推荐优先看的 printf_usb("Hello World !\r\n")及usb不停电下载
https://v.stcai.com/sv/1c5eec2-197fcd9b766/1c5eec2-197fcd9b766.mp4
https://v.stcai.com/sv/1fce8086-197cf2b9dd4/1fce8086-197cf2b9dd4.mp4

ercircle 发表于 2025-9-5 16:40:21



printf格式符设置的不对,8位,printf打印一个字节要加上前导符b
printf函数 的 格式参数; USB接口 使用 printf 打印数据 - 串行口,DMA支持的4组串口,RS232,RS485,Modbus, CRC16 国芯人工智能技术交流网站 - AI32位8051交流社区
页: [1]
查看完整版本: printf_usb