《Ai8051U教学视频》第五集学习笔记:C语言基础配套程序 —— C语言USB-CDC串口之printf函数的实现
在《Ai8051U教学视频》第五集中,我们重点学习了如何在基于USB-CDC串口通信的嵌入式系统中实现标准C语言中的printf函数。通过本集的学习,我们不仅掌握了C语言基础语法中与printf相关的核心知识,还了解了如何将其适配到特定的硬件平台(如USB-CDC串口)上进行输出。本文将围绕本集内容,结合打卡点“PRINTFHID宏定义”、“printf函数原型定义”、“数的进制”、“数据的基本类型”以及“C语言常用运算符”等知识点,进行总结与拓展。
一、打卡点:PRINTFHID宏定义
在嵌入式开发中,尤其是资源受限的MCU(如8051系列)上,标准C库的stdio.h中的printf函数通常不能直接使用,因为它依赖于底层的write系统调用,而MCU中没有标准的文件系统接口。
在本视频中,通过定义PRINTFHID宏,来启用针对HID(Human Interface Device)设备的printf实现。该宏通常用于条件编译,确保在使用HID接口作为输出通道时,相关的打印函数被正确包含和配置。
例如:
复制代码
当该宏被定义后,编译器会启用与HID设备通信的底层函数,如hidputchar,并通过重定向write函数或自定义printf输出函数,将输出内容通过HID设备(如USB虚拟串口)发送到PC端。
二、理解printf函数原型的定义
标准C语言中printf函数的原型定义如下:
- c
- int printf(const char format, ...);
复制代码
其核心特点包括:
可变参数:使用...表示可变参数列表,允许传入多个不同类型的参数。
格式化字符串:第一个参数format是一个格式字符串,用于控制后续参数的输出格式。
返回值:返回成功输出的字符数。
在嵌入式环境中,为了实现printf功能,通常需要:
1. 实现底层字符输出函数(如putchar);
2. 使用stdarg.h库处理可变参数;
3. 解析格式字符串并逐个处理参数;
4. 将处理后的字符通过指定的输出通道(如UART、USB-CDC、HID等)发送出去。
例如,自定义printf的简化实现如下:
- c
- include
- void myputchar(char c) {
- // 实现将字符c发送到USB-CDC串口的代码
- }
- void myprintf(const char format, ...) {
- valist args;
- vastart(args, format);
- while (format) {
- if (format == '%') {
- format++;
- switch (format) {
- case 'd': {
- int val = vaarg(args, int);
- // 实现整数转字符串并输出
- break;
- }
- case 'x': {
- unsigned int val = vaarg(args, unsigned int);
- // 实现十六进制输出
- break;
- }
- case 'c': {
- char c = (char)vaarg(args, int);
- myputchar(c);
- break;
- }
- case 's': {
- char s = vaarg(args, char );
- while (s) myputchar(s++);
- break;
- }
- default:
- myputchar(format);
- }
- } else {
- myputchar(format);
- }
- format++;
- }
- vaend(args);
- }
复制代码
通过上述代码,我们可以在资源受限的嵌入式系统中实现基本的printf功能。
三、数的进制:2进制、10进制、16进制
在嵌入式开发中,理解和使用不同进制的数是基础技能之一。
1. 二进制(Binary)
基数为2,仅由0和1组成。
是计算机最底层的表示方式。
例如:0b1010表示十进制的10。
2. 十进制(Decimal)
基数为10,使用数字0~9。
是人类最常用的进制。
例如:123表示一百二十三。
3. 十六进制(Hexadecimal)
基数为16,使用数字0~9和字母A~F(或a~f)。
常用于表示内存地址、颜色值等。
例如:0x7B表示十进制的123。
在C语言中,可以通过格式化字符串控制输出的进制:
- c
- int num = 255;
- printf("Decimal: %d\n", num); // 输出:255
- printf("Hex: 0x%x\n", num); // 输出:0xff
- printf("Binary: %b\n", num); // 需要自定义支持,输出:11111111
复制代码
四、数据的基本类型
C语言中的基本数据类型包括:
| 类型名 | 含义 | 典型大小(字节) |
|--------------|--------------------|------------------|
| char | 字符型 | 1 |
| short | 短整型 | 2 |
| int | 整型 | 2 或 4 |
| long | 长整型 | 4 |
| float | 单精度浮点型 | 4 |
| double | 双精度浮点型 | 8 |
| void | 空类型 | 无 |
在嵌入式开发中,由于内存和处理能力的限制,合理选择数据类型非常重要。例如,在8051系统中,int通常为16位,而long为32位。因此,使用int可以提高效率。
五、C语言常用运算符
C语言提供了丰富的运算符,主要包括以下几类:
1. 算术运算符
+:加法
-:减法
`:乘法
/:除法
%:取模(仅用于整数)
2. 关系运算符
==:等于
!=:不等于
>:大于
=:大于等于
[本文内容由国芯人工智能辅助生成,仅供参考] |