在调试北京蓝海微芯的2410开发板的时候,有如下函数,该函数通过串口可以向PC机打印
一些数据。
printf("* http://www.bluemcu.com *\n");
函数原型如下:
/***************************************************************************
Function name: printf
Parameter : *fmt : 数据显示的格式
Description : 根据提供的格式显示变量的数值
Return : void
Argument : 调用了ADS的库函数
Autor & date :
****************************************************************************/
//If you don't use vsprintf(), the code size is reduced very much.
假如你不调用vsprintf()这个函数,那么代码大小会减小很多
typedef int *__va_list[1];
int vsprintf(char * /*s*/, const char * /*format*/, __va_list /*arg*/);
void printf(char *fmt, ...)
{
va_list ap;
char string[1024];
va_start(ap,fmt);
vsprintf(string,fmt,ap);
puts(string);
va_end(ap);
}
va_start(ap,fmt);
这个函数如下:
#define va_start(ap, parmN) (void)(*(ap) = __va_start(parmN))
关于va_start,va_end这两个函数,以及printf这种c语言中的可变参数用法,在另一个
日记中进行分析。
可以理解应该是经过vsprintf(string,fmt,ap);之后,要打印的数据已经转换为字符串格式
并存储在了string数组中。
接着调用puts(string);
该函数原型
/***************************************************************************
Function name: puts
Parameter : *str : 要发送的字符串指针变量
Description : 向串口发送字符串
Return : void
Argument :
Autor & date :
****************************************************************************/
void puts(char *str)
{
SerialTxString(str);
}
调用SerialTxString(str); 函数原型:
/***************************************************************************
Function name: SerialTxString
Parameter : *s : 要发送的字符串变量
Description : 向串口发送字符串
Return : void
Argument :
Autor & date :
****************************************************************************/
void SerialTxString(char *s)
{
while(*s)
SerialTxChar(*s++);
}
继续调用SerialTxChar(*s++);函数原型:
/***************************************************************************
Function name: SerialTxChar
Parameter : data :要发送的数据
Description : 主要进行串口发送
Return : void
Argument : 通过SerialPortSel变量来选择是哪个串口发送数据
Autor & date :
****************************************************************************/
void SerialTxChar(char data)
{
if(SerialPortSel) {
if(data=='\n') {
while(!(rUTRSTAT1 & 0x4));
//Delay(1); //because the slow response of hyper_terminal
WrUTXH1('\r');
}
while(!(rUTRSTAT1 & 0x4)); //Wait until THR is empty.
// Delay(1);
WrUTXH1(data);
} else {
if(data=='\n') {
while(!(rUTRSTAT0 & 0x4));
//Delay(1); //because the slow response of hyper_terminal
WrUTXH0('\r');
}
while(!(rUTRSTAT0 & 0x4)); //Wait until THR is empty.
WrUTXH0(data);
}
}
这里面通过SerialPortSel这个变量来确定是串口0,还是串口1
程序加了判断回车字符的代码
自此printf执行完毕。
文章评论(0条评论)
登录后参与讨论