尘世- 2024-03-28 00:51 采纳率: 80%
浏览 7
已结题

STM32F103C8T6标准库函数fputc调用多次问题明显

用串口1和串口3调用两次fputc函数,明显无法使用。后续将其设置为判断语句进行使用程序如下:


int fputc(int ch, FILE *f)
{      
  if (f == stdout) // 标准输出重定向到 USART3
    {
        while ((USART1->SR & USART_SR_TXE) == 0); // 等待发送缓冲区为空
        USART1->DR = (uint8_t)ch;
    }
    else // 其他文件指针重定向到 USART1
    {
        while((USART3->SR & USART_FLAG_TXE) == RESET); // 等待发送缓冲区为空
        USART3->DR = (uint8_t)ch;      
    }
}
```但是发现只能使用上半部分,else部分无法使用
状态

        请帮我设置一个合理的判断语句或者提供新的解决方案!!谢谢
  • 写回答

4条回答 默认 最新

  • 关注

    尘世- 上午好☀️☀️☀️️
    本答案参考ChatGPT-3.5

    从你的描述中可以看出,你想要使用fputc函数实现输出重定向到不同的串口。然而,你遇到了一些问题,只能使用上半部分的代码而不能使用else部分。为了解决这个问题,你可以考虑以下几点:

    1. 确认串口的初始化是否正确:在你的代码中,你需要确保串口1和串口3都已经正确地初始化了,包括配置引脚、使能时钟等。

    2. 检查USARTx->SR寄存器的位定义是否正确:确保你使用的是正确的寄存器位定义来检查发送缓冲区是否为空。

    3. 检查USARTx->DR寄存器是否正确:确保你使用的是正确的寄存器来发送数据。

    另外,我还提供了一个新的解决方案给你参考:

    1. 创建两个全局变量:
    FILE *USART1_stdout;    // 用于重定向标准输出到串口1
    FILE *USART3_others;    // 用于重定向其他文件指针到串口3
    
    1. 在main函数中分别设置这两个文件指针:
    USART1_stdout = stdout;
    USART3_others = fopen("USART3_others", "w");    //打开一个文件,名称自定
    
    1. 定义fputc函数:
    int fputc(int ch, FILE *f)
    {
        if (f == USART1_stdout)    // 判断是否是标准输出
        {
            while ((USART1->SR & USART_SR_TXE) == 0);    // 等待发送缓冲区为空
            USART1->DR = (uint8_t)ch;
        }
        else if (f == USART3_others)    // 判断是否是其他文件指针
        {
            while((USART3->SR & USART_SR_TXE) == 0);    // 等待发送缓冲区为空
            USART3->DR = (uint8_t)ch;      
        }
        
        return ch;
    }
    

    这样,你就可以在程序中使用fprintf来指定输出到相应的串口了:

    fprintf(USART1_stdout, "This is output to USART1.\r\n");
    fprintf(USART3_others, "This is output to USART3.\r\n");
    

    请尝试上述方案并测试一下是否能够实现你的需求。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 4月6日
  • 已采纳回答 3月29日
  • 创建了问题 3月28日

悬赏问题

  • ¥15 郑州牧原测试岗值得去吗
  • ¥100 复现论文:matlab仿真代码编写
  • ¥15 esp32驱动GC9A01循环播放视频
  • ¥15 惠普360g9的最新bios
  • ¥30 这个功能用什么软件发合适?
  • ¥60 微信小程序,取消订单,偶尔订单没有改变状态
  • ¥15 用pytorch实现PPO算法
  • ¥15 关于调制信号的星座图?
  • ¥30 前端传参时,后端接收不到参数
  • ¥15 这是有什么问题吗,我检查许可证了但是显示有呢