This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR2355:字母'A#39;出现两次???

Guru**** 2538955 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/895496/msp430fr2355-the-letter-a-appears-twice

器件型号:MSP430FR2355

有人能告诉我如何解决以下问题吗:  我生成一个命令,无线电回传命令,然后生成"ACK",但我的代码生成"AACK"。我不确定如何解决这个问题,或者为什么会出现两次 A...如果我尝试在 ISR 外部加载 UCA1TXBUF,它不起作用????

代码:

#include 
#include 
#include 
#include "rc.h"
#include "LPRSnot.h"

volatile char * prx;
char incoming[20];
const char * PTX;
const char * configCmdAck[]={"ER_CMD#A01"、"ER_CMD#W2"、"ER_CMD#B1"};
const char * configCmdAck[]={"t





t = t void t = t t t t;t t t tolean t = t t t t t t = t tack


WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器

IOconfig;
initClockTo16MHz();
inituart();
PRx =传入;
PTX = configCmdAck[0];
while (1)
{
_bis_SR_register (LPM3_bits + GIE);//go to sleep:LPM3
如果(TX){
PTX++;
}
否则{
if (!strncmp (传入、configCmdAck[i]、10))
{
PTX = teback;
i++;
UCA1IFG |= UCTXIFG;
}
prx++;
}
}



#pragma vector=USCI_A1_vector
__interrupt void M (void)
{
switch (__evo_in_range (UCA1IV、USCI_UART_UCTXCPTIFG))
{
USCI_NONE 案例:中断;
USCI_UART_UCRXIFG 案例:
TX = F;
* prx = UCA1RXBUF;
_BIC_SR_REGISTER_ON_EXIT (LPM3_BITS);
中断;
USCI_UART_UCTXIFG 案例:
TX = T;
如果(* PTX!='\0')
UCA1TXBUF =* PTX;
_BIC_SR_REGISTER_ON_EXIT (LPM3_BITS);
中断;
案例 USCI_UART_UCSTTIFG:中断;
案例 USCI_UART_UCTXCPTIFG:break;
}
}

图片:

e2e.ti.com/.../badACK.docx

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果 UART 空闲、并且您启用 TXIE、则可以预期立即连续获得两个 TXIFG。 第一个字节直接进入移位寄存器、第二个字节在第一个字节移出时在 Tx 保持寄存器中停止。 main()不会在这两个中断之间执行。

    您可能应该在加载 TXBUF 后立即在 ISR 中执行 PTX++。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的,我意识到了我的问题,谢谢  我将 IFG 标志移到要处理的最后一行 bcz,它看起来就像我指向'A',中断,将其推出,唤醒,处理 prx++, 然后由于缓冲区是空的、又发生了另一个中断、再次将'A'推出、等等...强化"AACK"。。  

    if (!strncmp (传入、configCmdAck[i]、10))
    {
    PTX = teback;
    i++;
    RedFlag = T;
    }
    prx++;
    if (RedFlag){
    RedFlag = F;
    /*紧急:设置 UCTXIFG 必须是代码的最后一行。 如果之前设置、我们将进入 ISR、拿出并处理下一行代码
    *然后再返回到 ISR、因为 TXBUF 变为空会导致 TXIFG 被置位...这个不幸的事件将会升级一个双字符实例。
    * RedFlag 将提醒我们我们要返回到 ISR 中...因此、准备所有内容、创建 RedFlag、然后在 if 语句末尾使用它来生成 ISR
    *、这样当我们返回时、我们将转到下一行代码(即 LPM3 Sleep)、 TXIFG 将在再次开始时唤醒我们。
    *
    UCA1IFG |= UCTXIFG;
    }