请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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 中断
}
}