[求助] 串口通信

HI唐辉   2017-3-5 11:18 楼主
各位无所不能的大神们,帮我看一下这个串口回显为啥不行。波特率这些都设置好了的,


//9600  低频模式
#include
//  函数使用前声明
void UART_init_port();
void main()
{
        WDTCTL = WDTPW + WDTHOLD;
        P3SEL |= BIT3 +BIT4;   //P3.3----->  TX          P3.4 ---->RX
        UART_init_port();
        _bis_SR_register(LPM3_bits+GIE);
}


  //函数名:UART_init_port
  //函数功能:Baud = 9600,低频波特率模式
  //函数说明:Baud参考时钟选择,Baud设置,调制器设置
  //入口参数:无
  //出口参数:无
// 注意例程:Baud = 9600,过采样波特率产生模式

void UART_init_port(void)
   {
   UCA0CTL1 |= UCSWRST;//复位寄存器,使得配置UCSI
   UCA0CTL1 |= UCSSEL__ACLK;
   UCA0BR0 =3;
  UCA0BR1=0;
   UCA0MCTL = UCBRS_3 + UCBRF_0;
   UCA0CTL1 &= ~UCSWRST;
   UCA0IE |= UCRXIE;//接收中断使能
   }

  //函数名:
// 函数功能:
// 函数说明:UCTXIFG:在USCI发送完成,自动置位。表示UCAxTXBUF已经准备好接收下一个字符
  //   在将字符写入UCAxTXBUF中,UCTXIFG自动复位
     //                   UCRXIFG:在每接收到一个字符并将其载入UCAxRXBUF时,将置位
    // 当读取UCAxRXBUF中的值时,UCRXIFG自动复位

     //                        当UCAxTXBUF为空时:UCTXIFG置位
     //                      当UCAxTXBUF已经接收到一个完整的字符时:UCRXIFG置位




#pragma vector=UCSI_A0_VECTOR
interrupt void UCSI_A0_ISR(void)
{
switch(even_in_range(UCA0IV,4))
  {
case 0:                                   //无中断;
        break;
case 2:                                   //接收中断
        while(!(UCA0IFG&UCTXIFG));          //UCAxTXBUF是否为空,不为空执行死循环,
        //                                                                                           直至为空(发送完成)
//        UCA0RXBUF ----->  UCA0TXBUF;    发送过程的伪代码
UCA0TXBUF = UCA0RXBUF;   //串口回显
        break ;
case 4:                                  //发送中断
        break;
default:
        break;
  }
}

QQ图片20170305112333.png

More information,please add the weibo ID :_Tang辉,chat number :951141617

回复评论 (7)

在低功耗后面加一个while(1); 本帖最后由 qwerghf 于 2017-3-5 11:40 编辑
点赞  2017-3-5 11:31
引用: qwerghf 发表于 2017-3-5 11:31
你的系统时钟没有配置,配置系统时钟

只需要设置了波特率的参考时钟吧我觉得,系统时钟要配置吗?怎么配置呢?
More information,please add the weibo ID :_Tang辉,chat number :951141617
点赞  2017-3-5 11:40
引用: HI唐辉 发表于 2017-3-5 11:40 只需要设置了波特率的参考时钟吧我觉得,系统时钟要配置吗?怎么配置呢?
参考这个程序 #include int main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXD ME1 |= UTXE0 + URXE0; // Enable USART0 TXD/RXD UCTL0 |= CHAR; // 8-bit character UTCTL0 |= SSEL0; // UCLK = ACLK UBR00 = 0x0D; // 32k/2400 - 13.65 UBR10 = 0x00; // UMCTL0 = 0x6B; // Modulation UCTL0 &= ~SWRST; // Initialize USART state machine IE1 |= URXIE0; // Enable USART0 RX interrupt // Mainloop for (;;) { __bis_SR_register(LPM3_bits + GIE); // Enter LPM3 w/interrupt while (!(IFG1 & UTXIFG0)); // USART0 TX buffer ready? TXBUF0 = RXBUF0; // RXBUF0 to TXBUF0 } } // UART0 RX ISR will for exit from LPM3 in Mainloop #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__) #pragma vector=USART0RX_VECTOR __interrupt void usart0_rx (void) #elif defined(__GNUC__) void __attribute__ ((interrupt(USART0RX_VECTOR))) usart0_rx (void) #else #error Compiler not supported! #endif { __bic_SR_register_on_exit(LPM3_bits); // Clear LPM3 bits from 0(SR) } 本帖最后由 qwerghf 于 2017-3-5 12:00 编辑
点赞  2017-3-5 11:58
引用: qwerghf 发表于 2017-3-5 11:31
在低功耗后面加一个while(1);

现在可以 发送接受了,但是为啥我无论发什么,串口回显都是这几个数呢?05 92 00 00 04 80 FE ED
More information,please add the weibo ID :_Tang辉,chat number :951141617
点赞  2017-3-5 11:58
引用: HI唐辉 发表于 2017-3-5 11:58
现在可以 发送接受了,但是为啥我无论发什么,串口回显都是这几个数呢?05 92 00 00 04 80 FE ED

ACLK为时钟源的串口,跑9600的速度低,误差大,换2400可以
点赞  2017-3-5 12:02
点赞  2017-3-5 13:09
引用: qwerghf 发表于 2017-3-5 12:02
ACLK为时钟源的串口,跑9600的速度低,误差大,换2400可以

还是不行,刚才回显完全是偶然,现在我只想实现一个发送完成就亮灯提示,发现还是不行,说明是这个程序数据完全没有发送出去。


#include
//  函数使用前声明
void UART_init_port();
void main()
{
        WDTCTL = WDTPW + WDTHOLD;
        P3SEL |= BIT3 +BIT4;   //P3.3----->  TX          P3.4 ---->RX
P1DIR |= BIT0;
P4DIR |= BIT7;
        UART_init_port();
        _bis_SR_register(GIE);
          while(1);
}


  //函数名:UART_init_port
  //函数功能:Baud = 9600,低频波特率模式
  //函数说明:Baud参考时钟选择,Baud设置,调制器设置
  //入口参数:无
  //出口参数:无
// 注意例程:Baud = 9600,过采样波特率产生模式

void UART_init_port(void)
   {
   UCA0CTL1 |= UCSWRST;//复位寄存器,使得配置UCSI
   UCA0CTL1 |= UCSSEL_1;
   UCA0BR0 =3;
  UCA0BR1=0;
   UCA0MCTL = UCBRS_3 + UCBRF_0;
   UCA0CTL1 &= ~UCSWRST;
   UCA0IE |= UCRXIE;//接收中断使能
   }

  //函数名:
// 函数功能:
// 函数说明:UCTXIFG:在USCI发送完成,自动置位。表示UCAxTXBUF已经准备好接收下一个字符
  //   在将字符写入UCAxTXBUF中,UCTXIFG自动复位
     //                   UCRXIFG:在每接收到一个字符并将其载入UCAxRXBUF时,将置位
    // 当读取UCAxRXBUF中的值时,UCRXIFG自动复位

     //                        当UCAxTXBUF为空时:UCTXIFG置位
     //                      当UCAxTXBUF已经接收到一个完整的字符时:UCRXIFG置位




#pragma vector=UCSI_A0_VECTOR
interrupt void UCSI_A0_ISR(void)
{
switch(even_in_range(UCA0IV,4))
  {
case 0:                                   //无中断;
        break;
case 2:                                   //接收中断
//{
                while(!(UCA0IFG&UCTXIFG));          //UCAxTXBUF是否为空,不为空执行死循环,
        //                                                                                           直至为空(发送完成)
//        UCA0RXBUF ----->  UCA0TXBUF;    发送过程的伪代码

//UCA0TXBUF = UCA0RXBUF;   //串口回显
//if(UCA0RXBUF==0x31)
P1OUT ^= BIT0;
P4OUT ^=BIT7;
//}
        break ;
case 4:                                  //发送中断
        break;
default:
        break;
  }
}

More information,please add the weibo ID :_Tang辉,chat number :951141617
点赞  2017-3-5 14:40
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复