stm32工程问题之串口

文章讲述了在使用CubeMX配置串口后,如何解决printf函数无法发送数据的问题,包括重写fputc函数并选择MicroLIB或采用不依赖半主机模式的替代方法。
摘要由CSDN通过智能技术生成

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,当把这个打开后就可以成功发送出去数据了。

2d099a6ec9439ce2c2ba996ea5ab7e76.png

 解决方法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
  •  如果数据校验位不对导致出现问题,尝试分析数据是否实现帧同步接收,处理数据和接收数据尽量分开处理

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值