找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1914|回复: 3
打印 上一主题 下一主题
收起左侧

STM32串口学习_02 -CPU小白

[复制链接]
跳转到指定楼层
楼主
ID:689247 发表于 2021-8-12 14:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 cpu小白白 于 2021-8-12 14:33 编辑

一.串口结构体    a.使能串口中断后,串口在接收到数据后会进入中断函数,中断函数就是我们要对数据进行整理的地方。(中断函数中不能写大量代码,有可能导致,下次中断来之前,数据还未处理完成,所以数据分析在后文)。
    b.stm32的串口数量很多,因此将每个串口在运行中所需要的变量整合写进一个结构体中,相对更加方面快捷。按照本人经常使用的数据,写出的结构体如下:

#define SBUF_SIZE 255                 //数据缓冲区大小
#define RBUF_SIZE 255

typedef struct
{
    u8 sbuf[SBUF_SIZE];                   //发送数组
    u8 rbuf[RBUF_SIZE];                   //接收数组
    u8 temporary_buf[RBUF_SIZE];  //接收临时存储buf
    u16 sbuf_head;                            //需要发送数据的位置
    u16 sbuf_tail;                            //需要发送数据的结束位置
    u16 rbuf_head;                            //需要发送数据的位置
    u16 rbuf_tail;                            //需要发送数据的结束位置
    u8 com_already;                           //接收到数据
    u32 com_timeout;                          //接收到数据到处理数据间延时
    uint32_t rc;                              //计数
}UART_InformationType;

extern UART_InformationType  UART1_Information;  //创建串口1的结构体
extern UART_InformationType  UART2_Information;
extern UART_InformationType  UART3_Information;



二.串口中断
    a.串口中断来对接受的数据进行整理,如果串口处理数据的方法相差不是太大,都可以使用此中断函数来整理接收的数据。
    b.串口数据整理的思想,以数据接受为例:
        1.开辟两个256字节的数组,用来存放接受或者发送的数据。
        2.给256个字节设数据头尾,每当进入一次中断,有一个数据传入就把数据写到结构体中,同把数据头+1,当数据头超过数据缓冲区大小时清零。
        3.有数据传入就把标志位 com_already 置1,处理完数据后清0。
        4.数据头尾的作用:刚上电时都为0,传入8个字节正确的数据,先将8个字节的数据保存在结构体中,同时每传入一个字节数据头加1。置1标志位等待数据处理函数。 数据处理函数处理完成数据后将数据尾加8等于数据头。(此时假设数据都是正确的情况)
    c.中断函数中只写了数据的接受,对于stm32来说,数据发送直接封装为函数更加简单方便。
/********************************************************************
*函数描述:usart1中断
*入口说明:无
*返回说明:无
**********************************************************************/
void USART1_IRQHandler(void)
{
    Dispose_USART_IRQHandler(USART1,&UART1_Information);
}

/*********************************************************************
*函数描述:usart1中断
*入口说明:无
*返回说明:无
**********************************************************************/
void USART2_IRQHandler(void)
{
    Dispose_USART_IRQHandler(USART2,&UART2_Information);
}

/*********************************************************************
*函数描述:usart1中断
*入口说明:无
*返回说明:无
**********************************************************************/
void USART3_IRQHandler(void)
{
    Dispose_USART_IRQHandler(USART3,&UART3_Information);
}

/*********************************************************************
*函数描述:usart中断,处理接受的数据
*入口说明:USART_TypeDef* USARTx   UART_InformationType* USARTx_Information
                        中断的串口                         对应串口的结构体
*返回说明:无
**********************************************************************/
void Dispose_USART_IRQHandler(USART_TypeDef* USARTx,UART_InformationType* USARTx_Information)
{
    if(USART_GetITStatus(USARTx, USART_IT_RXNE) != RESET)   //接收数据
    {
        USARTx_Information->rbuf[USARTx_Information->rbuf_head++] = (u8)USARTx->DR;
        if(USARTx_Information->rbuf_head == SBUF_SIZE)
        {
            USARTx_Information->rbuf_head = 0;
        }
        USARTx_Information->com_already = USART_SBUF_NO_EMPTY;
       // USARTx_Information->com_timeout = Timer_1ms;          //更新空闲计时
    }
}

/*********************************************************************
*函数描述:usart发送数据
*入口说明:USARTx:选择USART通道      
                data:发送的数据
                data_long:数据长度
*返回说明:无
**********************************************************************/
void Send_Usart_data(USART_TypeDef* USARTx,u8* data,u16 data_long)
{
    u16 a;
    for(a = 0;a < data_long;a++)
    {
           USART_SendData(USARTx,*data);                      //发送一位数据
           data++;                                                         //指向下一个发送的数据
           USART_ITConfig(USARTx, USART_IT_TC, ENABLE);
    }

}


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:584195 发表于 2021-8-14 09:21 | 只看该作者
写得非常好,楼主历害呀!
回复

使用道具 举报

板凳
ID:689247 发表于 2021-8-17 08:33 | 只看该作者
还有最后一个章节,这几天有空总结完会把所有代码整合到一起。
回复

使用道具 举报

地板
ID:584195 发表于 2021-8-19 15:57 | 只看该作者
能不能把DMA也写得通俗易懂一些的文章!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表