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.

[参考译文] MSP430F2418:通过 UART 发送多个传感器数据时出现问题

Guru**** 2553450 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/564567/msp430f2418-problem-in-sending-multiple-senor-data-via-uart

器件型号:MSP430F2418

您好!

我尝试通过 UART 接口从 MSP430发送多个传感器数据(假设为整数值)。 我使用"Tera term"查看数据。

通过 UART 重复发送一个感应数据(在特定的时间间隔、使用计时器中断)时、没有问题。 但是、在一个接一个地发送多个传感器数据时、它无法正确发送。

重要的部分是计时器 ISR 和 UART ISR。 如您所见、将每隔~0.5秒调用计时器 ISR、每隔5秒(0.5 x 10)执行一次"IF"语句。

我在 UART 终端上的观察结果:不是获得  60003000 //----- 5秒间隙--- // 60003000 //---

                           我正在获得       63000 //--- 5秒间隙--- //63000 //---

因此、仅发送第1个字符、然后发送整个第2个字符、然后重复此步骤。

那么、有人能告诉我、为了获得60003000、需要在计时器 ISR 和 UART ISR 中修改哪些内容。 提前感谢、新年快乐!

 

//********* 我的代码 //

#include 

char string[16];

unsigned int j; //Counter

//为简单起见,假设 num1和 num2为两个 senor 值

unsigned int num1 = 6000;
unsigned int num2 = 3000;

unsigned int timerIsrCount = 0;


/*
*函数,用于将整数转换为字符串格式
,*因此,可以通过 UART 传输*/


void ToString (char string[],int num)
{---
//为简单起见,我删除
了此}


int main()
{
WDTCTL = WDTPW + WDTHOLD; //停止 WDT

//
*晶体和频率的初始化
*/

------------ //为简单起见,我删除了这个

//
* TIMERA0初始化
*/

------------------ //为简单起见,我删除了此

//
* UART0通信初始化
*/
P3SEL = 0x30; // P3.4、5 = USCI_A0 TXD/RXD
UCA0CTL1 |= UCSSEL_2; // SMCLK
UCA0BR0 = 8; // 1MHz 115200
UCA0BR1 = 0; // 1MHz 115200
UCA0MCTL = UCBRS2 + UCBRS0; //调制 UCBRSx = 5
UCA0CTL1 &=~UCSWRST; //初始化 USCI 状态机




while (1)
{
_bis_SR_register (LPM0_bits + GIE); // LPM0
}
}


/*
TIMERA0 ISR //每~0.5秒执行一次此 ISR
*/

#pragma vector=TIMERRA0_vector
__interrupt void Timer_A (void)
{
timerIsrCount += 1;

if (timerIsrCount == 10)//每0.5x10 = 5秒执行一次操作。
{

//转换和发送数字1

ToString (string、num1); //此函数在 int 到字符串转换后返回值。
//转换后的数据存储在字符数组中,名为"string"

j = 0;
UC0IE |= UCA0TXIE;//启用 USCI_A0 TX 中断
UCA0TXBUF = string[j++];//发送第一个字符


//转换和发送数字2

ToString (string、num2);

j = 0;
UC0IE |= UCA0TXIE;//启用 USCI_A0 TX 中断
UCA0TXBUF = string[j+];//发送第一个字符

timerIsrCount = 0; //准备下次执行
}

其他 //否则不执行任何操作
{
}
}



//
* UART ISR
*/

#pragma vector=USCIAB0TX_vector
__interrupt void USCI0TX_ISR (void)

{
while (!(IFG2 & UCA0TXIFG)); // USCI_A0 TX 缓冲器就绪?
{
UCA0TXBUF = string[j++]; // TX 下一个字符
if (j =sizeof string - 1) // TX 结束?
{
UC0IE &=~UCA0TXIE; //禁用 USCI_A0 TX 中断
}
}

 

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

    在 Timer_A ISR 内部、您要将 num2转换为字符串(因此覆盖 num1)、然后确保 USCI0TX ISR 已发送所有 num1字符串。 您应该有一个 while 循环、该循环检查标志、并且在确保已发出所有第1个数字之前不会再次调用 ToString 函数。

    此致、
    Ryan