3100|14

28

帖子

0

TA的资源

一粒金砂(中级)

楼主
 
本人学习msp430g2553的UART模块,想发送字符串,但是看到官方历程中发送字符串的程序里只写了发送字符串的第一个字符,经下载验证确实可以发整个字符串,请问这是为什么

最新回复

讲的很详细,我也明白了。谢谢  详情 回复 发表于 2016-10-26 15:44
 
点赞 关注

回复
举报

2781

帖子

417

TA的资源

五彩晶圆(中级)

沙发
 
贴图
 
个人签名
 

回复

28

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
#pragma vector=USCIAB0TX_VECTOR
__interrupt void USCI0TX_ISR(void)
{
  UCA0TXBUF = string1[i++];                 // TX next character

  if (i == sizeof string1)                  // TX over?
    IE2 &= ~UCA0TXIE;                       // Disable USCI_A0 TX interrupt
}

// USCI A0/B0 Receive ISR 接收完一个字符后产生中断
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
  string1[j++] = UCA0RXBUF;
  if (j > sizeof string1 - 1)//包含‘\0’.
  {
    i = 0;
    j = 0;
    IE2 |= UCA0TXIE;                        // Enable USCI_A0 TX interrupt
    UCA0TXBUF = string1[i++];
  }
}
 
 
 

回复

28

帖子

0

TA的资源

一粒金砂(中级)

4
 
char string1[8];
 
 
 

回复

6040

帖子

196

TA的资源

版主

5
 
这个很简单吧,一个i++说明了一切。
另外,他这个是用发送中断发送的,如果发送缓冲区为空,就写一个字符,直到把所有字符全部写完,然后把发送中断关掉。

点评

ymh
但是i++是先发送第一个字符后i移到后一个字符,但是这后一个并没有发出去啊  详情 回复 发表于 2016-5-15 21:36
 
 
 

回复

28

帖子

0

TA的资源

一粒金砂(中级)

6
 
lcofjp 发表于 2016-5-15 19:22
这个很简单吧,一个i++说明了一切。
另外,他这个是用发送中断发送的,如果发送缓冲区为空,就写一个字符 ...

但是i++是先发送第一个字符后i移到后一个字符,但是这后一个并没有发出去啊

点评

每次UCA0TXBUF寄存器被写入后,都会触发USCI0TX_ISR中断。 在USCI0TX_ISR中断中,逐个发送数组中的字符。  详情 回复 发表于 2016-5-15 21:42
ymh
if (j > sizeof string1 - 1)//包含‘\0’. { i = 0; j = 0; IE2 |= UCA0TXIE; // Enable USCI_A0 TX interrupt UCA0TXBUF = string1; } 这个if条件就满足所以  详情 回复 发表于 2016-5-15 21:39
 
 
 

回复

28

帖子

0

TA的资源

一粒金砂(中级)

7
 
ymh 发表于 2016-5-15 21:36
但是i++是先发送第一个字符后i移到后一个字符,但是这后一个并没有发出去啊

if (j > sizeof string1 - 1)//包含‘\0’.
  {
    i = 0;
    j = 0;
    IE2 |= UCA0TXIE;                        // Enable USCI_A0 TX interrupt
    UCA0TXBUF = string1[i++];
  }
这个if条件就满足所以一次,所以也就是string[0]发出去了啊
 
 
 

回复

750

帖子

3

TA的资源

版主

8
 
ymh 发表于 2016-5-15 21:36
但是i++是先发送第一个字符后i移到后一个字符,但是这后一个并没有发出去啊

每次UCA0TXBUF寄存器被写入后,都会触发USCI0TX_ISR中断。
在USCI0TX_ISR中断中,逐个发送数组中的字符。

点评

ymh
if条件只满足一次即,所以也就是只有string[0]写入了UCA0TXBF,下一次虽然指向string[1],但是这时 J 已经在发string[0]时赋0了,也就不满足if的条件了,所以后续字符也就发不了了啊  详情 回复 发表于 2016-5-16 12:12
 
个人签名

要666

 
 

回复

1193

帖子

0

TA的资源

纯净的硅(高级)

9
 
没看到i的声明,猜测i应该是全局的变量吧
UCA0TXBUF = string1[i++];
i是先用再自增,没啥好说的吧,把string1[i]发出去。
下一次进到这里来的时候i已经是下一个数字了。所以发的是下一个字符。

7楼的代码说的是超长时候将ij恢复初始值的情况。与发送没啥关系

点评

ymh
i是全局变量,在第一次是J满足条件进入if语句发送,但进去后J被赋0,下次不满足条件,也就进不了IF语句去发送下一个字符,不知道我说的对不对  详情 回复 发表于 2016-5-16 12:14
 
 
 

回复

28

帖子

0

TA的资源

一粒金砂(中级)

10
 
le062 发表于 2016-5-15 21:42
每次UCA0TXBUF寄存器被写入后,都会触发USCI0TX_ISR中断。
在USCI0TX_ISR中断中,逐个发送数组中的字符 ...

if条件只满足一次即,所以也就是只有string[0]写入了UCA0TXBF,下一次虽然指向string[1],但是这时 J 已经在发string[0]时赋0了,也就不满足if的条件了,所以后续字符也就发不了了啊

点评

拿j当全局变量的程序员直接开除 这程序能跑的。先去明白下什么叫中断把  详情 回复 发表于 2016-5-16 16:06
 
 
 

回复

28

帖子

0

TA的资源

一粒金砂(中级)

11
 
qiushenghua 发表于 2016-5-15 22:00
没看到i的声明,猜测i应该是全局的变量吧
UCA0TXBUF = string1;
i是先用再自增,没啥好说的吧,把string1 ...

i是全局变量,在第一次是J满足条件进入if语句发送,但进去后J被赋0,下次不满足条件,也就进不了IF语句去发送下一个字符,不知道我说的对不对
 
 
 

回复

750

帖子

3

TA的资源

版主

12
 
ymh 发表于 2016-5-16 12:12
if条件只满足一次即,所以也就是只有string[0]写入了UCA0TXBF,下一次虽然指向string[1],但是这时 J 已经 ...

拿j当全局变量的程序员直接开除

这程序能跑的。先去明白下什么叫中断把
 
个人签名

要666

 
 

回复

503

帖子

1

TA的资源

一粒金砂(高级)

13
 
  1. #pragma vector=USCIAB0TX_VECTOR
  2. __interrupt void USCI0TX_ISR(void)
  3. {//每次发送完数据进入此中断函数
  4.   UCA0TXBUF = string1[i++];                 // 发送数据并i++向后移一位,发送完成后再次触发USCI0TX_ISR()

  5.   if (i == sizeof string1)                  // TX over?
  6.     IE2 &= ~UCA0TXIE;                       // Disable USCI_A0 TX interrupt
  7. }

  8. // USCI A0/B0 Receive ISR 接收完一个字符后产生中断
  9. #pragma vector=USCIAB0RX_VECTOR
  10. __interrupt void USCI0RX_ISR(void)
  11. {//每次收到数据进入此中断函数
  12.   string1[j++] = UCA0RXBUF;//读接收寄存器到缓冲区j++向后移
  13.   if (j > sizeof string1 - 1)//包含‘\0’.//缓冲区满
  14.   {
  15.     i = 0;
  16.     j = 0;//缓冲区复位
  17.     IE2 |= UCA0TXIE;                        // Enable USCI_A0 TX interrupt//打开接收完成中断,为执行上面的函数做准备
  18.     UCA0TXBUF = string1[i++];//发送第一个数据,发送完成后触发一次USCI0TX_ISR()发下一个
  19.   }
  20. }
复制代码

点评

ymh
谢谢耐心指导,明白了  详情 回复 发表于 2016-5-17 08:53
 
 
 

回复

28

帖子

0

TA的资源

一粒金砂(中级)

14
 

谢谢耐心指导,明白了
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

15
 
讲的很详细,我也明白了。谢谢
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表