TI中文支持网
TI专业的中文技术问题搜集分享网站

关于MSP430F149的UART1和UART0的收发问题,非常需要大家帮助

最近正在调试一个程序,MSP430F149的UART0和UART1分别连接PC0和PC1两台电脑, UART1连接的PC1发送数据时,返回来的不是原来的数据,发送ok,返回来给PC1的是 ASKII码表 对应 152 的字符,连接UART0的PC0也接收不到任何数据。P2OUT 连接的是8个LED灯。PC1可以正确接收到UART1发送的数据,而在另外的测试中,UART0和UART1的接收中断服务函数 分别写 TXBUF1=RXBUF0  和TXBUF0=RXBUF1时,也可以正确收发,怎么做可以让UART1的收发正确呢?

#include "msp430x14x.h"
#define uint unsigned int
#define uchar unsigned char
uchar  num=0,sum;
uchar  jud[2]={0,0};
//uchar  wd[20],xy[20],xl[20];
uchar  stand[2]={0,0};

void Send1Char0(uchar sendchar);  
void PutString0(uchar *ptr);
void Send1Char1(uchar sendchar);  
void PutString1(uchar *ptr); void com_init();//串口初始化
void com_init1()
{
    unsigned int i;
     /*下面六行程序关闭所有的IO口*/  
    P1DIR = 0XFF;P1OUT = 0XFF;  
    P2DIR = 0XFF;P2OUT = 0XFF;  
    P3DIR = 0XFF;P3OUT = 0XFF;  
    P4DIR = 0XFF;P4OUT = 0XFF;  
    P5DIR = 0XFF;P5OUT = 0XFF;  
    P6DIR = 0XFF;P6OUT = 0XFF;         P3SEL |= BIT6+BIT7;
    P3DIR |= BIT6;
    BCSCTL1 &= ~XT2OFF;                       // XT2on  
    do  
    {  
    IFG1 &= ~OFIFG;                           // Clear OSCFault flag  
    for (i = 0xFF; i > 0; i–);               // Time for flag to set  
    }  
    while ((IFG1 & OFIFG));                   // OSCFault flag still set?  
    BCSCTL2 |= SELM_2 + SELS;                 // MCLK = SMCLK = XT2
        ME2 |= UTXE1 + URXE1;  // 使能USART1的发送和接受    UCTL1 |= CHAR + SWRST;        //选择8位字符
    UTCTL1 |= SSEL1;     //UCLK = SMCLK
    UBR01 = 0x45;         //波特率115200
    UBR11 = 0x00;
    UMCTL1 = 0x00;
    UCTL1 &= ~SWRST; //初始化UART1     IE2 |= URXIE1;  //使能UART1的 接收中断
    _EINT();   //打开全局中断
      
  
}
void com_init()  
{  
    P3SEL |= 0x30;                            // 选择P3.4和P3.5做UART通信端口  and P3.6 TXD P3.7 RXD
    P3DIR |= BIT4;         ME1 |= UTXE0 + URXE0;                     // 使能USART0的发送和接受  
    UCTL0 |= CHAR + SWRST;                            // 选择8位字符  
    UTCTL0 |= SSEL1;                          // UCLK = SMCLK     
    UBR00 = 0x45;                             // 波特率115200  
    UBR10 = 0x00;                             //        UMCTL0 = 0x00;                            // Modulation  
    UCTL0 &= ~SWRST;                          // 初始化UART        IE1 |= URXIE0;                            // 使能USART0的接收中断          }  
/*******************************************   //
函数名称:data_SEND
功    能:发送AT
参    数:data返回值  :无********************************************/
void data_SEND()
{
    while (!(IFG2 & UTXIFG1));    //等待发送寄存器为空    TXBUF1='A';
    while (!(IFG2 & UTXIFG1));    //等待发送寄存器为空    TXBUF1='T';
}

/*******************************************函数名称:UART1_RXISR功    能:UART1的接收中断服务函数           
参    数:无 返回值  :无********************************************/  
#pragma vector = UART1RX_VECTOR  
__interrupt void UART1_RXISR(void) {
         stand[0]=1;
     sum=RXBUF1;

    while (!(IFG2 & UTXIFG1));
    TXBUF1 = sum;
    while (!(IFG1 & UTXIFG0));
    TXBUF0 = sum;
//  
}
/*******************************************         函数名称:UART0_RXISR                                
功    能:UART0的接收中断服务函数               
参    数:无                                   
返回值  :无                                        ********************************************/        
#pragma vector = UART0RX_VECTOR  
__interrupt void UART0_RXISR(void)  
{        
   stand[0]=2;
}  
/*******************************************         函数名称:Send1Char                           
功    能:向PC机发送一个字符                       
参    数:sendchar–要发送的字符                        返回值  :无                                            
********************************************/  
void Send1Char0(uchar sendchar0)  
{  
      while (!(IFG1 & UTXIFG0));    //等待发送寄存器为空           
      TXBUF0 = sendchar0;    }
void Send1Char1(uchar sendchar1)  
{  
     
      while (!(IFG2 & UTXIFG1));    //等待发送寄存器为空           
      TXBUF1 = sendchar1;    }  
/*******************************************函数名称:PutSting功    能:向PC机发送字符串 参    数:ptr–指向发送字符串的指针 返回值  :无********************************************/  
void PutString0(uchar *ptr0)  
{  
      while(*ptr0 != '\0')  
      {  
            Send1Char0(*ptr0++);                     // 发送数据  
      }  
      
  //    while (!(IFG1 & UTXIFG0));  
  //    TXBUF0 = 0x0d;      //    while (!(IFG1 & UTXIFG0));  
  //    TXBUF0 = 0x0a;                              //发送换行指令  
}  
  
void PutString1(uchar *ptr1)  
{  
      while(*ptr1 != '\0')  
      {              
            Send1Char1(*ptr1++);                     // 发送数据  
      }  
      P2OUT=0xfe;
  //    while (!(IFG2 & UTXIFG1));  
  //    TXBUF1 = 0x0d;      //    while (!(IFG2 & UTXIFG1));  
  //    TXBUF1 = 0x0a;                              //发送换行指令  
} /********************主函数********************/  
void main(void)  
{  
  WDTCTL = WDTPW + WDTHOLD;
   
    P2DIR=0xff;
     
    com_init1();     com_init();     P2OUT=0xf0;

    PutString1("AT");
   
   
    while(1)  
    {       if(stand[0]==1)
         P2OUT=0xaa;       if(stand[0]==2)
      {     
        P2OUT=0x3c;

        while (!(IFG2 & UTXIFG1));    //等待发送寄存器为空           
        TXBUF1 = 0x41;   //A
        while (!(IFG2 & UTXIFG1));    //等待发送寄存器为空           
        TXBUF1 = 0x54;   //T
      
        stand[0]=3;
      }
        
    }  
}

灰小子:

你的代码有些乱阿 。建议单独调试UART0和UART1,没问题了再整合在一起。

赞(0)
未经允许不得转载:TI中文支持网 » 关于MSP430F149的UART1和UART0的收发问题,非常需要大家帮助
分享到: 更多 (0)