查看: 206|回复: 36
收起左侧

[技术求助] 串口接收中断程序

[复制链接]

462

主题

4289

帖子

1万

积分

资深工程师

 楼主| 发表于 2017-9-10 17:02 | 显示全部楼层 |返回版面||阅读模式
430串口接收中断程序为什么始终进不了

462

主题

4289

帖子

1万

积分

资深工程师

 楼主| 发表于 2017-9-10 17:04 | 显示全部楼层 |返回版面

#include"msp430.h"

/**************宏定义***********************/
#define uchar unsigned char
#define uint  unsigned int

uchar  Buffer_Rx[40];
uchar  Buffer_TX[40]="串口程序调试";           //定义发送缓冲区
uchar  Rx_long;
uchar  Flag=0;                                              //一旦我们进入中断,就改变此标志位,控制灯闪烁

/**************串口初始化,采用查询方式***********************/
/*************注意:串口初始化完成后,是处于复位状态**********************/
void  Init_usart(void)
{
    P3SEL|=0XC0;                //串口1的I/O口选择位外围模块功能
    P3DIR|=0X40;                //P3.6为输出,P3.7为输入
   
    U1TCTL=SSEL1+SSEL0;         //选择SMCLK
    U1CTL=SWRST+CHAR;           //先将串口处于复位状态,8位数据,无校验,停止位1位
//   U1RCTL|=URXEIE;           //接收出错中断允许位
    U1TXBUF=0x00;               //先将发送缓冲区和接收缓冲区清0
//   U1RXBUF=0x00;
    U1BR1=0;
    U1BR0=208;                  //波特率为38400
    U1MCTL=0x89;
    ME2|=UTXE1+URXE1;           //允许发送和接收
    IE2|=URXIE1;                //接收中断使能
}
void main()
{
    volatile unsigned int i=0;            // volatile to prevent optimization
   
    WDTCTL = WDTPW + WDTHOLD;             // Stop watchdog timer
   
    P4DIR |= 0x04;                        // Set P4.3  当接收完成后置位
    BCSCTL1&=~XT2OFF;                     //开启XT2
    BCSCTL2|=SELM1+SELS;                   //选择XT2CLK为MCLK和SMCLK时钟源
   
    do
    {
          IFG1&=~OFIFG;       //清除振荡器失效标志
          for(i=255;i>0;i--);
     }while(IFG1&OFIFG);//判断XT2是否起振
     
    Init_usart();
    //SR|=GIE;                            //开总中断
   
    U1CTL&=~SWRST;                        //关闭串口的复位
    _BIS_SR(GIE);                         //开总中断
  //  _EINT();            
   while(Buffer_TX!='\0')
    {        
        while((IFG2&UTXIFG1)==0);
        U1TXBUF=Buffer_TX;
//       UTXIFG1=0;
        i++;
    }
    while(1)
    {  
        if(Rx_long==8)
        {
            i=0;
             while(Rx_long!=i)
            {        
                while((IFG2&UTXIFG1)==0);
                U1TXBUF=Buffer_TX;
                i++;
            }
            Rx_long=0;
        }
        if(Flag==1)
        {
            P4OUT ^= 0x04;                      // Toggle P4.2 using exclusive-OR

            i = 5000;                          // SW Delay
            do i--;
            while (i != 0);
            P4OUT ^= 0x04;                      // Toggle P4.2 using exclusive-OR

            i = 5000;                          // SW Delay
            do i--;
            while (i != 0);           
        }
    }
}
/************串口接收中断服务子程序**********************/
#pragma vector=USART1RX_VECTOR
__interrupt void UART1RXINT(void)
{
       _DINT();                  //关闭全局中断
      Flag=1;
      if((IFG2&URXIFG1)!=0)
      {
            Buffer_Rx[Rx_long]=U1RXBUF;
            Rx_long++;
       }
      _EINT();                   //恢复全局中断
}

428

主题

4295

帖子

1万

积分

资深工程师

发表于 2017-9-10 17:06 | 显示全部楼层 |返回版面

参照哪的代码啊

462

主题

4289

帖子

1万

积分

资深工程师

 楼主| 发表于 2017-9-10 17:08 | 显示全部楼层 |返回版面
参照了网上的记个串口接收初始化的代码

462

主题

4289

帖子

1万

积分

资深工程师

 楼主| 发表于 2017-9-10 17:10 | 显示全部楼层 |返回版面

前面有个发送给PC 的部分,能够正确接收到“串口程序调试”记个字

460

主题

4874

帖子

1万

积分

资深工程师

发表于 2017-9-10 17:16 | 显示全部楼层 |返回版面

首先确认端口功能配置是否正确,然后确认初始化配置是否正确,波特率设置是否正确,是否允许中断。

466

主题

4840

帖子

1万

积分

资深工程师

发表于 2017-9-10 17:17 | 显示全部楼层 |返回版面
可以去TI网站下下载相应型号CPU的各外围模块例程,例程是肯定可以用的。

486

主题

4610

帖子

1万

积分

资深工程师

发表于 2017-9-10 17:19 | 显示全部楼层 |返回版面
串口初始化配置完后,要将串口设置成置位状态

458

主题

4439

帖子

1万

积分

资深工程师

发表于 2017-9-10 17:20 | 显示全部楼层 |返回版面


P4DIR |= 0x04;                        // Set P4.3  当接收完成后置位

这个应该是P4.2,你是接了LED了吧,是不是这个搞错了啊

466

主题

4361

帖子

1万

积分

资深工程师

发表于 2017-9-10 17:21 | 显示全部楼层 |返回版面
我看了一下。没明白你这程序到底要干啥?
首先 ,Buffer_TX[40]是个数组,你在程序中使用 Buffer_TX不妥当,因为 Buffer_TX是数组首地址,是个常量指针,这么用不对。
再次,在中断中不用加 _DINT(); 和 _EINT();,进入中断,系统自动关闭GIE,中断推出,恢复原来SP设置。
第三,
既然你是接受数据,
while(Buffer_TX!='\0')
    {        
        while((IFG2&UTXIFG1)==0);
        U1TXBUF=Buffer_TX;
//       UTXIFG1=0;
        i++;
    }
   这个是干啥呢?怎么出现总出现发送数组呢?

466

主题

4361

帖子

1万

积分

资深工程师

发表于 2017-9-10 17:27 | 显示全部楼层 |返回版面

这和发送有什么关系呢?而且while((IFG2&UTXIFG1)==0);这个判断是干啥呢啊?

462

主题

4289

帖子

1万

积分

资深工程师

 楼主| 发表于 2017-9-10 17:29 | 显示全部楼层 |返回版面
好的,我明白了

5

主题

608

帖子

1824

积分

助理工程师

发表于 2017-9-10 21:31 | 显示全部楼层 |返回版面
jlyuan 发表于 2017-9-10 17:04
#include"msp430.h"

/**************宏定义***********************/

这是msp430哪个芯片?

7

主题

583

帖子

1755

积分

助理工程师

发表于 2017-9-10 21:32 | 显示全部楼层 |返回版面
jlyuan 发表于 2017-9-10 17:04
#include"msp430.h"

/**************宏定义***********************/

硬件电路正确吗?

1

主题

521

帖子

1563

积分

助理工程师

发表于 2017-9-10 21:32 | 显示全部楼层 |返回版面
驱动源信号是多大的?

0

主题

571

帖子

1723

积分

助理工程师

发表于 2017-9-10 21:33 | 显示全部楼层 |返回版面
jlyuan 发表于 2017-9-10 17:04
#include"msp430.h"

/**************宏定义***********************/

IO的配置哪里?

0

主题

501

帖子

1503

积分

助理工程师

发表于 2017-9-10 21:33 | 显示全部楼层 |返回版面
中断要开启全局中断才行。

0

主题

369

帖子

1107

积分

助理工程师

发表于 2017-9-10 21:34 | 显示全部楼层 |返回版面
jlyuan 发表于 2017-9-10 17:04
#include"msp430.h"

/**************宏定义***********************/

TI官网提供代码完全可以使用。

0

主题

249

帖子

747

积分

高级技术员

发表于 2017-9-10 21:35 | 显示全部楼层 |返回版面
看你的代码,好像没有引脚。

0

主题

189

帖子

568

积分

高级技术员

发表于 2017-9-10 21:36 | 显示全部楼层 |返回版面
jlyuan 发表于 2017-9-10 17:04
#include"msp430.h"

/**************宏定义***********************/

这个是msp430哪个的芯片
您需要登录后才可以回帖 登录 | 注册 手机登录

本版积分规则

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