DSP开发:串口SCI重定位或重定义printf函数实现
重定义printf
// Transmit a character from the SCI'
void UARTa_SendByte(int a)
{
while (SciaRegs.SCIFFTX.bit.TXFFST != 0);
SciaRegs.SCITXBUF=a;
}
/*
* @name fputc,fputs
* @brief 串口打印重定向
* @param None
* @retval None
*/
int fputc(int _c, register FILE *_fp)
{
UARTa_SendByte(_c);
return _c;
}
int putc(int _c, register FILE *_fp)
{
UARTa_SendByte(_c);
return _c;
}
int putchar(int data)
{
UARTa_SendByte(data);
return data;
}
int fputs(const char *_ptr, register FILE *_fp)
{
unsigned int i, len;
len = strlen(_ptr);
for(i=0 ; i<len ; i++)
{
UARTa_SendByte((char) _ptr[i]);
}
return len;
}
这段代码实现了将数据通过串口SCI发送出去的功能,并通过函数重定向将输出重定向到串口。
UARTa_SendByte 函数:
这个函数用于向SCI(串行通信接口)发送一个字符。它通过检查发送FIFO的状态位来判断是否可以发送数据,然后将字符 _c 发送到SCI的发送缓冲区(SCITXBUF)中。
串口打印重定向函数:
这部分代码实现了函数重定向,将标准库中的输出函数 fputc、putc、putchar 和 fputs 重定向到串口SCI的发送功能上。
int fputc(int _c, register FILE *_fp):
这是标准库函数 fputc 的重定向实现。它将输入的字符 _c 通过调用 UARTa_SendByte 函数发送到串口SCI,并返回 _c。
int putc(int _c, register FILE *_fp):
这是标准库函数 putc 的重定向实现,功能与 fputc 相同。
int putchar(int data):
这是标准库函数 putchar 的重定向实现。它将输入的字符 data 通过调用 UARTa_SendByte 函数发送到串口SCI,并返回 data。
int fputs(const char *_ptr, register FILE *_fp):
这是标准库函数 fputs 的重定向实现。它将输入的字符串 _ptr 通过循环调用 UARTa_SendByte 函数逐个字符发送到串口SCI,并返回字符串的长度 len。
通过这些函数的重定向,程序可以使用标准库的输出函数来向串口SCI发送数据,方便地将结果、调试信息等输出到终端设备。
自定义printf
#include <string.h>
#include <stdio.h>
#include <stdarg.h>
char SCITXDA_TX_BUF[400];
void printf_SCITXDA(char* fmt,...)
{
Uint16 i,j;
va_list ap;
va_start(ap,fmt);
vsprintf((char*)SCITXDA_TX_BUF,fmt,ap);
va_end(ap);
i=strlen((const char*)SCITXDA_TX_BUF);//此次发送数据的长度
for(j=0;j<i;j++)//循环发送数据
{
while (SciaRegs.SCIFFTX.bit.TXFFST != 0);
SciaRegs.SCITXBUF=SCITXDA_TX_BUF[j];
}
}
这段代码实现了一个自定义的 printf_SCITXDA 函数,它允许使用类似于标准库函数 printf 的格式化字符串来向串口SCI发送数据。
代码中用一个缓冲区 SCITXDA_TX_BUF 来存储格式化后的数据,然后通过循环将数据逐个字符发送到串口SCI。
以下是对代码的详细分析:
SCITXDA_TX_BUF 缓冲区:
定义了一个 char 类型的缓冲区 SCITXDA_TX_BUF,用于存储格式化后的数据。缓冲区大小为 400 字节。
printf_SCITXDA 函数:
这是自定义的输出函数。它采用了与标准库函数 printf 类似的格式,支持格式化字符串,通过变参列表处理不定数量的参数。
char* fmt, …:第一个参数 fmt 是格式化字符串,后续参数使用 … 表示不定数量的变参。
va_list ap:va_list 是C标准库中用于处理变参的类型。ap 是一个变参列表指针,用于访问传递给函数的变参。
vsprintf 函数:
这个函数是C标准库中的函数,用于将格式化的数据写入字符串缓冲区。在这里,vsprintf 将格式化的数据写入到缓冲区 SCITXDA_TX_BUF 中。
循环发送数据:
函数 printf_SCITXDA 调用 strlen 函数获取格式化后数据的长度,并使用循环逐个字符地将数据发送到串口SCI。
while (SciaRegs.SCIFFTX.bit.TXFFST != 0);:该语句用于检查发送FIFO的状态,确保发送缓冲区不满,可以进行发送。
SciaRegs.SCITXBUF=SCITXDA_TX_BUF[j];:将 SCITXDA_TX_BUF 缓冲区中的一个字符发送到串口SCI的发送缓冲区。
通过这样的实现,可以在程序中使用类似于标准库的 printf 函数的格式化字符串,将数据输出到串口SCI。这对于调试和输出结果信息非常有用。但需要注意的是,由于串口发送速率有限,如果发送数据过于频繁,可能会导致数据丢失或串口阻塞。因此,在实际使用中应该适度控制发送频率,确保数据发送的稳定性。
如果文章对您有所帮助,点赞支持👍,感谢!!!!