5198|7

69

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

串口通信 [复制链接]

各位无所不能的大神们,帮我看一下这个串口回显为啥不行。波特率这些都设置好了的,


//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;
  }
}



此帖出自电子竞赛论坛

最新回复

  详情 回复 发表于 2017-3-5 13:09
点赞 关注
个人签名

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

 
 

回复
举报

1059

帖子

1

TA的资源

版主

沙发
 
本帖最后由 qwerghf 于 2017-3-5 11:40 编辑

在低功耗后面加一个while(1);
此帖出自电子竞赛论坛

点评

现在可以 发送接受了,但是为啥我无论发什么,串口回显都是这几个数呢?05 92 00 00 04 80 FE ED  详情 回复 发表于 2017-3-5 11:58
只需要设置了波特率的参考时钟吧我觉得,系统时钟要配置吗?怎么配置呢?  详情 回复 发表于 2017-3-5 11:40
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
qwerghf 发表于 2017-3-5 11:31
你的系统时钟没有配置,配置系统时钟

只需要设置了波特率的参考时钟吧我觉得,系统时钟要配置吗?怎么配置呢?
此帖出自电子竞赛论坛

点评

#include int main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXD ME1 |= UTXE0 + URXE0;  详情 回复 发表于 2017-3-5 11:58
个人签名

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

 
 
 

回复

1059

帖子

1

TA的资源

版主

4
 
本帖最后由 qwerghf 于 2017-3-5 12:00 编辑
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)
}
此帖出自电子竞赛论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(中级)

5
 
qwerghf 发表于 2017-3-5 11:31
在低功耗后面加一个while(1);

现在可以 发送接受了,但是为啥我无论发什么,串口回显都是这几个数呢?05 92 00 00 04 80 FE ED
此帖出自电子竞赛论坛

点评

ACLK为时钟源的串口,跑9600的速度低,误差大,换2400可以  详情 回复 发表于 2017-3-5 12:02
个人签名

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

 
 
 

回复

1059

帖子

1

TA的资源

版主

6
 
HI唐辉 发表于 2017-3-5 11:58
现在可以 发送接受了,但是为啥我无论发什么,串口回显都是这几个数呢?05 92 00 00 04 80 FE ED

ACLK为时钟源的串口,跑9600的速度低,误差大,换2400可以
此帖出自电子竞赛论坛

点评

还是不行,刚才回显完全是偶然,现在我只想实现一个发送完成就亮灯提示,发现还是不行,说明是这个程序数据完全没有发送出去。 #include // 函数使用前声明 void UART_init_port(); void main() { WDTCT  详情 回复 发表于 2017-3-5 14:40
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

7
 
此帖出自电子竞赛论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(中级)

8
 
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

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表