21ic电子技术开发论坛 单片机与嵌入式系统 ST MCU 我封装了一个相对好用的串口库(提供源码)
发新帖我要提问
12
返回列表
打印

我封装了一个相对好用的串口库(提供源码)

[复制链接]
楼主: re张风
手机看帖
扫描二维码
随时随地手机跟帖
21
afei9527| | 2011-9-1 23:11 | 只看该作者 回帖奖励 |倒序浏览
看了一遍,要是接收数据溢出会怎么样?求指教!

使用特权

评论回复
22
re张风|  楼主 | 2011-9-2 15:22 | 只看该作者
可以再完善一下,做成环形BUFF的形式,就不会溢出了!

使用特权

评论回复
23
xixihaha0| | 2011-9-3 09:00 | 只看该作者
改天我有空写一个发上来哈,fifo形式的,

使用特权

评论回复
24
MakeBetter| | 2011-9-4 21:12 | 只看该作者
看了,一般,我曾也封装过一个,但我采用我写的循环FIFO封装,且发送和接收都采用FIFO,用户发送数据只需要往FIFO写入即可,在波特率较低且发送数据较小时,效率特别明显。上传给大家看看,FIFO就自己去写吧。
/*******************************************************************************
** 文件名:  userlib_usart.c
** 包含文件:userlib_fifoloop.h,userlib_usart.h,stm32f10x_lib.h
** 功能描述:STM32串口库封装
** 作者:    Hanzic/孙昭德
** 创建日期:2009-11-3
** 修改者:
** 修改日期:
** 版权:    利尔达科技有限公司 www.lierda.com
*******************************************************************************/
#include "userlib_fifoloop.h"
#include "userlib_usart.h"
#include "stm32f10x_lib.h"
/******************************************************************************/
/******************************************************************************/
/************************* 以下是全局变量定义 *********************************/
/******************************************************************************/
#if USE_USART1
static FIFOSocket Usart1TSK;               //使用发送缓存,使用FIFO模块,分配套接字
static FIFOSocket Usart1RSK;               //使用接收缓存,使用FIFO模块,分配套接字
static unsigned char Usart1TBuff[USARTBuffSize];   //发送缓存
static unsigned char Usart1RBuff[USARTBuffSize];   //接收缓存
#endif
#if USE_USART2
static FIFOSocket Usart2TSK;               //使用发送缓存,使用FIFO模块,分配套接字
static FIFOSocket Usart2RSK;               //使用接收缓存,使用FIFO模块,分配套接字
static unsigned char Usart2TBuff[USARTBuffSize];   //发送缓存
static unsigned char Usart2RBuff[USARTBuffSize];   //接收缓存
#endif
#if USE_USART3
static FIFOSocket Usart3TSK;               //使用发送缓存,使用FIFO模块,分配套接字
static FIFOSocket Usart3RSK;               //使用接收缓存,使用FIFO模块,分配套接字
static unsigned char Usart3TBuff[USARTBuffSize];   //发送缓存
static unsigned char Usart3RBuff[USARTBuffSize];   //接收缓存
#endif
/*******************************************************************************
** 函数名:  UsartInit
** 功能  :  串口初始化
** 输入参数:unsigned long pBaudRate 波特率设置
** 输出参数:无
** 作者:    Hanzic
** 创建日期:2009-11-3
** 修改者:
** 修改日期:
*******************************************************************************/
void UsartInit(unsigned long pBaudRate)
{
    USART_InitTypeDef USART_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
   
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 | RCC_APB1Periph_USART3, ENABLE);
    /* Configure USART Tx as alternate function push-pull */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_9;      //Usart1,Usart2 Tx
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                  //Usart3 Tx
    GPIO_Init(GPIOB, &GPIO_InitStructure);         
   
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_1;     //Usart1,Usart2 Rx
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;                  //Usart3 Rx
    GPIO_Init(GPIOB, &GPIO_InitStructure);
   
    USART_InitStructure.USART_BaudRate = pBaudRate;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
   
    USART_Init(USART1, &USART_InitStructure);
    USART_Init(USART2, &USART_InitStructure);
   
    //USART_InitStructure.USART_BaudRate = 9600;
    USART_Init(USART3, &USART_InitStructure);
   
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);      //使能接收中断
    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
    //USART_ITConfig(USARTy, USART_IT_TXE, ENABLE);
   
    /* Enable USARTz Receive and Transmit interrupts */
    //USART_ITConfig(USARTz, USART_IT_RXNE, ENABLE);
    //USART_ITConfig(USARTz, USART_IT_TXE, ENABLE);
    FIFOInit(&Usart1TSK,Usart1TBuff,USARTBuffSize);  //初始化发送FIFO
    FIFOInit(&Usart1RSK,Usart1RBuff,USARTBuffSize);  //初始化接收FIFO
    FIFOInit(&Usart2TSK,Usart2TBuff,USARTBuffSize);  //初始化发送FIFO
    FIFOInit(&Usart2RSK,Usart2RBuff,USARTBuffSize);  //初始化接收FIFO
    FIFOInit(&Usart3TSK,Usart3TBuff,USARTBuffSize);  //初始化发送FIFO
    FIFOInit(&Usart3RSK,Usart3RBuff,USARTBuffSize);  //初始化接收FIFO
   
    /* Enable USART */
    USART_Cmd(USART1, ENABLE);
    USART_Cmd(USART2, ENABLE);
    USART_Cmd(USART3, ENABLE);
   
  /*  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;          //USART1 TX
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;     //复用推挽输出
    GPIO_Init(GPIOA, &GPIO_InitStructure);          //A端口
   
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;             //USART1 RX
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   //复用开漏输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);              //A端口 */
}
/*******************************************************************************
** 函数名:  UsartRecByte
** 功能  :  串口接收一个字符
** 输入参数:USART_TypeDef * USARTx  串口号
**          unsigned char * ch  需接收字符的指针
** 输出参数:unsigned char 成功接收字符返回1 否则返回0
** 作者:    Hanzic
** 创建日期:2009-11-3
** 修改者:
** 修改日期:
*******************************************************************************/
unsigned char UsartRecByte(USART_TypeDef * USARTx,unsigned char * ch)
{
    if(USARTx == USART1)
    {
        return FIFOByteRead(&Usart1RSK,ch);
    }
    if(USARTx == USART2)
    {
        return FIFOByteRead(&Usart2RSK,ch);
    }
    if(USARTx == USART3)
    {
        return FIFOByteRead(&Usart3RSK,ch);
    }
    return 0;
}
/*******************************************************************************
** 函数名:  UsartSendByte
** 功能  :  串口发送一个字符
** 输入参数:USART_TypeDef * USARTx  串口号
**          unsigned char ch 需发送的字符
** 输出参数:unsigned char 成功发送字符返回1 否则返回0
** 作者:    Hanzic
** 创建日期:2009-11-3
** 修改者:
** 修改日期:
*******************************************************************************/
unsigned char UsartSendByte(USART_TypeDef * USARTx,unsigned char ch)
{
    if(USARTx == USART1)
    {
        if(FIFOByteWrite(&Usart1TSK,ch))
        {
            USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
            return 1;
        }
    }
    if(USARTx == USART2)
    {
        if(FIFOByteWrite(&Usart2TSK,ch))
        {
            USART_ITConfig(USART2, USART_IT_TXE, ENABLE);
            return 1;
        }
    }
    if(USARTx == USART3)
    {
        if(FIFOByteWrite(&Usart3TSK,ch))
        {
            USART_ITConfig(USART3, USART_IT_TXE, ENABLE);
            return 1;
        }
    }
    return 0;
}
/*******************************************************************************
** 函数名:  UsartRecStr
** 功能  :  接收字符串
** 输入参数:USART_TypeDef * USARTx  串口号
**          unsigned char * ch 用于接收字符串的指针
**          long len 接收缓存的长度---也表示想接收的长度
** 输出参数: unsigned long 返回接收到的长度 --- 不会超过参数len
** 作者:    Hanzic
** 创建日期:2009-11-3
** 修改者:
** 修改日期:
*******************************************************************************/
unsigned long UsartRecStr(USART_TypeDef * USARTx,unsigned char * ch,long len)
{
    if(USARTx == USART1)
    {
        return FIFOStrRead(&Usart1RSK,ch,len);
    }
    if(USARTx == USART2)
    {
        return FIFOStrRead(&Usart2RSK,ch,len);
    }
    if(USARTx == USART3)
    {
        return FIFOStrRead(&Usart3RSK,ch,len);
    }
    return 0;
}
/*******************************************************************************
** 函数名:  UsartSendStr
** 功能  :  发送字符串
** 输入参数:USART_TypeDef * USARTx  串口号
**          unsigned char * ch 用于发送字符串的缓存指针
**          long len 需要发送的长度
** 输出参数:unsigned long 返回成功发送的长度 --当FIFO满后,剩下的字符将不能发送。
** 作者:    Hanzic
** 创建日期:2009-11-3
** 修改者:
** 修改日期:
*******************************************************************************/
unsigned long UsartSendStr(USART_TypeDef * USARTx,unsigned char * ch,long len)
{
    unsigned long i;
    if(USARTx == USART1)
    {
        i = FIFOStrWrite(&Usart1TSK,ch,len);
        if(i)
        {
            USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
            return i;
        }
    }
    if(USARTx == USART2)
    {
        i = FIFOStrWrite(&Usart2TSK,ch,len);
        if(i)
        {
            USART_ITConfig(USART2, USART_IT_TXE, ENABLE);
            return i;
        }
    }
    if(USARTx == USART3)
    {
        i = FIFOStrWrite(&Usart3TSK,ch,len);
        if(i)
        {
            USART_ITConfig(USART3, USART_IT_TXE, ENABLE);
            return i;
        }
    }
    return 0;
}
/*******************************************************************************
** 函数名:  Usart1IntSer
** 功能  :  串口中断服务函数
** 输入参数:无
** 输出参数:无
** 作者:    Hanzic
** 创建日期:2009-11-3
** 修改者:
** 修改日期:
*******************************************************************************/
void Usart1IntSer(void)
{
    unsigned char ch;
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    {
        FIFOByteWrite(&Usart1RSK,USART_ReceiveData(USART1));        //接收一个字节
    }
    if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
    {   
        if(FIFOByteRead(&Usart1TSK,&ch))
        {
            USART_SendData(USART1,ch);
        }
        if(GotFIFODeep(&Usart1TSK)==0)
        {
            USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
        }   
    }
}
/*******************************************************************************
** 功能  :  串口中断服务函数
** 输入参数:无
** 输出参数:无
** 作者:    Hanzic
** 创建日期:2009-11-3
** 修改者:  Hanzic
** 修改日期:2011-8-4 没有修改,查出:当外部总中断关断时,若有数据接收,则再总中断再次开启时,
**          会不停进入此中断,且中断不知为何中断,无法解决访问题。
*******************************************************************************/
void Usart2IntSer(void)
{
    unsigned char ch;
   
    //USART_ClearITPendingBit(USART1, USART_IT_ERR);     //清除标志位
    if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
    {
       // USART_ClearITPendingBit(USART1, USART_IT_RXNE);
        FIFOByteWrite(&Usart2RSK,USART_ReceiveData(USART2));        //接收一个字节
    }
    if(USART_GetITStatus(USART2, USART_IT_TXE) != RESET)
    {   
        //USART_ClearITPendingBit(USART1, USART_IT_TXE);     //清除标志位
        if(FIFOByteRead(&Usart2TSK,&ch))
        {
            USART_SendData(USART2,ch);
        }
        if(GotFIFODeep(&Usart2TSK)==0)
        {
            USART_ITConfig(USART2, USART_IT_TXE, DISABLE);
        }   
    }
}
/*******************************************************************************
** 功能  :  串口中断服务函数
** 输入参数:无
** 输出参数:无
** 作者:    Hanzic
** 创建日期:2009-11-3
** 修改者:
** 修改日期:
*******************************************************************************/
void Usart3IntSer(void)
{
    unsigned char ch;
    if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
    {
        FIFOByteWrite(&Usart3RSK,USART_ReceiveData(USART3));        //接收一个字节
    }
    if(USART_GetITStatus(USART3, USART_IT_TXE) != RESET)
    {   
        if(FIFOByteRead(&Usart3TSK,&ch))
        {
            USART_SendData(USART3,ch);
        }
        if(GotFIFODeep(&Usart3TSK)==0)
        {
            USART_ITConfig(USART3, USART_IT_TXE, DISABLE);
        }   
    }
}
/*******************************************************************************
** 文件结束
*******************************************************************************/

userlib_usart.rar

2.75 KB

使用特权

评论回复
25
火箭球迷| | 2011-9-5 23:04 | 只看该作者
收藏了,试试看

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部