社区导航

 
查看: 967|回复: 9

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

[复制链接]

29

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2018-2-2 17:36:23 | 显示全部楼层 |阅读模式
本帖最后由 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 != '\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;
      }
        
    }  
}


回复

使用道具 举报

86

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2018-2-2 19:34:46 | 显示全部楼层
你可以使串口1通过max232芯片转换后直接和PC串口接通,再使用串口调试工具进行数据互发,看到底是你接收的问题,还是对方发送的问题。记得一定要共地。


回复

使用道具 举报

29

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-2-2 20:20:59 | 显示全部楼层
忘归尘 发表于 2018-2-2 19:34
你可以使串口1通过max232芯片转换后直接和PC串口接通,再使用串口调试工具进行数据互发,看到底是你接收的 ...

谢谢,可是我这边还没有max232芯片,只能排除问题,用单片机使用UART1发送给PC数据是正确的,如果使用TXBUF1=RXBUF0, 单片机将接收到的数据发回去就有问题, 应该是接收的问题,可能没有进入UART1的接收中断函数,但是又不知道怎么改。


回复

使用道具 举报

1

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2018-2-3 07:59:39 来自手机 | 显示全部楼层
你好我没有用过msp430,但是其他mcu一般接收数据时要等待某个寄存器位状态改变


回复

使用道具 举报

1053

TA的帖子

1

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-2-3 09:31:13 | 显示全部楼层
参考官方的代码调通串口0和串口1


回复

使用道具 举报

29

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-2-3 17:40:59 | 显示全部楼层
qwerghf 发表于 2018-2-3 09:31
参考官方的代码调通串口0和串口1

非常感谢,已经解决


回复

使用道具 举报

29

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-2-3 17:41:18 | 显示全部楼层
wxg5555 发表于 2018-2-3 07:59
你好我没有用过msp430,但是其他mcu一般接收数据时要等待某个寄存器位状态改变

非常感谢,已经解决


回复

使用道具 举报

565

TA的帖子

235

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-2-6 19:42:55 | 显示全部楼层
楼主可以把解决方法或者问题原因给大家分享一下,方便大家互相学习。
爱电子,爱生活


回复

使用道具 举报

1

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2018-5-15 20:54:49 | 显示全部楼层
q891031520 发表于 2018-2-3 17:41
非常感谢,已经解决

楼主能说说这个问题怎么解决吗?谢谢啦


回复

使用道具 举报

29

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-5-19 14:59:45 | 显示全部楼层
很抱歉,时间长了也不记得了,有问题提出来大家共同进步


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2018-12-12 07:02 , Processed in 0.281102 second(s), 15 queries , Gzip On, MemCache On.

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