您好!
我尝试 通过 UART 接口从 MSP430发送多个传感器数据(假设为整数值)。 我使用"Tera term"查看数据。
通过 UART 重复发送一个感应数据(在特定的时间间隔、使用计时器中断)时、没有问题。 但是、在一个接一个地发送多个传感器数据时、它无法正确发送。
重要的部分是计时器 ISR 和 UART ISR。 如您所见、将每隔~0.5秒调用计时器 ISR、每隔5秒(0.5 x 10)执行一次"IF"语句。
我对 UART 终端的观察结果: 而不是获取 60003000 //--- 5秒间隙--- // 60003000 ///--- 5秒间隔--- // 60003000 --
我正在获得 63000 //--- 5秒间隙--- //63000 //--- 5秒间隙--- ---- //6300----
因此、仅发送第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 中断 } }