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

2019-03-23 22:25发布

本帖最后由 q891031520 于 2018-2-2 17:39 编辑

最近正在调试一个程序,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 != '')  
      {  
            Send1Char0(*ptr0++);                     // 发送数据  
      }  
      
  //    while (!(IFG1 & UTXIFG0));  
  //    TXBUF0 = 0x0d;   
  //    while (!(IFG1 & UTXIFG0));  
  //    TXBUF0 = 0x0a;                              //发送换行指令  
}  
  
void PutString1(uchar *ptr1)  
{  
      while(*ptr1 != '')  
      {              
            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;
      }
        
    }  
}
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
忘归尘
1楼-- · 2019-03-24 03:14
 精彩回答 2  元偷偷看……
q891031520
2楼-- · 2019-03-24 03:28
< :TI_MSP430_内容页_SA7 -->
忘归尘 发表于 2018-2-2 19:34
你可以使串口1通过max232芯片转换后直接和PC串口接通,再使用串口调试工具进行数据互发,看到底是你接收的 ...

谢谢,可是我这边还没有max232芯片,只能排除问题,用单片机使用UART1发送给PC数据是正确的,如果使用TXBUF1=RXBUF0, 单片机将接收到的数据发回去就有问题, 应该是接收的问题,可能没有进入UART1的接收中断函数,但是又不知道怎么改。
wxg5555
3楼-- · 2019-03-24 06:04
你好我没有用过msp430,但是其他mcu一般接收数据时要等待某个寄存器位状态改变
qwerghf
4楼-- · 2019-03-24 11:09
 精彩回答 2  元偷偷看……
q891031520
5楼-- · 2019-03-24 16:35
qwerghf 发表于 2018-2-3 09:31
参考官方的代码调通串口0和串口1

非常感谢,已经解决
q891031520
6楼-- · 2019-03-24 20:26
wxg5555 发表于 2018-2-3 07:59
你好我没有用过msp430,但是其他mcu一般接收数据时要等待某个寄存器位状态改变

非常感谢,已经解决

一周热门 更多>

相关问题

    相关文章