【STM32】串口

一、 串口中断使能问题

错误

串口只能接收一次数据,从串口助手发第二个数据时接收不到。

分析

在UART_Receive_IT(huart)函数里,回调函数的上面有如下代码:

 

 

这几行代码的作用是关闭串口接收中断,也就是说,在一次串口中断接收过程的最后,即串口接收完一组数据之后会关闭串口接收中断。

解决:

在回调函数中实现接收到数据之后的操作(比如处理数据)并再次使能串口接收中断。

 

 总结:

串口中断接收用法:

(1)指定一个缓存区(串口接收到的数据会全部堆到这个缓存区)

(2)使能串口接收中断,并把缓存区对应到串口

(3)在回调函数中实现接收到数据之后的操作(比如处理数据)并再次使能串口接收中断。

串口接收的流程:

(1)串口一个接一个的接收到数据填充到缓存区

(2)缓存区满(大小是用户定义的)程序几经辗转最后会调用到回调函数。

(3)执行用户在回调函数中实现的功能。

参考链接:

https://www.cnblogs.com/dongxiaodong/p/14275284.html

二、串口助手配置问题

错误:

从串口助手发送1个数据,经过取反后再次发送到上位机,得到了3个数据,且多的数据是F2和F5。

 

分析:

F2和F5的原数据是0A和0D,其对应的ASCII分别是换行符和回车符。这是由于我们在串口助手中勾选了“发送新行”,因此每次从上位机向单片机发送1个数据后,串口助手会自动换行,即加上\n和\r两个符号。

解决:

去勾选“发送新行”即可。

三、printf重定向

C语言中printf默认输出设备是显示器,但单片机并没有显示器,因此我们就用串口来打印数据,此时就需要将printf函数重定向一下。

printf函数底层是调用了fputc函数,而这个函数是一个弱化函数,所以我们只需要在usart.c中重写这个函数并使其作用于串口即可。这时候我们只需要包含stdio.h即可调用printf函数实现串口的发送功能。

以下两种重定向的方式均可。

int fputc(int ch,FILE *f)
{
       HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,100);
       return ch;
}

 

#include "stdio.h"

#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
    HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
    return ch;
}

 

posted @ 2021-02-04 19:46  煮茶听风雨  阅读(656)  评论(0编辑  收藏  举报