| /**
  * @brief  加入发送队列.
  * @param  待发送的数据
  * @retval 待发送的数据
  */
uint8_t Add_Tx1Item(uint8_t ch)
{
        //发送队列满。发送队列满
    while(Tx1_Counter == TX1_BUFFER_SIZE);       
       
    //压入数据
    Tx1_Buffer[Tx1_WriteIndex] = ch;
    //发送缓冲区写计数器移动
    Tx1_WriteIndex ++;
    if( Tx1_WriteIndex >= TX1_BUFFER_SIZE )
        {
            //写指针移动到队列头部       
                Tx1_WriteIndex = 0;                               
        }
    //数据总数增加
    Tx1_Counter++;
       
    //使能发送中断
        USART_ITConfig(USART1,USART_IT_TXE,ENABLE);
   
        return Tx1_WriteIndex;       
}
/**
  * @brief  返回发送队列中的字节数
  * @param  无
  * @retval 发送队列中的字节数
  */
uint8_t Get_Tx1BufCounter(void)
{
    return Tx1_Counter;
}
/**
  * @brief  从接收队列中取出数据.
  * @param  None
  * @retval 被取出数据
  */
uint8_t Get_Rx1Item(void)
{
        uint8_t Rx1_Data;
   
        //等待,需要修改
        while(Rx1_Counter == 0);
   
        //从队列中读取数据
        Rx1_Data = Rx1_Buffer[Rx1_ReadIndex];
    //接收缓冲区读指针移动
        Rx1_ReadIndex ++;
        if(Rx1_ReadIndex >= RX1_BUFFER_SIZE)
        {
                Rx1_ReadIndex = 0;
        }
    //
        Rx1_Counter --;
        return Rx1_Data;       
}
/**
  * @brief  返回接收队列中的字节数
  * @param  无
  * @retval 接收队列中的字节数
  */
uint8_t Get_Rx1BufCounter(void)
{
    return Rx1_Counter;
}
/**
  * @brief  清空发送队列
  * @param  无
  * @retval 无
  */
void Clear_Tx1Buf(void)
{
    for(uint8_t i = 0 ; i < TX1_BUFFER_SIZE ; i++)
    {
        Tx1_Buffer = 0;
    }
    Tx1_Counter = 0;
}
/**
  * @brief  清空接收队列
  * @param  无
  * @retval 无
  */
void Clear_Rx1Buf(void)
{
    for(uint8_t i = 0 ; i < RX1_BUFFER_SIZE ; i++)
    {
        Rx1_Buffer = 0;
    }
   
    Rx1_Counter = 0;
}
/**
  * @brief  USART1中断.
  * @param  None
  * @retval None
  */
void USART1_IRQHandler(void)
{
          uint8_t ch;
       
    //接收中断
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
          {
                //读取数据
                ch = USART_ReceiveData(USART1);               
        
        //清除接收中断标志位
        //USART_ClearFlag(USART1,USART_FLAG_RX1NE);
        //接收缓冲区数据个数递增
                Rx1_Counter++;       
        
                //数据填入接收队列
                Rx1_Buffer[Rx1_WriteIndex] = ch;
       
                Rx1_WriteIndex ++;
                if(Rx1_WriteIndex >= RX1_BUFFER_SIZE)
                {
                        Rx1_WriteIndex = 0;
                }
                //队列溢出
                if(Rx1_Counter >= RX1_BUFFER_SIZE)
                {
                        //数据作废,修改
                        //Rx1_Counter = 0;
                        //溢出标志置位
                        Rx1_BufOverflow = 1;
                }
          }
   
        //发送中断
        if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
          {
                //清除接收中断标志位
                //USART_ClearFlag(USART1,USART_FLAG_TX1E);
                //存在未发送的数据
                if(Tx1_Counter > 0)
                {
                        //发送数据
                        USART_SendData(USART1, Tx1_Buffer[Tx1_ReadIndex]);
            //发送数据总数递减
                        Tx1_Counter --;
                        Tx1_ReadIndex++;
                        //回到缓冲区开头
                        if(Tx1_ReadIndex >= TX1_BUFFER_SIZE)
                        {
                                Tx1_ReadIndex = 0;
                        }
                }
        else
        {
            //无发送数据,关闭发送中断
            USART_ITConfig(USART1,USART_IT_TXE,DISABLE);;  
        }
          }
}
int fputc(int ch, FILE * f)
{
    //通过串口发送数据  
    Add_Tx1Item((uint8_t)ch);
   
    return ch;
}
 |