用中断将接收的数据按顺序存放在数组中,但用串口将数据发送到电脑中时,顺序就乱了?
volatile unsigned char SZ;volatile char int_flag=0;//int6_flag;
char keydisp;
static unsigned char read165(void)
{
unsigned char i,data1=0;
for(i=0;i<8;i++)
{
data1<<=1;
CLK_L()
NOP();
data1|=PINA&1;
CLK_H()
NOP();
}
return data1;
}
char key_handle(unsigned char u)
{
char j;
forbid_all_o();
scan_mkey(u);
secure_delayms(270,0xffff);
reset_watchdog();
if(u==0xf2)
{
u=d_getkey(0xffff);
if(u==0xf2)
{
q_set_run_mode();
return 0;
}
}
for(j=0;j<5;j++)
{
d_st(SZ);
reset_watchdog();
keydisp=ZHB&0x0f];
// reset_watchdog();
//d_st(ZHB&0x0f]);
// d_st(keydisp);
disp_string(keydisp,5,5,1);
}
reset_watchdog();
}
#pragma interrupt_handler int5_INT:7
void int5_INT(void)
{
char j;
set_PNAIN()
set_SHI_H()
SZ=read165();
if(int_flag>4)
int_flag=0;
set_SHI_L()
set_PNAOUT()
} 数据顺序混乱的原因可能是中断和主程序之间的竞争条件,或者数据访问的同步问题。 问题分析
中断和主程序的竞争条件:
中断函数int5_INT在接收数据时修改了SZ数组和int_flag,而主程序key_handle也在读取SZ数组。
如果中断在key_handle读取SZ数组的过程中触发,可能会导致数据不一致。
int_flag的越界问题:
int_flag在中断中递增,但没有保护机制,可能导致int_flag超过数组SZ的边界(SZ大小为5,int_flag可能超过4)。
数据访问的同步问题:
SZ数组和int_flag是全局变量,主程序和中断函数同时访问时,可能导致数据不一致。 在访问SZ数组和int_flag时,禁用中断,确保数据一致性。 没有加 边界保护,可能导致 数组越界访问。
建议 增加适当延时 或 硬件上拉 可以使用 int_flag 来检查数据是否已经完全接收。
页:
[1]