powerantone 发表于 2025-3-9 11:23

用中断将接收的数据按顺序存放在数组中,但用串口将数据发送到电脑中时,顺序就乱了?

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()
}

捉虫天师 发表于 2025-3-21 16:22

数据顺序混乱的原因可能是中断和主程序之间的竞争条件,或者数据访问的同步问题。

捉虫天师 发表于 2025-3-21 16:22

问题分析
中断和主程序的竞争条件:

中断函数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是全局变量,主程序和中断函数同时访问时,可能导致数据不一致。

捉虫天师 发表于 2025-3-21 16:23

在访问SZ数组和int_flag时,禁用中断,确保数据一致性。

g36xcv 发表于 2025-3-27 15:29

没有加 边界保护,可能导致 数组越界访问。

g36xcv 发表于 2025-3-27 15:29

建议 增加适当延时 或 硬件上拉

而服务器人 发表于 2025-3-31 15:54

可以使用 int_flag 来检查数据是否已经完全接收。
页: [1]
查看完整版本: 用中断将接收的数据按顺序存放在数组中,但用串口将数据发送到电脑中时,顺序就乱了?