因为需要知道板子是否有宕机情况,并且有时候需要打印一些调试信息,用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只能发送一个字节,不知道是什么原因。
这样的方式是可以的。