文章目录
一、cubeMX配置过程
本次选用的是引脚9和10进行串口的通讯因此使用的为uart1,配置如上图所示。
并且将自己的uart中断进行使能,对enable打勾。
二、代码改进
重定义printf函数
需要在usart.c文件中添以下的代码进行对stdio.h进行重定向。
首先在头部添加
#include "stdio.h"
extern UART_HandleTypeDef huart1; //声明串口
接着添加重定向代码
/**
* 函数功能: 重定向c库函数printf到DEBUG_USARTx
* 输入参数: 无
* 返 回 值: 无
* 说 明:无
*/
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
/**
* 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx
* 输入参数: 无
* 返 回 值: 无
* 说 明:无
*/
int fgetc(FILE *f)
{
uint8_t ch = 0;
HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
return ch;
}
1.功能函数使用方法
1、HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
阻塞发送
本次的使用过程中使用的是串口1
并且定义了一个要发送的数据的数组为 uint8_t str[]="Hello World";
在第1个参数中传入我们使用的串口的地址:&huart1
在第2个参数中传入我们要发送数据的首地址:str
在第3个参数中传入我们使用的数据的大小,通过sizeof计算:sizeof(str)
在第4个参数中传入我们设置的超时时间单位是ms,超过设置的时间,则函数返回HAL_TIMEOUT,如果设置为HAL_MAX_DELAY:这里设置为100
代码如下(示例):HAL_UART_Transmit(&huart1,str,sizeof(str),100);
之后在main函数当中的while()循环中添加此函数便能重复的对我们的数据进行在串口中的打印效果。
2、HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)阻塞接收
本次的使用过程中使用的是串口1
并且定义了一个接收数据的数据 uint8_t rxd[5];
在第1个参数中传入我们使用的串口的地址:&huart1
在第2个参数中传入我们要接收数据的首地址:rxd
在第3个参数中传入我们使用的数据的大小,通过sizeof计算:sizeof(rxd)
在第4个参数中传入我们设置的超时时间单位是ms,超过设置的时间,则函数返回HAL_TIMEOUT,如果设置为HAL_MAX_DELAY:这里设置为1000
代码如下(示例):HAL_UART_Receive(&huart1,rxd,sizeof(rxd),1000)
之后在while()函数中添加使用的函数,当接收到了数据以后,将接受到的数据直接发送出去。
注意:1、最好发送几个数据就把相应的位数设置成几
2、在发送数据的时候结尾一定要加回车
中断接收数据
1、首先要在main函数中进行定义
#define RXBUFFERSIZE 256 //最大接收的字节数
char RxBuffer[RXBUFFERSIZE];//接收数据
uint8_t aRxBuffer; //接收中断缓冲
uint8_t Uart1_cet=0;//接收缓冲区计数
2、之后在主函数中添加中断接收函数
HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer,1);//调用中断接收函数
3、之后添加一个相应的中断回调函数便完成了对与接收中断函数的编写
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
UNUSED(huart);
if(Uart1_cet>=255)//对Uart_cetde的位数进行判断是否字符串数据溢出
{
Uart1_cet=0;
memset(RxBuffer,0x00,sizeof(RxBuffer));
HAL_UART_Transmit(&huart1, (uint8_t *)"数据溢出", 10,0xFFFF);
}
else
{
RxBuffer[Uart1_cet++] = aRxBuffer; //接收数据转存
if((RxBuffer[Uart1_cet-1] == 0x0A)&&(RxBuffer[Uart1_cet-2] == 0x0D)) //判断结束位
{
HAL_UART_Transmit(&huart1, (uint8_t *)&RxBuffer, Uart1_cet,0xFFFF); //将收到的信息发送出去
while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束
Uart1_cet = 0;
memset(RxBuffer,0x00,sizeof(RxBuffer)); //清空数组
}
}
HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1); //再开启接收中断(因为里面中断只会触发一次,因此需要再次开启)
}
最终现象:当接收到数据时将触发相应的中断进行对数据的传输。