打印
[其他产品]

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

[复制链接]
1675|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
powerantone|  楼主 | 2025-3-9 11:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
volatile unsigned char SZ[5];
volatile char int_flag=0;//int6_flag;
char keydisp[5];

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[j]);
                  reset_watchdog();
              keydisp[j]=ZHB[SZ[j]&0x0f];
                 // reset_watchdog();
                  //d_st(ZHB[SZ[j]&0x0f]);
                 // d_st(keydisp[j]);
                 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[int_flag++]=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时,禁用中断,确保数据一致性。

使用特权

评论回复
5
g36xcv| | 2025-3-27 15:29 | 只看该作者
没有加 边界保护,可能导致 数组越界访问。

使用特权

评论回复
6
g36xcv| | 2025-3-27 15:29 | 只看该作者
建议 增加适当延时 或 硬件上拉

使用特权

评论回复
7
而服务器人| | 2025-3-31 15:54 | 只看该作者
可以使用 int_flag 来检查数据是否已经完全接收。

使用特权

评论回复
8
suiziq| | 2025-4-16 19:33 | 只看该作者
当使用中断接收串口数据并存储到数组中,但在通过串口发送数据到电脑时顺序出现混乱,可能的原因是中断处理时间过长

使用特权

评论回复
9
nqty| | 2025-4-16 20:41 | 只看该作者
如果中断处理函数中执行了耗时操作(如复杂计算、延时等),会导致后续数据接收中断被延迟处理,从而打乱数据存储顺序。

使用特权

评论回复
10
pe66ak| | 2025-4-16 22:50 | 只看该作者
如果在中断中直接进行数据发送操作,可能会导致发送和接收操作互相干扰,尤其是在发送操作耗时较长时。

使用特权

评论回复
11
miltk| | 2025-4-16 23:38 | 只看该作者
数组溢出或覆盖,如果接收数据速度过快,而数组没有及时处理(如发送到电脑),可能导致新数据覆盖旧数据,导致顺序混乱。

使用特权

评论回复
12
hhdhy| | 2025-4-17 08:43 | 只看该作者
在发送数据时,可能没有按照数组的顺序发送,或者发送操作被其他中断打断,导致顺序混乱。

使用特权

评论回复
13
单片小菜| | 2025-4-17 09:06 | 只看该作者
速度太快了,需要等到发完在进行回复

使用特权

评论回复
14
gra22ce| | 2025-4-17 11:06 | 只看该作者
硬件或波特率问题,如果串口波特率设置不匹配,或者硬件存在干扰,可能导致数据传输错误。

使用特权

评论回复
15
teaccch| | 2025-4-17 13:06 | 只看该作者
减少中断处理时间,中断处理函数应仅完成必要的数据接收和存储操作,避免耗时操作

使用特权

评论回复
16
星星点点didi| | 2025-4-17 14:27 | 只看该作者
使用环形缓冲区,将接收到的数据存储到环形缓冲区中,主程序定期从缓冲区中读取数据并处理。

使用特权

评论回复
17
canfeil| | 2025-4-17 18:53 | 只看该作者
可以使用双缓冲机制,设置两个缓冲区,一个用于中断接收数据,另一个用于主程序发送数据。当一个缓冲区填满后,切换到另一个缓冲区,避免数据覆盖。

使用特权

评论回复
18
twinkhahale| | 2025-4-17 21:08 | 只看该作者
确保发送顺序,在主程序中,按照数组的顺序依次发送数据,避免在中断中直接发送数据。使用标志位或队列机制,确保发送操作按顺序执行。

使用特权

评论回复
19
喂什么玩意| | 2025-4-25 16:50 | 只看该作者
在某些情况下,中断可能会重入。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

643

主题

3579

帖子

4

粉丝