串口缓冲区死循环

2019-07-21 05:06发布

[mw_shl_code=c,true]#include "MAX232.h"

uchar USART2_TxBuffer[30];
uchar USART2_TxHeadIndex=0;
uchar USART2_TxTailIndex=0;
uchar USART2_TxBusy=0;
uchar USART2_Reserve=0;


void MAX232_USART2_Init()
{
        GPIO_InitTypeDef GPIO_InitUSART2;
        NVIC_InitTypeDef NVIC_InitUSART2;
        USART_InitTypeDef USART_InitUSART2;
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
       
        USART_DeInit(USART2);
       
        GPIO_InitUSART2.GPIO_Mode=GPIO_Mode_AF_PP;
        GPIO_InitUSART2.GPIO_Pin=GPIO_Pin_2;
        GPIO_InitUSART2.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitUSART2);
       
        GPIO_InitUSART2.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        GPIO_InitUSART2.GPIO_Pin=GPIO_Pin_3;
        GPIO_Init(GPIOA,&GPIO_InitUSART2);
       
        USART_InitUSART2.USART_BaudRate=9600;
        USART_InitUSART2.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
        USART_InitUSART2.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
        USART_InitUSART2.USART_Parity=USART_Parity_No;
        USART_InitUSART2.USART_StopBits=USART_StopBits_1;
        USART_InitUSART2.USART_WordLength=USART_WordLength_8b;
       
        NVIC_InitUSART2.NVIC_IRQChannel=USART2_IRQn;
        NVIC_InitUSART2.NVIC_IRQChannelCmd=ENABLE;
        NVIC_InitUSART2.NVIC_IRQChannelPreemptionPriority=2;
        NVIC_InitUSART2.NVIC_IRQChannelSubPriority=0;
        NVIC_Init(&NVIC_InitUSART2);
       
        USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
        USART_ITConfig(USART2,USART_IT_TC,ENABLE);
       
        USART_Init(USART2,&USART_InitUSART2);
        USART_Cmd(USART2,ENABLE);
       
        USART_GetFlagStatus(USART2, USART_FLAG_TC);
}

void USART2_SendByte(uchar Byte)
{
        while(USART2_Reserve>29);                //当缓冲区放满时程序就会在这里死循环
       
        if(USART2_TxBusy==0 && (USART2_TxHeadIndex==USART2_TxTailIndex))
        {
                USART_SendData(USART2,Byte);
                USART2_TxBusy=1;
        }
        else
        {
                USART2_TxBuffer[USART2_TxTailIndex]=Byte;
                USART2_Reserve++;
                if(++USART2_TxTailIndex>=30)
                        USART2_TxTailIndex=0;
        }
}

void USART2_IRQHandler()
{
        if(USART_GetFlagStatus(USART2,USART_FLAG_RXNE))
        {
                USART_ClearFlag(USART2,USART_FLAG_RXNE);
                printf("MAX232Õy3£ÔËDD ");
        }
       
        if(USART_GetFlagStatus(USART2,USART_FLAG_TC))
        {
                USART_ClearFlag(USART2,USART_FLAG_TC);
                if(USART2_Reserve!=0)
                {
                        USART2_TxBusy=1;
                        USART_SendData(USART2,USART2_TxBuffer[USART2_TxHeadIndex]);
                        USART2_Reserve--;
                        if(++USART2_TxHeadIndex>=30)
                                USART2_TxHeadIndex=0;
                }
                USART2_TxBusy=0;
        }
}
[/mw_shl_code]

随手写的程序已贴出,大伙们帮小弟看看……
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。