查看: 11433|回复: 12

[其他] SCI 困惑,为什么接受的时候,发了一窜数据,只来一个中断,只能接收一个字节的数据

[复制链接]

该用户从未签到

4

主题

38

帖子

0

新手上路

Rank: 1

积分
53
最后登录
1970-1-1
发表于 2011-7-29 08:25:13 | 显示全部楼层 |阅读模式
我用的是MC9S08LG32的CPU,在配置sci时,发送和接收都用的是中断,发送一切都是正常的,但是我用串口调试助手给下位机发送几个字节的时候,下位机只来了一个中断,每次只能接收第一个字节。忘高手,给点建议。小弟初学,不懂啊!急切等待回复。谢谢。
 
 
挖宝活动: fsl_k60.jpg
我知道答案 目前已有11人回答
回复

使用道具 举报

  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2011-7-29 09:41:23 | 显示全部楼层

    RE:SCI 困惑,为什么接受的时候,发了一窜数据,只来一个中断,只能接收一个字节的数据

    看不到你的代码的处理,所以不知道问题出在什么地方。可能是:
    1、如果接收的字符是第一个,那么就是接收完以后就关闭了中断;
    2、如果是最后一个,就是接收的时候没有放入缓存区中而是直接给了变量。
    该会员没有填写今日想说内容.

    该用户从未签到

    4

    主题

    38

    帖子

    0

    新手上路

    Rank: 1

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

    RE:SCI 困惑,为什么接受的时候,发了一窜数据,只来一个中断,只能接收一个字节的数据

    code :
    /*
    ** ===================================================================
    **     Interrupt handler : isrVsci1rx
    **
    **     Description :
    **         User interrupt service routine.
    **     Parameters  : None
    **     Returns     : Nothing      isrVsci1rx
    ** ===================================================================
    */
    __interrupt void isrVsci1rx(void)
    {
       /*
       while(SCI1S1_RDRF!=1){};         
       Uart_Buffer[Data_IN++] = SCI1D;
       //delayConst1mS(1);  
       SCI1S1_RDRF = 0;
       Data_IN %= RX_BUFFER_SIZE;
       delayConst1mS(1);
       */
       while(SCI1S1_RDRF!=1){};         
       Uart_Buffer[Data_IN++] = SCI1D;
       //delayConst1mS(1);  
       //SCI1S1_RDRF = 0;
       //SCIWriteData(&Uart_Buffer[Data_IN],3);
       Data_IN %= RX_BUFFER_SIZE;
       SCIWriteData(&SCI1D,1);
       //delayConst1mS(1);
          
    }
    /*
    ** ===================================================================
    **     Function : SCIWriteData
    **
    **     Description :
    **         Write data to UART.
    **     Parameters  : unsigned char *addr,unsigned char num
    **     Returns     : Nothing
    ** ===================================================================
    */
    void SCIWriteData(unsigned char *addr,unsigned char num)
    {
      //DisableInterrupts;
      //unsigned char i = 0;
      pucBuffer =(unsigned char *) addr;
      ucUart_OUT_NUM = num;
      DE1_OUT=1;
      TXD_ENABLE=1;
      TXDI_ENABLE=1;
      delayConst1mS(10);
      EnableInterrupts;
    }

    该用户从未签到

    4

    主题

    38

    帖子

    0

    新手上路

    Rank: 1

    积分
    53
    最后登录
    1970-1-1
     楼主| 发表于 2011-8-1 08:06:36 | 显示全部楼层

    RE:SCI 困惑,为什么接受的时候,发了一窜数据,只来一个中断,只能接收一个字节的数据

    安老师,帮忙看看啊。我是正的没辙了,不知道问题怎么解决?谢谢
  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2011-8-1 15:31:53 | 显示全部楼层

    RE:SCI 困惑,为什么接受的时候,发了一窜数据,只来一个中断,只能接收一个字节的数据

    1、中断这样写:
    __interrupt void isrVsci1rx(void)
    {
    while(SCI1S1_RDRF!=1){};
    Uart_Buffer[Data_IN++] = SCI1D;
    SCI1S1_RDRF = 0;
    }
    2、你main中判断
    if(Data_IN >=3)
    {
       SCIWriteData(Uart_Buffer,Data_IN );
       Data_IN = 0;
    }
    该会员没有填写今日想说内容.

    该用户从未签到

    4

    主题

    38

    帖子

    0

    新手上路

    Rank: 1

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

    RE:SCI 困惑,为什么接受的时候,发了一窜数据,只来一个中断,只能接收一个字节的数据

    发送了多个字节的情况下,SCI1S1_OR Receive Overrun Flag 会被置起来,这样后面的字节就都lost了。我现在是这样做的。
    Coding:
    __interrupt void isrVsci1rx(void)
    {
       unsigned char ucSCIData = 0;
       unsigned char i = 10;
       while(i>0)
       {
         while(SCI1S1_RDRF!=1)
         {
              if(i>1)
              {
                   i--;
                  delay(1);
              }
             else 
             {
                  goto LoopBack; 
             }
         }; 
         ucSCIData = SCI1S1; 
         Uart_Buffer[Data_IN++] = SCI1D;
         i = 10;
         while(SCI1S1_RDRF!=0) {}; 
       };
       LoopBack:
       Data_IN %= RX_BUFFER_SIZE;
    }
    不断的去判断SCI1S1_RDRF的状态,直到timeout了,就退出中断。
    这样所有的字节都可以接收完全了。
    谢谢大家的支持,谢谢 安老师。

    该用户从未签到

    4

    主题

    38

    帖子

    0

    新手上路

    Rank: 1

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

    RE:SCI 困惑,为什么接受的时候,发了一窜数据,只来一个中断,只能接收一个字节的数据

    搞不清楚,为什么freescale的串口接收中断是这样处理的。
    与我之前用的51和cortex-M3的不一样。
    Puzzle。
  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

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

    RE:SCI 困惑,为什么接受的时候,发了一窜数据,只来一个中断,只能接收一个字节的数据

    要清除RDRF,当RDRF = 1 时读SCIxS1,然后读SCI 数据寄存器(SCIxD)。下面的代码测试没有问题,你可以参考一下。
    //====================================================
    //SCI1接收中断服务程序
    //====================================================
    interrupt VectorNumber_Vsci1rx void SCI1_RX_ISR(void)
    {
      if( (SCI1S1 & 0x20)==0x20 )
              {
                      buf[0] = SCI1S1;
                      buf[0]=SCI1D;//清除RDRF标志
              }
    }
    该会员没有填写今日想说内容.

    该用户从未签到

    4

    主题

    38

    帖子

    0

    新手上路

    Rank: 1

    积分
    53
    最后登录
    1970-1-1
     楼主| 发表于 2011-8-2 08:34:17 | 显示全部楼层

    RE:SCI 困惑,为什么接受的时候,发了一窜数据,只来一个中断,只能接收一个字节的数据

    在代码中已经清了RDRF!谢谢。
    ucSCIData = SCI1S1;
    Uart_Buffer[Data_IN++] = SCI1D;

    该用户从未签到

    11

    主题

    52

    帖子

    0

    新手上路

    Rank: 1

    积分
    130
    最后登录
    1970-1-1
    发表于 2011-8-3 15:36:07 | 显示全部楼层

    回复:SCI 困惑,为什么接受的时候,发了一窜数据,只来一个中断,只能接收一个字节的数据

    不用困惑,和你的配置或者程序有关!!!!我这个事DZ60的
    //==========================================
    //串口接收中断  VectorNumber_Vsci1rx   中断向量号17
    //==========================================
    interrupt VectorNumber_Vsci1rx  void  SCI_RE(void)
    {
        
      static byte j;
      static byte i;
     byte Rcv;
     if(SCI1S1_RDRF)                                 //串口接收中断标志位
     {                                               //清标志位
      SCI1S1_RDRF = 0;                              //接收数据送缓存
      Rcv = SCI1D;
    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

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

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

    GMT+8, 2025-8-25 09:12 , Processed in 0.112923 second(s), 31 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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