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.

[参考译文] MSP430F133:通过蓝牙接收字符串、字符串存储和传输。

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1353323/msp430f133-receiving-strings-via-bluetooth-storage-of-strings-and-transmission

器件型号:MSP430F133

大家好、我正在使用适用于 MSP430fr133的 code composer、我已通过 HC-05蓝牙模块将外部应用的蓝牙信号成功发送到 MSP430的 RX 引脚、 我已经在中断中设置了一个 if 语句、以便在接收并存储此数据时点亮 LED。 目前、该字符串正在存储在 MSP 上的 RXBuffer 中、然后该代码中的另一个函数通过 TXBuffer 传输存储在 RXBuffer 中的数据、TXBuffer 将通过 TX 引脚从 MSP430fr133传输数据。 但是、我的问题是发送到 MSP 的数据与正在传输的数据不同(我检查了所有匹配的波特率)。 数据似乎在缓冲区中失真。 非常感谢您在这方面提供任何帮助、如果需要、我可以提供我的代码。

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

    我认为您需要提供代码。

    "你在担心什么?" 垃圾? 或者它在某种程度上似乎有意义吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    #包含
    #include "hal_lcd.h"
    #define buffer_size 128
    char rxBuffer[buffer_size];
    unsigned int rxIndex = 0;
    void initGPIO (void){
      P4DIR |= BIT0;//将 P4.0设置为输出方向以驱动 LED
      P4OUT &=~BIT0;//最初关闭 LED
    void initUART (void){
      PM5CTL0 &=~Ω LOCKLPM5;//禁用 GPIO 高阻抗模式
      //针对 UART 功能配置引脚
      P1SEL0 |= BIT0 | BIT1;//根据您的 MSP430型号进行调整
      UCA0CTLW0 |= UCSWRST;//将 eUSCI 置于复位状态
      UCA0CTLW0 |= UCSSEL_SMCLK;//使用 SMCLK 作为时钟源
      //将波特率配置为9600
      UCA0BR0 = 6;
      UCA0BR1=0;
      UCA0MCTLW = UCOS16| UCBRF_8| 0x20;
      UCA0CTLW0 &=μ~UCSWRST;//初始化 eUSCI
      UCA0IE |= UCRXIE;//启用 USCI_A0 RX 中断
    void flashLED (void){
      P4OUT |= BIT0;//打开 LED
      __delay_cycles (1000000);//等待一小段时间
      P4OUT &=~BIT0;//关闭 LED
    //传输数据的功能
    void translString (字符*字符串){
      无符号 int i = 0;
      while (string[i]!='\0'){//发送直至空终结符
        while (! (UCA0IFG & UCTXIFG));//等待 TX 缓冲区准备就绪
        UCA0TXBUF =字符串[I++];
      }
    void initSystem (void){
      WDTCTL = WDTPW | WDTHOLD;
      PM5CTL0 &=~μ A LOCKLPM5;
      inituart();
      init_lcd();
    空 LCDDisplayScrollText(){
      char *testMsg ="收到的数据";
      displayScrollText (testMsg);
    #pragma vector=USCI_A0_vector
    __interrupt void USCI_A0_ISR (void){
      开关(__even_in_range (UCA0IV、USCI_UART_UCTXCPTIFG){
        USCI_NONE:中止;
        案例 USCI_UART_UCRXIFG:
          char receivedChar = UCA0RXBUF;
          如果(receivedChar ="\n'){        
            闪存 LED ();
            LCDDisplayScrollText();
            translString (rxBuffer);     
            rxIndex = 0;
            __delay_cycles (2000000);//等待短时间
          } else if (rxIndex < buffer_size -1 ){
            rxBuffer[rxIndex++]= receivedChar;
          }
          中断;
        默认值:中断;
      }
    int main (void){
      WDTCTL = WDTPW | WDTHOLD;
      initSystem();
      initGPIO();
      __ bis_SR_register (GIE);
      while (1){
      }
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请使用插入代码功能。

    在发送 RXBuffer 进行传输之前、您不会禁止它。 我倾向于在每个接收到的字符后添加微元、以便它始终被微元终止。

    在中断中等待这么长的时间也是一种糟糕的形式。

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

    在每个接收到的字符之后添加 null 是否仍允许字符串作为一个来传输?  

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

    这个想法是,你把每一个字符作为字符串的结尾,并添加一个微元。 当下一个字符出现时、您可以用新字符覆盖该微元、然后添加另一个字符。

    在您的情况下、您也可以在获得"\n"时添加微元。

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

     char receivedChar = UCA0RXBUF;
                if (receivedChar == '\n') {
                    rxBuffer[rxIndex] = '\0'; // Null-terminate the string
                    flashLED(); // Visual indication of data reception
                    LCDDisplayScrollText(); // Display "DATA RECEIVED" on LCD
                    transmitString(rxBuffer); // Transmit the received string back
                    rxIndex = 0; // Reset index for next string

    这是否是添加空终结器的适当方法?

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

    好的。 注意,字符串中没有"\n"。

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

    不幸的是、此问题仍然存在、"\n"是通过蓝牙发送的字符串的一部分、因此应存储之前的所有内容、但传输的数据仍然不正确。

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

    例如、如果向 XI 或 RJ 发送"Hi"、则输出的文本会前后一致、但有时会进一步关闭。

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

    #include <msp430.h>
    
    #define BUFFER_SIZE 256
    
    char RXData[BUFFER_SIZE];
    int rxIndex = 0;
    
    void Init_Clock(void) {
        __bis_SR_register(SCG0);
        CSCTL3 |= SELREF__REFOCLK;
        CSCTL0 = 0;
        CSCTL1 &= ~(DCORSEL_7);
        CSCTL1 |= DCORSEL_3;
        CSCTL2 = FLLD_0 + 243;
        __delay_cycles(3);
        __bic_SR_register(SCG0);
        while (CSCTL7 & (FLLUNLOCK0 | FLLUNLOCK1));
        CSCTL4 = SELMS__DCOCLKDIV | SELA__REFOCLK;
    }
    
    void Init_UART(void) {
        P1SEL0 |= BIT0 | BIT1;
    
        UCA0CTLW0 |= UCSWRST;
        UCA0CTLW0 |= UCSSEL__SMCLK;
    
        UCA0BR0 = 52;
        UCA0BR1 = 0;
        UCA0MCTLW = 0x4900 | UCOS16 | UCBRF_1;
        UCA0CTLW0 &= ~UCSWRST;
        UCA0IE |= UCRXIE;
    }
    
    void transmitString(void) {
        int i;
        for (i = 0; i < rxIndex; i++) {
            while (!(UCA0IFG & UCTXIFG));
            UCA0TXBUF = RXData[i];
        }
        rxIndex = 0;
        RXData[rxIndex] = '\0';
    }
    
    void main(void) {
        WDTCTL = WDTPW | WDTHOLD;
        Init_Clock();
        PM5CTL0 &= ~LOCKLPM5;
        Init_UART();
    
        __bis_SR_register(GIE);
    
        while (1) {
            __no_operation(); // Placeholder for background tasks.
        }
    }
    
    #pragma vector=USCI_A0_VECTOR
    __interrupt void USCI_A0_ISR(void) {
        switch (__even_in_range(UCA0IV, USCI_UART_UCTXCPTIFG)) {
            case USCI_NONE: break;
            case USCI_UART_UCRXIFG:
                if (rxIndex < BUFFER_SIZE - 1) {
                    char receivedChar = UCA0RXBUF;
                    if (UCA0STATW & UCRXERR) {
                        UCA0STATW &= ~(UCFE | UCOE | UCPE | UCBRK); // Clear errors
                        rxIndex = 0; // Reset the buffer
                        RXData[rxIndex] = '\0';
                    } else {
                        RXData[rxIndex++] = receivedChar;
                        RXData[rxIndex] = '\0';
    
                        if (receivedChar == '\n') {
                            transmitString(); // This assumes transmission is correct
                            rxIndex = 0;
                            RXData[rxIndex] = '\0';
                        }
                    }
                } else {
                    transmitString(); // Buffer full, transmit what we have
                    rxIndex = 0;
                    RXData[rxIndex] = '\0'; // Reset the buffer
                }
                break;
            case USCI_UART_UCTXIFG: break;
            case USCI_UART_UCSTTIFG: break;
            case USCI_UART_UCTXCPTIFG: break;
            default: break;
        }
    }

    已经试用了新的 UART 配置和实现的一个时钟功能、改进了数据的传输、但输出数据不正确的问题仍然存在。 非常感谢您提供任何帮助。   

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

    将一个具有中断传输函数的调试器和一个 示波器放在串行线上、以查看您发送的内容是否就是结果的时间。

    可能您的接收器在字节之间需要更多的时间。

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

     我已上传了发送消息 HI 时的缓冲区图像、因为您可以看到还在发送一些不需要的数据。

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

    您好、 

    您是否尝试过使用逻辑分析仪来观察硬件上的 Rx?

    此致、

    赫利克

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

    因为我们不知道缓冲区中有什么*前*"嗨"被发送,我们不能从这告诉太多。 您应该确保用诸如0xDEADBEEF 之类的内容填充缓冲区、以确保您看到的内容是您的程序放入缓冲区中的内容、而不是缓冲区中的无用内容开始。

    现在可能需要在串行线上放置一个示波器、以便查看模块是否发送了任何其他内容。

    您还可以尝试示例中的基本 Echo 程序。

    串行通信有一个很好的教程:

    http://www.simplyembedded.org/tutorials/msp430-uart/