5390|11

53

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

msp430串口中断问题 [复制链接]

通过PC给430发送指令字符串 通过接收中断实现 波特率115200 但是每次接收中断后收到的都是最后字符串最后一个字节 求解
附代码
#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx (void)
{
  //while((IFG1&UTXIFG0)==0);
RecBuf[index]=RXBUF0;
index++;
if(index>=10)
{
index=0;
}
if (RecBuf[index]==0x77)
{
if ((RecBuf[index+1]==0x88)&&(RecBuf[index+2]==0x99))
flg=1;
}
}

最新回复

楼主,可能是你断点下的有问题,把断点直接下在中断程序里面,单片机接收到第一字节的数据后就停到断点处,当你单步运行下去的时候单片机已经接收到了最后一字节,是故 你只是看到最后一字节数据,一般说来,我都会再进入中断的时候 加上中断禁止 __disable_interrupt(),出来的时候再打开中断__enable_interrupt(); 这个样子你再试试看是不是接收到第一字节, 另外,写串口程序的时候,可以再加一个定时器程序,来判断串口通信结束,这样子方便些,以前写过一个485的,完全一样,你可以参考一下 /*********** rs485 接收中断 ***********/ #pragma vector=USART0RX_VECTOR __interrupt void RS485_rx(void) {     __disable_interrupt();        TACTL_bit.TAMC = 0;//stop timerA   //  temp_data[frmindex++] = RXBUF0;     rs485_rxdata[rs485rxdata_len++] = RXBUF0;         TAR = 1;   //定时器A计数器置1     TACTL_bit.TAMC = 1;//start timerA, up mode     __enable_interrupt(); } /******* rs485 接收完成判定 ******/ #pragma vector=TIMERA1_VECTOR __interrupt void Timer(void) {     __disable_interrupt();          //unsigned char i;     if (TACTL_bit.TAIFG == 1)     {         TACTL_bit.TAIFG = 0;//clear interrupt flag         TACTL_bit.TAMC = 0;//stop timer          //       rs485rxdata_index = frmindex ;//rs485 接收数据长度   //      for(i=0; i  详情 回复 发表于 2012-8-28 15:50
 
点赞 关注

回复
举报

53

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
RXBUF0永远是最后一个字节

点评

楼主对RXBUF0不了解吧,这个寄存器永远只保存最新的一个字节,也只能是一个字节,所以当然是永远都是最后一个字节了  详情 回复 发表于 2012-8-28 10:50
 
 

回复

1798

帖子

0

TA的资源

五彩晶圆(初级)

板凳
 
你是不是把接收到的又发送给pc了?
还是在仿真端看的数据,
还有请问你发的字符串是什么。

点评

发送的就是3个字节的16进制数 0x77 0x88 0x99 在iar watch下查看的  详情 回复 发表于 2012-8-28 10:48
 
 
 

回复

53

帖子

0

TA的资源

一粒金砂(中级)

4
 

回复 板凳 sint27 的帖子

发送的就是3个字节的16进制数 0x77 0x88 0x99 在iar watch下查看的

点评

每接收一个字节之后产生一次中断,再接收第二个字节的时候,产生第二次中断的时候就会覆盖掉原来的数值了  详情 回复 发表于 2012-8-28 10:53
 
 
 

回复

1798

帖子

0

TA的资源

五彩晶圆(初级)

5
 

回复 沙发 kaka0202 的帖子

楼主对RXBUF0不了解吧,这个寄存器永远只保存最新的一个字节,也只能是一个字节,所以当然是永远都是最后一个字节了
 
 
 

回复

1798

帖子

0

TA的资源

五彩晶圆(初级)

6
 

回复 4楼 kaka0202 的帖子

每接收一个字节之后产生一次中断,再接收第二个字节的时候,产生第二次中断的时候就会覆盖掉原来的数值了

点评

是的 我知道你的意思 我的意思是3个字节 会产生3次中断 但是每一次中断 值都是最后一个字节  详情 回复 发表于 2012-8-28 11:00
 
 
 

回复

53

帖子

0

TA的资源

一粒金砂(中级)

7
 

回复 6楼 sint27 的帖子

是的 我知道你的意思 我的意思是3个字节 会产生3次中断 但是每一次中断 值都是最后一个字节
 
 
 

回复

1798

帖子

0

TA的资源

五彩晶圆(初级)

8
 
理解错了,抱歉
我没用过iar watch
至于怎么查看每次中断收到的数据,我也不太清楚,也有可能你的方法错了
你加个函数让它往pc回传字符串
如果收到的跟你发送的一样,那就证明每次中断收到的数据肯定是正确的

点评

看样子 3个字节只执行了一次中断 找不出问题所在  详情 回复 发表于 2012-8-28 11:35
 
 
 

回复

53

帖子

0

TA的资源

一粒金砂(中级)

9
 

回复 8楼 sint27 的帖子

看样子 3个字节只执行了一次中断 找不出问题所在

点评

肯定是一个字节一次中断的, 按照你的思路,你试试发送四字节,十字节,看看是不是也是收到最后一个字节, 如果收到都同样是最后一个字节,那肯定是你查看的方法有错 再从程序的角度来看,如果3个字节只执行一个  详情 回复 发表于 2012-8-28 11:46
 
 
 

回复

1798

帖子

0

TA的资源

五彩晶圆(初级)

10
 

回复 9楼 kaka0202 的帖子

肯定是一个字节一次中断的,
按照你的思路,你试试发送四字节,十字节,看看是不是也是收到最后一个字节,
如果收到都同样是最后一个字节,那肯定是你查看的方法有错
再从程序的角度来看,如果3个字节只执行一个中断,那你写的把数据存入数组的程序也就自相矛盾了。
个人觉得问题所在在于你所谓的“每次接收中断后收到的都是最后字符串最后一个字节”其实早已产生3次中断了。
个人看法,仅供参考
 
 
 

回复

128

帖子

0

TA的资源

一粒金砂(高级)

11
 
个人感觉sint27的看法是对的,楼主再仔细查看下程序
 
 
 

回复

44

帖子

0

TA的资源

一粒金砂(高级)

12
 
楼主,可能是你断点下的有问题,把断点直接下在中断程序里面,单片机接收到第一字节的数据后就停到断点处,当你单步运行下去的时候单片机已经接收到了最后一字节,是故 你只是看到最后一字节数据,一般说来,我都会再进入中断的时候 加上中断禁止 __disable_interrupt(),出来的时候再打开中断__enable_interrupt(); 这个样子你再试试看是不是接收到第一字节,

另外,写串口程序的时候,可以再加一个定时器程序,来判断串口通信结束,这样子方便些,以前写过一个485的,完全一样,你可以参考一下
/*********** rs485 接收中断 ***********/
#pragma vector=USART0RX_VECTOR
__interrupt void RS485_rx(void)
{
    __disable_interrupt();
  
    TACTL_bit.TAMC = 0;//stop timerA
  //  temp_data[frmindex++] = RXBUF0;
    rs485_rxdata[rs485rxdata_len++] = RXBUF0;
   
    TAR = 1;   //定时器A计数器置1
    TACTL_bit.TAMC = 1;//start timerA, up mode

    __enable_interrupt();
}

/******* rs485 接收完成判定 ******/
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer(void)
{
    __disable_interrupt();  
  
    //unsigned char i;
    if (TACTL_bit.TAIFG == 1)
    {
        TACTL_bit.TAIFG = 0;//clear interrupt flag
        TACTL_bit.TAMC = 0;//stop timer
        
//       rs485rxdata_index = frmindex ;//rs485 接收数据长度
  //      for(i=0; i         {
    //        rs485_rxdata = temp_data;
        }
        rs485_valid = 1;
        
        frmindex = 0;
    }
   
    __enable_interrupt();
}

赞赏

1

查看全部赞赏

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表