《C语言编程》关于HAL库的printf的重定向

因为需要知道板子是否有宕机情况,并且有时候需要打印一些调试信息,用printf就十分方便了。

但是我发现,这种很基础很基础的问题,每次调都要费一费劲,真让人恼火!

我记下来,下次再不一次成功就直播吃篮球!

找一个文件加入下面的代码

int fputc(int ch,FILE *f)

{
    uint32_t temp = ch;

    HAL_UART_Transmit(&huart3,(uint8_t *)&temp,1,1000);        //huart3是串口的句柄
    HAL_Delay(2);

    return ch;
}

然后在调用printf的文件中包含头文件 #include <stdio.h>

上面是我按照百度的操作步骤,可是我那个串口怎么都出不来字符串。这么简单的操作,怎么就出不来,我还一直找线的问题。不过确实串口不行要找线接没接对,不过我这线路一直都能用啊。

好几次无果,然后我才想起来我用的串口是485,要控制控制管脚啊喂!

int fputc(int ch,FILE *f)

{
    uint32_t temp = ch;

    HAL_GPIO_WritePin( GPIOA, GPIO_PIN_11, GPIO_PIN_SET );
    HAL_UART_Transmit(&huart3,(uint8_t *)&temp,1,1000);        //huart3串口的句柄
    HAL_GPIO_WritePin( GPIOA, GPIO_PIN_11, GPIO_PIN_RESET );
    HAL_Delay(2);

    return ch;
}

我也是佛了

但在调试中发现若发送数量大,上面的方式容易通讯失败

int fputc(int ch,FILE *f)

{
    uint32_t temp = ch;

    HAL_GPIO_WritePin(RE485_GPIO_Port,RE485_Pin,GPIO_PIN_SET);
    HAL_UART_Transmit(&huart2,(uint8_t *)&temp,1,1000);        
	while(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_TC)!=SET);		//等待发送结束
    HAL_GPIO_WritePin(RE485_GPIO_Port,RE485_Pin,GPIO_PIN_RESET);
//    HAL_Delay(2);

    return ch;
}

增加等待发送结束,并且去掉delay能够解决。

此外,发送函数不要用DMA,DMA只能发送一个字节,不知道是什么原因。

这样的方式是可以的。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值