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.

[参考译文] MSP430FR5949:UART 未正确接收数据

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1180976/msp430fr5949-uart-did-not-receive-data-properly

器件型号:MSP430FR5949

您好!

我使用 UART 协议作为命令和响应方式。 因此 、每当控制器收到命令时、它就只响应。 在早期的配置中,此协议函数是可以的:波特率:9600,位:8,停止位:1,奇偶校验:无。

现在、我尝试对 Baud_rate:115200、 位:8、Stop_bit:1、奇偶校验:None 执行相同的操作。 但 UART 接收缓冲区在首次尝试时未正确获取命令字节。 在第一个试验中、 我在 UART 接收缓冲区中得到了0xff。 当命令第二次到达接收缓冲区时、只有它接收命令字节。  

我不知道 UART 接收器的这种行为。 因此、请帮助我找到解决方案。

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

    您好、Siv、

    这很可能是由不同的波特率引起的问题。 您需要确保控制器和接收器具有相同的波特率;如果您只将其中一个波特率更改为115200、则不会在缓冲区中获得正确的数据。

    最棒的
    Amruta  

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

    是的、发送器和接收器仅保持相同的波特率。 在这里、我的问题是、我可以在第二次尝试执行命令时在控制器中接收数据。 在首次尝试中、控制器 RXBUF 由0xff 填充。  

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

    我会用示波器来检查它。 线路上的干扰模仿起始位将导致这种情况。

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

    那么、如何克服该误差呢? 您能否解释导致此类问题的因素、并帮助我解决此问题。

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

    由于它位于接收端、因此它来自发送数据的任何内容。

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

    您是否在示波器中查看过它? 当您这么做时、您看到了什么?

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

    是的。 我在控制器的接收器端/ RX 引脚上看到了发送器发送的任何数据。 但是在调试模式中、控制器的 RXBUF 中填充了0xff 或一些垃圾字符。 我无法确定 UART 配置中缺少哪些功能。  

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

    您是否正在使用中断?

    您可以共享您的代码吗?

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

    是的、我将 ISR 用于 UART。 我在这里共享我的代码。 请查找附件。

    uint8_t uart_initialize(void)
    {
        P3DIR = 0x01;
        P2SEL1 = 0x03;
        UCA0CTLW0 = 0x0081;
    //    UCA0BRW =  104;                                                              /* 16MHz / 9600 Baud_rate set */
    //    UCA0MCTLW = 0xD621;
        UCA0BRW =  0x0008;                                                              /* 16MHz / 115200 Baud_rate set */
        UCA0MCTLW = 0xF7A1;
        UCA0CTLW0 = 0x0080;
        UCA0IE = 0x0001;
        return 1;
    }
    
    /*
     * This function used to transmit the data Through UART
     */
    uint8_t tx_dat(uint8_t dat)
    {
        while(!(UCA0IFG & UCTXIFG));
        UCA0TXBUF = dat;
    
        return 1;
    }
    
    /*
     * This function used to receive the data Through UART
     */
    uint8_t rx_dat()
    {
        uint8_t rx_data = 0U;
        while(!(UCA0IFG & UCRXIFG));
        rx_data = UCA0RXBUF;
        return (rx_data);
    }
    
    /*
     * This function used as UART Interrupt calling function
     */
    uint8_t uart_interrupt1(void)
    {
        uint8_t dat_buf[250] = {0};
        volatile uint8_t rxd_data1;
        uint16_t  looper_151;
    
        for(looper_151 = 0U; looper_151 < 245; looper_151++)
        {
            rxd_data1 = rx_dat();
            if(rxd_data1 != (uint8_t)'!')
            {
                rxd_data1 &= 0xFF;
                dat_buf[looper_151] = rxd_data1;
            }
            else
            {
                looper_151 = 245U;
            }
        }
        (void)commands(dat_buf);
        return 1;
    }
    
    /*
     * UART Interrupt Service routine
     */
    #pragma vector = USCI_A0_VECTOR
    __interrupt void UART_A0_ISR(void)
    {
        (void)uart_interrupt1();
    }
    

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

    在中断中一次只能读取一个字节、然后返回并等待下一个字节。 查看 Resource Explorer 中的 UART 示例。

    请记住 Herbert Hawkins 中断规则:

    休伯特·霍金斯:我想进去,继续,把它转过来,然后出去。 明白了吗?

    拉文赫斯特:明白了。

    休伯特·霍金斯:好。

     -Hubert Hawkins 的第一条中断规则。 贾斯特法院的 Danny Kaye

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

    是的、将其从循环中取出、每次发生中断时只需读取。