简单串口中断发送和接受程序(适合于数据量比较少的)

driver_usart.c
#include "driver_usart.h"
#include "usart.h"

#include <stdio.h>

static volatile uint8_t txcplt_flag = 0;    // 发送完成标志,1完成0未完成
static volatile uint8_t rxcplt_flag = 0;    // 接收完成标志,1完成0未完成

static volatile uint8_t rx_data = 0;

/*
 *  函数名:EnableDebugIRQ
 *  功能描述:使能USART1的中断
 *  输入参数:无
 *  输出参数:无
 *  返回值:无
*/
void EnableDebugIRQ(void)
{
    HAL_NVIC_SetPriority(USART1_IRQn, 0, 1);    // 设置USART1中断的优先级
    HAL_NVIC_EnableIRQ(USART1_IRQn);            // 使能USART1的中断
    
    __HAL_UART_ENABLE_IT(&huart1, UART_IT_TC | UART_IT_RXNE);   // 使能USRAT1的发送和接收中断
}

/*
 *  函数名:DisableDebugIRQ
 *  功能描述:失能USART1的中断
 *  输入参数:无
 *  输出参数:无
 *  返回值:无
*/
void DisableDebugIRQ(void)
{
    __HAL_UART_DISABLE_IT(&huart1, UART_IT_TC | UART_IT_RXNE);  // 失能USRAT1的发送和接收中断
    
    HAL_NVIC_DisableIRQ(USART1_IRQn);   // 失能USART1的中断
}

/*
 *  函数名:fputc
 *  功能描述:printf/putchar 标准输出函数的底层输出函数
 *  输入参数:ch --> 要输出的数据
 *  输出参数:无
 *  返回值:无
*/
int fputc(int ch, FILE *f)
{
    txcplt_flag = 0;
    HAL_UART_Transmit_IT(&huart1, (uint8_t*)&ch, 1);
    while(txcplt_flag==0);
}

/*
 *  函数名:fgetc
 *  功能描述:scanf/getchar 标准输出函数的底层输出函数
 *  输入参数:
 *  输出参数:无
 *  返回值:接收到的数据
*/
int fgetc(FILE *f)
{
    char c = 0;
    rxcplt_flag = 0;
    HAL_UART_Receive_IT(&huart1, (uint8_t*)&c, 1);
    while(rxcplt_flag==0);
    return c;
}

/*
 *  函数名:USART1_IRQHandler
 *  功能描述:USART1的中断服务函数
 *  输入参数:无
 *  输出参数:无
 *  返回值:无
*/
void USART1_IRQHandler(void)
{
    HAL_UART_IRQHandler(&huart1);   // HAL库中的UART统一中断服务函数,通过形参判断是要处理谁的中断
}

/*
 *  函数名:HAL_UART_RxCpltCallback
 *  功能描述:HAL库中的UART接收完成回调函数
 *  输入参数:huart --> UART的设备句柄,用以指明UART设备是哪一个UART
 *  输出参数:无
 *  返回值:无
*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart->Instance == USART1)   // 判断进来的是否是USART1这个UART设备
    {
        rxcplt_flag = 1;        // 进入此回调函数表明接收指定长度的数据已经完成,将标志置一
    }
}

/*
 *  函数名:HAL_UART_TxCpltCallback
*  功能描述:HAL库中的UART发送完成回调函数
 *  输入参数:huart --> UART的设备句柄,用以指明UART设备是哪一个UART
 *  输出参数:无
 *  返回值:无
*/
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart->Instance == USART1)
    {
        txcplt_flag = 1;    // 进入此回调函数表明发送指定长度的数据已经完成,将标志置一
    }
}


driver_usart.h
#ifndef __DRIVER_USART_H
#define __DRIVER_USART_H

#include "stm32f1xx_hal.h"

/*
 *  函数名:EnableDebugIRQ
 *  功能描述:使能USART1的中断
 *  输入参数:无
 *  输出参数:无
 *  返回值:无
*/
extern void EnableDebugIRQ(void);

/*
 *  函数名:DisableDebugIRQ
 *  功能描述:失能USART1的中断
 *  输入参数:无
 *  输出参数:无
 *  返回值:无
*/
extern void DisableDebugIRQ(void);

#endif /* __DRIVER_USART_H */



main.c
#include "driver_usart.h"
#include <stdio.h>



main函数中定义

char c = 0;

 EnableDebugIRQ();

while中定义

  c = getchar();
    if(c != 0)
    {
        printf("%c", c);
        c = 0;
    }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值