作为嵌入式单片机领域小白的我,在查阅STM32、MSP432等串口通信的开发例程时,
总是能看到用 printf()这个函数来进行串口的发送功能。
目录
有关printf()函数需要解决的疑问:
一、printf()函数工作原理:
C语言中为何能调用printf()函数打印数据到控制台中?
我们该如何找到这个函数呢?
此处贴出fgetc()函数 以及 fputc()函数的定义:
UART_transmitData(,);函数的定义与作用:
有关printf()函数需要解决的疑问:
1.printf()这个函数 是怎么向上位机打印字符串的?
2.printf()这个函数 该如何设置用 哪个串口向上位机打印字符的?
3.printf()这个函数 它与普通的串口发送函数有哪些区别?
USART_SendData是一个一个发送,printf本质也是一样
4.我该怎么对 printf()这个函数 进行自己的更改?
5.为何 printf()这个函数 能格式化输出 数据?
1,printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息。
2,printf()函数的调用格式为: printf("<格式化字符串>", <参量表>)。
3,格式输出,它是c语言中产生格式化输出的函数(在 stdio.h 中定义)。用于向终端(显示器、控制台等)输出字符。格式控制由要输出的文字和数据格式说明组成。要输出的的文字除了可以使用字母、数字、空格和一些数字符号以外,还可以使用一些转义字符表示特殊的含义。
4,作用:在c语言中产生格式化输出的函数(定义在 stdio.h 中),其向终端(显示器、控制台等)输出字符。
其中有关Printf()设置方面的问题,我将在下文研究分析:
网络上有很多关于STM32的printf()这个函数的资料,因此此处归纳一下MSP432的:
一、printf()函数工作原理:
C语言中为何能调用printf()函数打印数据到控制台中?
是因为其调用了fputc()函数
我们该如何找到这个函数呢?
最快的就是找个地方打出fputc,然后鼠标右键找到定义即可,此处发现该函数定义在了
usart.h文件中。
此处贴出fgetc()函数 以及 fputc()函数的定义:
fgetc()函数应该是 对应被 scanf()函数 调用.
fputc()函数应该是 对应被 printf()函数 调用.
int fgetc(FILE *f)
{
while (EUSCI_A_UART_RECEIVE_INTERRUPT_FLAG !=
UART_getInterruptStatus(EUSCI_A0_BASE, EUSCI_A_UART_RECEIVE_INTERRUPT_FLAG))
;
return UART_receiveData(EUSCI_A0_BASE);
}
#endif
int fputc(int ch, FILE *f)
{
UART_transmitData(EUSCI_A0_BASE, ch & 0xFF);
return ch;
}
/***************** 函数说明 *****************
*
* 以上两条对接标准输入输出库的函数:
* int fputc(int ch, FILE *f);
* int fgetc(FILE *f);
* 源码为BiliBili平台UP主 “CloudBoyStudio” 编写
* 本人RNA,不是作者
* 在此也表感谢
我们发现,fputc()函数它有俩个参数传入,int fputc(int ch, FILE *f)
这俩个参数在fputc()函数的本体中,是被用在 UART_transmitData(,);函数里了:
int fputc(int ch, FILE *f)
{
UART_transmitData(EUSCI_A0_BASE, ch & 0xFF);
return ch;
}
UART_transmitData(,);函数的定义与作用:
void UART_transmitData(uint32_t moduleInstance,uint_fast8_t transmitData);
//将数据放入传输数据寄存器,以开始传输,transmitData为待传输的数据
//UCAxTXBUF寄存器
发现他需要传入俩个参数:
uint32_t moduleInstance 和 uint_fast8_t transmitData
uint32_t moduleInstance从以下的定义说明可以看出,他指的是需要选择的串口:
//! \param moduleInstance is the instance of the eUSCI A (UART) module.
//! Valid parameters vary from part to part, but can include:
//! - \b EUSCI_A0_BASE eUSCI A0基地址
//! - \b EUSCI_A1_BASE eUSCI A1基地址
//! - \b EUSCI_A2_BASE eUSCI A2基地址
//! - \b EUSCI_A3_BASE eUSCI A3基地址
uint_fast8_t transmitData 是一个指向某个结构体的指针:
他指向的是 stdio.h 中的 FILE结构体.也许这就是 fputc()函数与printf()函数 联系起来的地方:
经过以上的介绍,我们就能对printf()函数进行自定义操作了。
原理就是对fputc();函数做一些相应的串口寄存器的选择方面的更改就行了。