在线情况
楼主
  • 头像
  • 级别
    • 积分2
    • 经验43
    • 文章1
    • 注册2012-11-16
    求助!MSP430F149的串口程序,只能发送不能接受
    [FACE=宋体][SIZE=9pt]MSP430F149的串口通信程序,与PC机通行。[/SIZE][/FACE][P][FACE=宋体][SIZE=9pt]单片机上电后给PC机发送ATE0,收到PC机发送的信息后相应的二极管亮。[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=9pt]用串口助手测试,发现串口助手上可以收到ATE0,但是串口助手发送数据,单片机的二极管不亮。[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=9pt]程序如下(基本就是秦龙老师书中程序):[/SIZE][/FACE][/P][P][P][FACE=宋体][SIZE=12px]#include <msp430x14x.h>[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]
    [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]#define CPU_F ((double)8000000) [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]
    [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]char nRev_UART0;      [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]// 串口 0 的发送缓冲区[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]unsigned char UART0_TX_BUF[200];      [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]// 串口 0 的接收缓冲区[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]unsigned char UART0_RX_BUF[200];            [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]unsigned char nTX0_Len;[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]unsigned char nRX0_Len;[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]unsigned char nRX0_Len_temp;[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]unsigned char nTX0_Flag;[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]unsigned char nSend_TX0;[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]
    [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]/************[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]数据打包[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]ATE0[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]***********/[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]unsigned char tc35_init(unsigned char pBuf[])[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]{[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    pBuf[0] = 'A';[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    pBuf[1] = 'T';[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    pBuf[2] = 'E';[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    pBuf[3] = '0';[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    pBuf[4] = 13;[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]
    [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    return 5;[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]}[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]
    [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]/****************[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]时钟初始化[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]ACLK不分频[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]MCLK,SMCKL均选择XT2,8MHZ[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]****************/[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]void Init_CLK(void)[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]{[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]  unsigned char i;[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]  BCSCTL1&=~XT2OFF;                 //打开XT振荡器[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]  BCSCTL2|=SELM1+SELS;              //MCLK为8MHZ,SMCLK为8MHZ[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]  do{[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    IFG1&=~OFIFG;                   //清除震荡标志[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    for(i=0;i<100;i++)[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]      _NOP();                      //延时等待[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]  }[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]  while((IFG1&OFIFG)!=0);           //如果标志为1,则继续循环等待[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]  IFG1&=~OFIFG; [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]}[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]
    [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]/***************[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]串口0初始化[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]8位数据[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]ACKL,9600波特率[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]***************/[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]void Init_UART0(void)[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]{[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]  [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]  [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    UCTL0 |= SWRST;[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    //设置P3.4为UART0的TXD[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    P3SEL |= BIT4;      [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    //设置P3.5为UART0的RXD[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    P3SEL |= BIT5;      [/SIZE]    [/FACE][/P][P][FACE=宋体][SIZE=12px]    //使能UART0的TXD和RXD[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    ME1 |= UTXE0 + URXE0; [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    //将寄存器的内容清零[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    U0CTL = 0X00;      [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    //数据位为8bit[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    U0CTL += CHAR;      [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    //将寄存器的内容清零[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    U0TCTL = 0X00;      [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    //波特率发生器选择ACKL[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    U0TCTL += SSEL0;      [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    //波特率为9600[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    UBR0_0 = 0x03;      [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    UBR1_0 = 0X00;[/SIZE][/FACE][/P][P][SIZE=12px][FACE=宋体]      [/FACE][/SIZE][/P][P][FACE=宋体][SIZE=12px]    //调整寄存器[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    UMCTL_0 = 0X4a;[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    UCTL0 &= ~SWRST;[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    //使能UART0的RX中断[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    IE1 |= URXIE0;      [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    //使能UART0的TX中断[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    IE1 |= UTXIE0;      [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]
    [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    //P3.4为输出管脚[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    P3DIR |= BIT4;      [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    return;[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]}[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]
    [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]
    [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]
    [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]void main(void)[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]{   [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    WDTCTL = WDTPW + WDTHOLD;   // 关闭看门狗    [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]
    [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    //发光二极管,标志发送接收中断[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    P5DIR |= 0XFF;[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    P5OUT |= 0XFF;[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    Init_UART0();[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    Init_CLK();[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    _EINT();   [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    nTX0_Len = tc35_init(UART0_TX_BUF);[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    // 设置中断标志,进入发送中断程序[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    IFG1 |= UTXIFG0;[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    delay_ms(100);[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]
    [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    _BIS_SR(LPM0_bits);[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]
    [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]}[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]
    [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]
    [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]/***************[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]串口发送中断处理[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]将UART0_TX_BUF中的数据发送出去[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]nTX0_Len发送数据长度为[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]nSend_TX0为发送字符计数器[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]nTX0_Flag为UART0_TX_BUF数据发送完标志[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]一旦进入发送中断,点亮P5.6二极管[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]***************/[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]#pragma vector = UART0TX_VECTOR[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]__interrupt void UART0_TXISR(void)[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]{[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    P5OUT &= ~0X40;[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    if(nTX0_Len != 0)[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    {[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]       // 表示缓冲区里的数据没有发送完[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]          [/SIZE]nTX0_Flag = 0;                        [/FACE][/P][P][FACE=宋体][SIZE=12px]          [/SIZE]TXBUF0 = UART0_TX_BUF[nSend_TX0];[/FACE][/P][P][FACE=宋体][SIZE=12px]
    [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]       [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]          [/SIZE]nSend_TX0 += 1;[/FACE][/P][P][FACE=宋体][SIZE=12px]          [/SIZE]delay_us(5);[/FACE][/P][P][FACE=宋体][SIZE=12px]          [/SIZE]if(nSend_TX0 >= nTX0_Len)[/FACE][/P][P][FACE=宋体][SIZE=12px]          [/SIZE]{[/FACE][/P][P][FACE=宋体][SIZE=12px]           //数据发送完毕[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]          [/SIZE]    nSend_TX0 = 0;[/FACE][/P][P][FACE=宋体][SIZE=12px]          [/SIZE]    nTX0_Len = 0;[/FACE][/P][P][FACE=宋体][SIZE=12px]          [/SIZE]    nTX0_Flag = 1;[/FACE][/P][P][FACE=宋体][SIZE=12px]          [/SIZE]}[/FACE][/P][P][FACE=宋体][SIZE=12px]    }[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]}[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]
    [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]/***************[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]串口接收中断处理[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]一旦进入接收中断,点亮P5.7二极管[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]将接受到数据存入UART0_RX_BUF[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]以回车作为一组数据接收结束标志[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]nRX0_Len为接收到的一组数据的长度[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]nRev_UART0为接收到一组数据标志[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]接收到多少字符,点亮相应的二极管[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]若接收到一组数据,点亮P5.5二极管[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]***************/[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]#pragma vector = UART0RX_VECTOR[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]__interrupt void UART0_RXISR(void)[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]{[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    unsigned char chrTemp;[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    P5OUT &= ~0X80;[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    //接收来自的数据[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    UART0_RX_BUF[nRX0_Len_temp] = RXBUF0;      [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    //write_LCD_command(0X98);[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    //write_LCD_data(UART0_RX_BUF[nRX0_Len_temp]);[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]       switch(nRX0_Len_temp)[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]       {[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]       case 0:P5OUT &= ~0X01;[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]              break;[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]       case 1:P5OUT &= ~0X02;[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]              break;[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]       case 2:P5OUT &= ~0X04;[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]              break;[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]       case 3:P5OUT &= ~0X08;[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]              break;[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]       case 4:P5OUT &= ~0X10;[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]              break;   [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]
    [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]       case 6:P5OUT &= ~0X40;[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]              break;[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]       case 7:P5OUT &= ~0X80;[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]              break;             [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]       }[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    nRX0_Len_temp += 1;[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    chrTemp = UART0_RX_BUF[nRX0_Len_temp - 1];[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    if((chrTemp == 13) || (chrTemp == 10))[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    {[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]       P5OUT &= ~0X20;[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]       //接收到一帧信号[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]       nRX0_Len = nRX0_Len_temp;[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]       nRev_UART0 = 1;[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]       nRX0_Len_temp = 0;[/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    }  [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]    //DisplayCgrom(0x98,UART0_RX_BUF);   [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]
    [/SIZE][/FACE][/P][P][FACE=宋体][SIZE=12px]}[/SIZE][/FACE][/P][/P]
    微控网感谢您的参与
    在线情况
    2
    • 头像
    • 级别
      • 积分9
      • 经验624
      • 文章16
      • 注册2010-07-20
      看到一家伙把整篇代码贴出来我就头大,希望能有人有时间帮到你
      微控网感谢您的参与
      在线情况
      3
      • 头像
      • 级别
        • 积分9
        • 经验624
        • 文章16
        • 注册2010-07-20
        看了下,原因是你这代码根本就进不了接收中断[P]430串口发送其实就是一句话,根本用不到这发送中断,而当:1)把串口初始化时的发送中断使能屏蔽;2)把main函数中的 整理数据包、设置发送中断标志屏蔽;3)把串口发送中断处理程序屏蔽;做到这三点后,当PC向串口发送数据时,就可以正常进入接收中断[/P]
        微控网感谢您的参与
        Powered by LeadBBS 9.2 .
        Page created in 0.1719 seconds with 5 queries.