查看: 6254|回复: 13

[其他] 串口接收中断程序,大家看看有没有问题!

[复制链接]

该用户从未签到

4

主题

38

帖子

0

新手上路

Rank: 1

积分
53
最后登录
1970-1-1
发表于 2011-9-9 13:07:08 | 显示全部楼层 |阅读模式
我用的是HCS08 的CPU,平时跑着,没什么问题,现在发现设备跑了16个小时的时候,这个接收中断突然就不会发生了,导致无法接收到数据。很郁闷,大家帮忙分析下原因呢。
__interrupt void isrVsci1rx(void)
{
   unsigned char ucSCIData = 0;
   unsigned char i = 20;
   while(i>0)
   {   
     while(SCI1S1_RDRF!=1)
     {
        if(i>1)
        {
          i--;
          delayConst1mS(1);
        }
        else
        {
          //break;//
          goto LoopBack;       
        }       
     };       
     ucSCIData = SCI1S1;              
     Uart_Buffer[Data_IN++] = SCI1D;
     Data_IN %= RX_BUFFER_SIZE;
     i = 20;
     while(SCI1S1_RDRF!=0)
     {
        if(i>1)
        {
          i--;
          delayConst1mS(1);
        }
        else
        {
          //break;//goto LoopBack;
          goto LoopBack;       
        }
     };
     i = 20;    
   };  
LoopBack:  
    delayConst1mS(1);;
}
我知道答案 目前已有13人回答
回复

使用道具 举报

该用户从未签到

27

主题

418

帖子

0

新手上路

Rank: 1

积分
228
最后登录
1970-1-1
发表于 2011-9-9 15:25:01 | 显示全部楼层

回复:串口接收中断程序,大家看看有没有问题!

有可能是外部干扰导致的程序跑飞,可以加个看门狗

该用户从未签到

4

主题

38

帖子

0

新手上路

Rank: 1

积分
53
最后登录
1970-1-1
 楼主| 发表于 2011-9-9 15:50:02 | 显示全部楼层

RE:串口接收中断程序,大家看看有没有问题!

应该不是的,我试过几次了,都是跑了差不多16~18个小时的时候出现问题了。CPU没有死,串口还是可以向外发送数据的。
  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2011-9-9 16:57:26 | 显示全部楼层

    RE:串口接收中断程序,大家看看有没有问题!

    这个程序我一点都没看明白接收以后,如何处理,请问一下,你如何知道接收中断进不去了?中断的函数处理太繁琐。
    interrupt 17 void  SCI_RE(void)
    {
        while(SCIS1_RDRF)  Uart_Buffer[Data_IN++] = SCI1D;
        SCIS1_RDRF=0;
    }
    下面的代码你用来做什么?
    Uart_Buffer[Data_IN++] = SCI1D;
    Data_IN %= RX_BUFFER_SIZE;
    该会员没有填写今日想说内容.

    该用户从未签到

    65

    主题

    204

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    270
    最后登录
    1970-1-1
    发表于 2011-9-10 09:33:40 | 显示全部楼层

    回复:串口接收中断程序,大家看看有没有问题!

    回复第 5 楼 于2011-09-09 08:57:26发表:
    这个程序我一点都没看明白接收以后,如何处理,请问一下,你如何知道接收中断进不去了?中断的函数处理太繁琐。
    interrupt 17 void SCI_RE(void)
    {
    while(SCIS1_RDRF) Uart_Buffer[Data_IN++] = SCI1D;
    SCIS1_RDRF=0;
    }
    下面的代码你用来做什么?
    Uart_Buffer[Data_IN++] = SCI1D;
    Data_IN %= RX_BUFFER_SIZE;
     

     
     
    Uart_Buffer[Data_IN++] = SCI1D;
    Data_IN %= RX_BUFFER_SIZE;
    这段代码是用来用来存放数据的缓冲区,缓冲区的大小是RX_BUFFER_SIZE帧,只不过这里帧的大小为1而已,Data_IN %= RX_BUFFER_SIZE是用来确定存放在Uart_Buffer数组中的索引号!

    该用户从未签到

    65

    主题

    204

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    270
    最后登录
    1970-1-1
    发表于 2011-9-10 09:56:45 | 显示全部楼层

    回复:串口接收中断程序,大家看看有没有问题!

    楼主的代码完全是简单的问题复杂化了,中断处理有问题,还有就是中断中最好不要用延时,其它处理直接交给主程序处理就可以了。
    static byte Data_IN;           // 接收缓冲区队列写指针
    static byte Data_OUT;      // 接收缓冲区队列读指针
    interrupt 17 void SCI_RE(void)
    {
       if(SCIS1_RDRF==0)
       {
          清中断标志
          return;
       }
       if((byte)(Data_IN - Data_OUT) < RX_BUFFER_SIZE)    // 接收缓冲区满 ?
       {
         i = Data_IN% RX_BUFFER_SIZE;
         Uart_Buffer   = SCI1D;
         Data_IN++;
       }
       清中断标志及接受标志
    }

    该用户从未签到

    4

    主题

    38

    帖子

    0

    新手上路

    Rank: 1

    积分
    53
    最后登录
    1970-1-1
     楼主| 发表于 2011-9-21 10:51:35 | 显示全部楼层

    回复:串口接收中断程序,大家看看有没有问题!

    回复第 5 楼 于2011-09-09 08:57:26发表:
    这个程序我一点都没看明白接收以后,如何处理,请问一下,你如何知道接收中断进不去了?中断的函数处理太繁琐。
    interrupt 17 void SCI_RE(void)
    {
    while(SCIS1_RDRF) Uart_Buffer[Data_IN++] = SCI1D;
    SCIS1_RDRF=0;
    }
    下面的代码你用来做什么?
    Uart_Buffer[Data_IN++] = SCI1D;
    Data_IN %= RX_BUFFER_SIZE;
     

    我手动发数据的,但是接收中断处的断点没有响应!

    该用户从未签到

    4

    主题

    38

    帖子

    0

    新手上路

    Rank: 1

    积分
    53
    最后登录
    1970-1-1
     楼主| 发表于 2011-9-21 10:53:31 | 显示全部楼层

    回复:串口接收中断程序,大家看看有没有问题!

    回复第 6 楼 于2011-09-10 01:33:40发表:
    回复第 5 楼 于2011-09-09 08:57:26发表:
    这个程序我一点都没看明白接收以后,如何处理,请问一下,你如何知道接收中断进不去了?中断的函数处理太繁琐。
    interrupt 17 void SCI_RE(void)
    {
    while(SCIS1_RDRF) Uart_Buffer[Data_IN++] = SCI1D;
    SCIS1_RDRF=0;
    }
    下面的代码你用来做什么?
    Uart_Buffer[Data_IN++] = SCI1D;
    Data_IN %= RX_BUFFER_SIZE;
     

     
     
    Uart_Buffer[Data_IN++] = SCI1D;
    Data_IN %= RX_BUFFER_SIZE;
    这段代码是用来用来存放数据的缓冲区,缓冲区的大小是RX_BUFFER_SIZE帧,只不过这里帧的大小为1而已,Data_IN %= RX_BUFFER_SIZE是用来确定存放在Uart_Buffer数组中的索引号!
     

    你说的没错,下面的代码就是这个作用!

    该用户从未签到

    4

    主题

    38

    帖子

    0

    新手上路

    Rank: 1

    积分
    53
    最后登录
    1970-1-1
     楼主| 发表于 2011-9-21 10:56:36 | 显示全部楼层

    回复:串口接收中断程序,大家看看有没有问题!

    回复第 7 楼 于2011-09-10 01:56:45发表:
    楼主的代码完全是简单的问题复杂化了,中断处理有问题,还有就是中断中最好不要用延时,其它处理直接交给主程序处理就可以了。
    static byte Data_IN;           // 接收缓冲区队列写指针
    static byte Data_OUT;      // 接收缓冲区队列读指针
    interrupt 17 void SCI_RE(void)
    {
       if(SCIS1_RDRF==0)
       {
          清中断标志
          return;
       }
       if((byte)(Data_IN - Data_OUT) < RX_BUFFER_SIZE)    // 接收缓冲区满 ?
       {
         i = Data_IN% RX_BUFFER_SIZE;
         Uart_Buffer   = SCI1D;
         Data_IN++;
       }
       清中断标志及接受标志
    }
     

    那么复杂的处理中断,完全是为了能在中断中接收满所有的字节,否则只能收到第一个字节!
    正常情况确实是如你所说的就能处理好了。
    不清楚Freescale为什么会这样的,也有可能我不了解Freescale。
    谢谢!

    该用户从未签到

    4

    主题

    38

    帖子

    0

    新手上路

    Rank: 1

    积分
    53
    最后登录
    1970-1-1
     楼主| 发表于 2011-10-11 11:18:35 | 显示全部楼层

    RE:串口接收中断程序,大家看看有没有问题!

    SCIS1_RDRF=0;
    这个标志位不要手动清,还是按照手册的说明来清除的比较好。否则SCI在工作了了一段时间之后会不稳定,以至于不能触发接收中断的。
    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-28 16:51 , Processed in 0.101923 second(s), 29 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表