尘世- 上午好☀️☀️☀️️
本答案参考ChatGPT-3.5
从你的描述中可以看出,你想要使用fputc函数实现输出重定向到不同的串口。然而,你遇到了一些问题,只能使用上半部分的代码而不能使用else部分。为了解决这个问题,你可以考虑以下几点:
-
确认串口的初始化是否正确:在你的代码中,你需要确保串口1和串口3都已经正确地初始化了,包括配置引脚、使能时钟等。
-
检查USARTx->SR寄存器的位定义是否正确:确保你使用的是正确的寄存器位定义来检查发送缓冲区是否为空。
-
检查USARTx->DR寄存器是否正确:确保你使用的是正确的寄存器来发送数据。
另外,我还提供了一个新的解决方案给你参考:
- 创建两个全局变量:
FILE *USART1_stdout; // 用于重定向标准输出到串口1
FILE *USART3_others; // 用于重定向其他文件指针到串口3
- 在main函数中分别设置这两个文件指针:
USART1_stdout = stdout;
USART3_others = fopen("USART3_others", "w"); //打开一个文件,名称自定
- 定义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");
请尝试上述方案并测试一下是否能够实现你的需求。