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.

[参考译文] CCS/MSP430F5342:多字节接收 UART 问题

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/603473/ccs-msp430f5342-multiple-bytes-reception-uart-problem

器件型号:MSP430F5342

工具/软件:Code Composer Studio

您好!

我将以下代码用于 UART。  我正在尝试从 PC 上的终端向 MSP430F5342的 P4.5发送4个字节的数据。 它从 MSP430的 P4.4发回终端。 下面的代码用于回送。 我在终端上仅接收2个字节(仅限第一个字节和最后一个字节)。


#include
unsigned char 字节 count=0;
unsigned char received_value=0;
int main (空)

WDTCTL = WDTPW + WDTHOLD;//停止 WDT

P4SEL |= BIT4+BIT4;// P4.4、5
UCA1CTL1 |= UCSWRST;//**将状态机置于复位状态**
UCA1CTL1 |= UCSSEL_2;// SMCLK
UCA1BR0 = 9;// 1MHz 115200 (请参阅用户指南)
UCA1BR1 = 0;// 1MHz 115200
UCA1MCTL |= UCBRS_1 + UCBRF_0;//调制 UCBRSx=1、UCBRFx=0
UCA1CTL1 &=~UCSWRST;//**初始化 USCI 状态机**
UCA1IE |= UCRXIE;//启用 USCI_A0 RX 中断

_bis_SR_register (GIE);//输入 LPM0、中断被启用
//__no_operation();//用于调试器


// P3.3、4 = USCI_A0 TXD/RXD
while (1);

#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector=USCI_A1_vector
_interrupt void USCI_A1_ISR (void)
#Elif defined (_GNU_)
void __attribute__((中断(USCI_A1_vector)) USCI_A1_ISR (void)
其他
错误编译器不受支持!
#endif

volatile unsigned int i;

switch (__evo_in_range (UCA1IV、4))

情况0:中断;//向量0 -无中断
情况2://向量2 - RXIFG
while (!(UCA1IFG&UCTXIFG));// USCI_A0 RX 缓冲器准备就绪?
//发送下一个值
Received_value=UCA1RXBUF;
字节 count++;
UCA1TXBUF=Received_value;

中断;
情况4:中断;//向量4 - TXIFG
默认值:break;

例如:当我发送0x01 0x02 0x03 0x04时、我在终端上仅接收0x01和0x04

如果我只发送0x01和0x02、我将正确接收它们。

无论 数据长度如何、每次发送数据时、ISR 中出现的计数"bytescount"都只会增加两倍。 我尝试发送2 3 4 5个字节。 无论终端发送的字节数是多少、我每次仅接收第一个和最后一个字节、并且只输入两次 ISR。 应为接收到的每个字节输入接收 ISR、但不会这样做。 请建议更正。

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

    您很可能在 ISR 中花费过多时间、因此在准备返回第一个字节时、会丢失所有"中间"字节。 您可以通过发送几个字节(10+)或者只将 while (!(UCA1IFG&UCTXIFG));& UCA1TXBUF = UCA1RXBUF;输入到 ISR 中来部分测试这个理论。 您应该在 ISR 中花费尽可能少的时间、提高 MCLK 速度和/或降低波特率。

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

    谢谢 Ryan。

    哎呀。 我在 ISR 中启用了断点、并将其"断点属性"设置为"刷新所有窗口"。 刷新所有窗口可能需要更多时间。我删除了断点、代码正常工作。 因为没有提前尝试过这种方法而冒昧地说自己在浪费时间。 我现在必须研究 JTAG 速度。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    断点会暂停 MCU 操作、而 PC 会继续发送数据、因为只有一个 RX 缓冲区可用于存储传入字节、因此在您从第一个字节处理断点时、会覆盖中间数据。 继续操作后、下一个断点处理存储在 RX 缓冲区中的最后一个字节、导致您错过其余字节。 您需要将结果存储在数组中、并且仅在数组已充分填充后设置断点。

    此致、
    Ryan