针对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; }