打印

求助 485中断程序问题

[复制链接]
1903|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dedeke|  楼主 | 2007-6-21 13:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void com_interrupt(void) interrupt 4 using 3
{
  unsigned char RECEIVR_buffer;
    if(RI)                               //处理接收中断
    {      
      RI=0;                              //清除中断标志位
      RECEIVR_buffer=SBUF;               //接收串口数据
      intlen++;                          //记录读数据次数
      if (intlen<3)
        stabuffer[sta++]=RECEIVR_buffer;
      else 
      {
      if ((stabuffer[0]==0xf9)&&(stabuffer[1]==0xae))
      {
        sta=0;
            switch(intlen)
          {
                         case 3:
                pagnum=RECEIVR_buffer;
                            check=check^pagnum;
                break;
             case 4:
                Hdatalen=RECEIVR_buffer;
                            check=check^Hdatalen;
                break;
             case 5:
                    Ldatalen=RECEIVR_buffer;
                            check=check^Ldatalen;
                datalen=Hdatalen*256+Ldatalen;
                break;
             default:
                            stadata=1;
                break;
          }
         while (stadata)
         {
            if ((intlen-6)<datalen)
            {
               buffer=RECEIVR_buffer;
               check=check^RECEIVR_buffer;
               inton=1;
               //WriteBuffer((intlen-6),buffer);                 
            }
            else
            {
               parcheck=RECEIVR_buffer;
               //check=check^parcheck;
               intlen=0;
               cStart=0;
            }
            stadata=0;   
         }

      }
      else
        P3_5=0;
      }
    }
    else if (TI)                              //处理发送中断
    {
      TI=0;
    }
  //EA=1;           //开中断
}

    P3_5=0;
    UART_init();    //初始化串口
    EA=1;           //开中断
    COM_send();     //发送起始数据包
    P3_5=1;
    while(1)
    {
    if (cStart)
    {  
       if (intlen>5)
       {
          writeadd=intlen-6;
          writedata=buffer;
          if (inton=1)
          {
              WriteBuffer(writeadd,writedata); 
              inton=0;
          }
          _nop_();
       }      
    }
     }
我用WriteBuffer();函数把接收到的数据存入一个Flash的Buffer中,但是我读出来的数据和发送的数据不一致,我怀疑是我在调用WriteBuffer()函数时,中断改变了子函数的参数,使得数据发生了变化。请各位兄弟帮帮忙,如何改正。

相关帖子

沙发
guoqi| | 2007-6-21 16:55 | 只看该作者

怀疑,,,,

LZ怀疑的不无道理,因为你写FLASH的时候,而一般的FLASH在写数据之前都有一个固定的时序,要是在写这个时序的时候被打断,数据就无法写到FLASH中了。所以,在写FLASH之前屏蔽中断!
不知道这样做会不会影响到你的接受!

使用特权

评论回复
板凳
guoqi| | 2007-6-21 16:56 | 只看该作者

呵呵

还想说句,LZ的中断函数写的有点太繁琐,拿到外面做这些事情不好吗?

使用特权

评论回复
地板
lenglx| | 2007-6-21 17:06 | 只看该作者

既然你怀疑WriteBuffer()

那就更改WriteBuffer()啊

写FLASH你有2件事情要做,一是将数据写到FLASH(实际上是FLASH芯片的缓冲区),这个过程中断是可以被中断的,但不能太久,太久就进入内部写过程了.
第2是你需要判断FLASH的内部写过程是否完成.

具体参数,查看你的数据手册.

使用特权

评论回复
5
dedeke|  楼主 | 2007-6-23 09:33 | 只看该作者

谢谢

谢谢楼上的两位,我在接收的过程中不能屏蔽中断,那样会影响我的接收。也不能先把数据放到缓存中,等接收完在写到buffer里,正因为这样才麻烦。

使用特权

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

本版积分规则

2

主题

53

帖子

0

粉丝