DSP开发:串口SCI重定位或重定义printf函数实现

文章介绍了如何在DSP开发中将printf等标准输出函数重定向到串口SCI,通过UARTa_SendByte函数发送数据。通过函数fputc、putc、putchar和fputs的重定向,实现向串口发送字符和字符串。另外,还提供了一个自定义的printf_SCITXDA函数,支持格式化字符串输出到串口,便于调试和信息显示。需要注意串口发送速率和数据量的平衡以保证稳定性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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。这对于调试和输出结果信息非常有用。但需要注意的是,由于串口发送速率有限,如果发送数据过于频繁,可能会导致数据丢失或串口阻塞。因此,在实际使用中应该适度控制发送频率,确保数据发送的稳定性。

如果文章对您有所帮助,点赞支持👍,感谢!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苦梨甜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值