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**** 2517160 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/564565/msp430f2418-multiple-data-transmission-through-uart

器件型号:MSP430F2418

您好!

我尝试 通过 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 中断 } }

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,迪卡尔
    首先、如果您只想每5秒发送两个整数、那么为什么要使用 UART 发送中断 ISR。 我认为您不需要在不使用它的情况下轻松发送。

    第二件事、如果您想检查当前程序中发生的确切情况
    然后使用示波器
    1) 1)在第72行将 GPIO 设为高电平(1)、然后再次将其下拉(0)到第84行
    2) 2)在线路97处将另一个 GPIO 设为高电平(1)、然后再次将其下拉(0)到线路104。

    3) 3)观察示波器上不同通道上的两个引脚。
    4) 4)现在观看您的 TX 引脚、使其与两个脉冲相对应。

    尝试得出一些结论、您将得到答案。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Sasuke

    首先感谢您的回复。
    实际上、我的目标不仅仅是每5秒通过 UART 发送一次数据 它是项目的一小部分。 在这种情况下、操作数据将在特定时间通过 UART 发送。

    因此、我需要使用计时器中断或 RTC。 为了简单起见、我使用了计时器中断并每5秒发送一次数据

    那么、实际上发生的是、从计时器中断 ISR 中、我将调用 UART ISR 两次。 但它仅执行一次。 这就是为什么在第1个数字字符(发送第1个数字字符、不是 ISR 的一部分(第75行))被发送后、它不会进入 ISR。 但第二个整数 num2正在正常执行。

    那么、有什么类似的东西:从一个 ISR (示例计时器 ISR)开始、我们可以在一次执行期间调用另一个特定 ISR (示例 UART ISR)一次?? 因为我尝试调用 UART ISR 两次、但它只执行一次。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Dipankar、您好!

                     新年快乐:)  , 请告诉我您有数据吗(两个传感器的数据)? 在进入表示  5秒的 IF 循环计时器 ISR (您在代码中提到)之前要发送的中断   在您的案例中、您所说的是整数6000和3000。

    我说的是、如果我是正确的、那么您就有了

                                        传感器1=  整数6000 (0x1770十六进制)

                                        传感器2=  整数3000 (0x0BB8十六进制)、然后进入计时器 ISR 中的5秒循环

    在5秒的时间经过时、您希望通过 UART 发送它。 (当然、这不是整个应用程序的一部分)。

    我的建议是、为什么您从计时器 ISR 调用两次 UART ISR? 甚至您调用 UART ISR 的原因。

    而不是这样

    您可以将一个数组设置为            Transmit 缓冲区[4]={0x17、0x70、0x0B、0xB8}//要发送的数据

    5秒的 IF 环路中      一个标志设为高电平、假设 send_FLAG = 1;

    在您的中     

                    主()

            {     

             //  您的应用程序代码

              如果(SEND_FLAG)

                 {

                    //发送完整的数组 transmit 缓冲 区{不调用任何 UART ISR }

                    //make send_FLAG = 0

                      }

               }

    如果我错了、请纠正我的问题。

    谢谢

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

    是的、你是对的。 两个传感器数据是第1和第2个传感器。 在实际应用中、该值将随时间而变化、但为了简单起见、我在这里做了两个常量值。

    此外、您所说的过程也在正常工作。 我不是 UART ISR、而是直接将值放置在 TX 缓冲区中、仅在计时器中断中、并将字符串数据上传到 TXBUF 中、直到字符串结束。 发送 num1数据后、我重复同样的数字2数据、它运行得很好...

    感谢这个人的回复