Ai8051U教学视频笔记打卡第五集

如何在单片机上使用printf函数?
答:在USB库中启用printf的HID宏定义即可使用。具体操作是在代码中找到相关宏定义(如 #define USE_PRINTF_HID
),解除注释后重新编译即可实现printf功能。


如何正确使用字符串及转换说明?
答:字符串需用英文双引号包裹,转义字符需符合C语言规范(如换行符应为 \n
而非错误表述的"\n")。格式说明符需与变量类型严格匹配,例如 %s
对应字符串,%d
对应整型。

如何在代码中运用printf进行数据输出?
答:接收数据后可通过格式控制输出,例如:
int value = 42;
printf("当前数值:%d\n", value); // 正确换行符
输出位置应避免在中断服务例程中直接使用,建议通过缓冲区机制处理。
串口通信中如何正确显示发送数据?
答:当使用 printf
发送数据时:
- 确保串口初始化正确
- 发送指令示例:
printf("AT+CMD\r\n");
- 在循环中使用时应添加适当延时,例如:
while(1) {
printf("心跳包\n");
HAL_Delay(1000); // 添加1秒延时
}
如何正确使用格式说明符?
答:标准格式说明符应为:
%s
:字符串(注意大小写敏感,应小写)
%d
:十进制整型
%ld
:长整型
%f
:浮点型
%x
:十六进制
错误示例修正:
// 错误示例
printf("数值:%S", str);
// 正确示例
printf("数值:%s", str);
如何处理不同进制转换?
答:二进制转换示例:
uint8_t num = 0b10100101;
printf("十进制:%d\n十六进制:%02x\n", num, num);
// 输出:
// 十进制:165
// 十六进制:a5
如何配置64位变量支持?
答:32位编译器支持64位变量的正确方法:
- 使用标准类型定义:
int64_t bigNumber = 9223372036854775807LL;
uint64_t uBigNumber = 18446744073709551615ULL;
- 打印时使用正确格式符:
printf("64位数:%lld\n", bigNumber);
如何规范变量定义?
答:推荐使用标准类型别名:
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned long uint32_t;
错误修正:
// 错误示例
#define U8_UNSIGNED char
// 正确示例
typedef unsigned char uint8_t;
算术运算符注意事项:
- 整数除法示例:
int a = 5, b = 2;
printf("5/2=%d,余数=%d\n", a/b, a%b); // 输出2余1
- 浮点运算需类型转换:
float result = (float)a / b;
printf("精确结果:%.2f\n", result); // 输出2.50
关系运算符的正确使用:
if(x > y) {
// 当x=5,y=3时执行
} else if(x == y) {
// 相等时执行
} else {
// 其他情况
}
逻辑运算符原理:
// 与运算(&&)
if(condition1 && condition2) // 需同时成立
// 或运算(||)
if(condition1 || condition2) // 任一成立
// 取反(!)
if(!flag) // flag为假时成立
位运算示例:
uint8_t a = 0x05; // 00000101
printf("取反:%02x\n", ~a); // 输出fa(11111010)
printf("左移:%02x\n", a<<2); // 输出14(00010100)
printf("右移:%02x\n", a>>1); // 输出02(00000010)
类型溢出处理:
uint16_t result = (uint16_t)var1 * var2; // 强制类型转换
特殊符号转义:
printf("显示百分比:%%\n"); // 输出%
printf("制表符:开始\t结束\n"); // 输出带空格分隔

若出现以下错误信息如何解决?
main.c(93): warning C95: 'printf': too many actual parameters
main.c(93): warning C140: 'printf' undefined; assuming 'extern int printf()'
答:原因是usb库中未定义;去掉#define PRINTF_HID 的注释符号。
