1、stm32串口发送函数printf发送不了数据
记录一下自己用cubeMX配置完串口之后用printf函数发送不了数据的解决办法
正常来说用CubeMX配置好生成的代码只需要加入以下几句话即可成功发送:
1、重写fputc函数
int fputc(int c, FILE *stream) //重写fputc函数
{
/*
huart1是工具生成代码定义的UART1结构体,
如果以后要使用其他串口打印,只需要把这个结构体改成其他UART结构体。
*/
HAL_UART_Transmit(&huart1, (unsigned char *)&c, 1, 1000);
return 1;
}
2、包含头文件
#include <stdio.h>
3、 如果需要接收的话加上一个
HAL_UART_Receive_IT(&huart1, uart1_rxbuf, 10);
4、注意事项
但是这个时候你会发现用printf发送数据发送不出去,这是因为还有一个配置没选上,当我们重写fputc函数用的是上面这串代码时,就必须要勾选下图中的MicroLIB,当把这个打开后就可以成功发送出去数据了。
解决方法2:还有一直方案就是不需要勾选这个MicroLIB,利用下面这个代码实现:
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
int handle;
};
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{
x = x;
}
void _ttywrch(int ch)
{
ch = ch;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&DEBUG_UART, (uint8_t *)&ch, 1, 0x200); //根据使用的库重定向
return ch;
}
以上就是自己遇到这个问题的解决办法。
2、串口发送乱码
主要可能原因:
- 波特率有没有对上
- 有没有共地
- 数据位、停止位、奇偶校验位有没有变化
- printf重定向函数或者IDE有没有勾选那个lib
- 如果数据校验位不对导致出现问题,尝试分析数据是否实现帧同步接收,处理数据和接收数据尽量分开处理