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.

MSP430关于UART串口接收多字节数组被覆盖的问题

Other Parts Discussed in Thread: CC3200

传感器返回的数据是一组8字节的数据,但是我通过中断,只获取到了最后一位字节数据,请问这种情况该如何解决呢?

中断开关用的__enable_interrupt();

#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
{
switch (__even_in_range(UCA0IV,4))
  {
    //Vector 2 - RXIFG
    case 2:
        RxBuf[lengt++]=UCA0RXBUF;
        break;
    default: break;
  }
}

  • 请问还是之前的那个问题?您是否有参考我之前发送程序?
  • 您好,经过学习,现在的问题是串口接收8字节的数据时,会丢失。正常来讲lengt值应该每次都到8,但是测试时每次都不是,时而4次时而6次,总是无法接收到稳定的全部数据。
  • 看起来像是之前的传送的字符没有及时取走造成的。

    请参考下面帖子内的解决方式

    e2echina.ti.com/.../107588
  • 您好,您看我代码的中断函数,就是按照他这位的解决方法写的呀,但是就是会出现问题。所以才求助的,我遇到的问题应该跟他类似,但是解决方法却无效。

  • 若是可以的话,请上传或者私信完整代码,谢谢

  • 串口通信完整代码如下,问题主要是getTVOC()函数及其中断问题:

     

    #include <msp430.h>

    #include "driverlib/MSP430F5xx_6xx/driverlib.h"

    #include <stdint.h>

    #include <stdbool.h>

    #include <string.h>

    #include <stdio.h>

     

    extern int TVOC[9];

     

    int flag = 0;

    char fff[1];

     

    int RxBuf[20];

    static int lengt = 0;

    float TVOC0;

    char TVOC[9];

    uint8_t TVOCSend[9]={0xFF,0x00,0x86,0x00,0x00,0x00,0x00,0x00,0x7A};   //用于查询空气质量传感器的命令

    int TVOCtest[9];   //用于接收空气质量传递过来的数据

     

    int main(void)

    {

       WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT

       UART0_Init();

       UART2_Init();

       while (getTVOC() == false)//让空气质量传感器能够正常地采集数据

       {

           mDelay(1000);

       }

       while(1)

       {

           getTVOC();

           mDelay(1000);

       }

    }

     

    void UART0_Init()

    {

           //P3.4,5 = USCI_A2 TXD/RXD

           GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P3,GPIO_PIN4 + GPIO_PIN5);

     

           //Baudrate = 9600, clock freq = 1.048MHz

           //UCBRx = 109, UCBRFx = 0, UCBRSx = 2, UCOS16 = 0

           USCI_A_UART_initParam param = {0};

           param.selectClockSource = USCI_A_UART_CLOCKSOURCE_SMCLK;

           param.clockPrescalar = 109;

           param.firstModReg = 0;

           param.secondModReg = 2;

           param.parity = USCI_A_UART_NO_PARITY;

           param.msborLsbFirst = USCI_A_UART_LSB_FIRST;

           param.numberofStopBits = USCI_A_UART_ONE_STOP_BIT;

           param.uartMode = USCI_A_UART_MODE;

           param.overSampling = USCI_A_UART_LOW_FREQUENCY_BAUDRATE_GENERATION;

           //param.overSampling = USCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION;

     

           if (STATUS_FAIL == USCI_A_UART_init(USCI_A0_BASE, &param))

           {

               return;

           }

           //Enable UART module for operation

           USCI_A_UART_enable(USCI_A0_BASE);

           //Enable Receive Interrupt

           USCI_A_UART_clearInterrupt(USCI_A0_BASE,USCI_A_UART_RECEIVE_INTERRUPT);

           USCI_A_UART_enableInterrupt(USCI_A0_BASE,USCI_A_UART_RECEIVE_INTERRUPT);

           __enable_interrupt();

    }

     

    #pragma vector=USCI_A0_VECTOR

    __interrupt void USCI_A0_ISR(void)

    {

       switch (__even_in_range(UCA0IV,4))

       {

           //Vector 2 - RXIFG

           case 2:

               //RxBuf[lengt++]=USCI_A_UART_receiveData(USCI_A0_BASE);

               RxBuf[lengt++]=UCA0RXBUF;

               break;

           default: break;

       }

    }

     

    int getTVOC()

    {

       uint8_t check=0;

       for(lengt=0;lengt<9;lengt++)

       {

           RxBuf[lengt] = 0x00;

       }

       lengt = 0;

       UARTSend0(TVOCSend,9);

       mDelay(100);

       lengt = 0;

       if(RxBuf[0] == 0xFF)

       {

           int i;

           for(i=0;i<9;i++)

           {

               TVOCtest[i] = RxBuf[i];

               RxBuf[i] = 0x00;

           }

           if(CheckSum(TVOCtest) == true&&TVOCtest[1] == 0x86)

           {

               TVOC0=((TVOCtest[2]<<8)+TVOCtest[3]);      

               sprintf(TVOC,"%.2f",TVOC0);

               return true;

           }

           else

               return false;

       }

       else

           return false;

    }

  • 该代码似乎“ mDelay(100)”花费很长时间,并认为 接收 已完成。您确定对方会在那段时间发送所有数据吗?

    也许通过查看 “ lengt”会更有用,当它达到8时,再考虑完成 接收 。(您也可能会超时)。

  • 目前调试中发现,所有数据就是在我发送”UARTSend0(TVOCSend,9)“指令时返回的,只是通过MSP430的串口接收时,接收到的数据混乱且与实际数据不符。
  • 每次接收完成后,也查看过lengt,lengt经常与本应接收到的字节数不符合,或多或少。怀疑过是传感器的问题,但是使用其他型号的单片机如CC3200测试,传感器是正常的。
  • “每次接收完成后,也查看过lengt,lengt经常与本应接收到的字节数不符合,或多或少。”

    那是否可以尝试以lengt来作为判断条件?
  • 尝试过,但是使用仿真器看过接收缓冲区里面的数据,是乱的,前面的并不是我需要的传感器返回的正确数据。