针对static变量的处理!!!

实验内容:PC向单片机发送波特率和占空比相关信息,单片机接收到数据后,显示接收到的频率和占空比并改变波形。

 

问题:PC向单片机发送数据,第一次接收正常,后面就无法正常接收了。

 

这是串口中断处理函数部分代码:

问题出在NOTICE那里:

1、因为crc是static变量,所以只初始化一次,在数据接收完成之后并没有做相应的处理。

2、再次接收数据时,crc在原先值的基础上继续累加,所以第二次发送数据开始,case 5再也进不去了!!

 

总结:变量一定要有始有终,特别是static变量!!!

extern UINT16 g_u16_freq;
extern UINT8 g_u8_duty;

UINT8 g_crc_sum_val = 0;
UINT8 g_error_code_val = 0;
BOOL b_uart_rec_flag = 0;


// arry to print rec data.
UINT16 g_u16_rec_data[6] = {1};
UINT8 rec_data_num = 0;

VOID uart_isr(VOID) interrupt 4
{
    UINT8 u8_data = 0;
    
    static char state = 0;
    static char crc   = 0;
    
    static unsigned char u8_duty = 0;
    static unsigned int u16_freq = 0;
    
    if (RI)
    {    
        switch (state)
        {
            case 0:
                g_u16_rec_data[0] = SBUF;
                if (SBUF == 0xFA) state =1;
                break;
            case 1:
                g_u16_rec_data[1] = SBUF;
                crc += SBUF;
                u8_duty = SBUF;
                state = 2;
                break;
            case 2:
                g_u16_rec_data[2] = SBUF;
                crc += SBUF;
                u16_freq = (unsigned int) (SBUF << 8);
                state = 3;
                break;
            case 3:
                g_u16_rec_data[3] = SBUF;
                crc += SBUF;
                u16_freq |= (unsigned int) SBUF;
                state = 4;
                break;
            case 4:
                g_u16_rec_data[4] = SBUF;
                if (SBUF == crc)
                {
                    g_error_code_val = 0;
                    g_crc_sum_val = crc;
                    
                    state = 5;
                }
                else
                {
                    state = 0;
                    
                    g_error_code_val = 0x01;
                    g_crc_sum_val = crc;
                    
//                    b_uart_rec_flag = 1;
                }
//NOTICE        crc = 0;
                break;
            case 5:
                g_u16_rec_data[5] = SBUF;
                if (SBUF == 0xFE)
                {
                    b_uart_rec_flag = 1;
                    g_u16_freq = u16_freq;
                    g_u8_duty = u8_duty;
                }
                state = 0;
                break;
        }
    }
    RI = 0;
}

 

posted @ 2016-08-25 16:39  长悟  阅读(1103)  评论(0编辑  收藏  举报