TI中文支持网
TI专业的中文技术问题搜集分享网站

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;
  }
}

Susan Yang:

请问还是之前的那个问题?您是否有参考我之前发送程序?

,

Xu Yuchen:

您好,经过学习,现在的问题是串口接收8字节的数据时,会丢失。正常来讲lengt值应该每次都到8,但是测试时每次都不是,时而4次时而6次,总是无法接收到稳定的全部数据。

,

Susan Yang:

看起来像是之前的传送的字符没有及时取走造成的。

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

e2echina.ti.com/…/107588

,

Xu Yuchen:

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

,

Susan Yang:

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

,

Xu Yuchen:

串口通信完整代码如下,问题主要是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;

}

,

Susan Yang:

该代码似乎“ mDelay(100)”花费很长时间,并认为 接收 已完成。您确定对方会在那段时间发送所有数据吗? 也许通过查看 “ lengt”会更有用,当它达到8时,再考虑完成 接收 。(您也可能会超时)。

,

Xu Yuchen:

目前调试中发现,所有数据就是在我发送”UARTSend0(TVOCSend,9)“指令时返回的,只是通过MSP430的串口接收时,接收到的数据混乱且与实际数据不符。

,

Xu Yuchen:

每次接收完成后,也查看过lengt,lengt经常与本应接收到的字节数不符合,或多或少。怀疑过是传感器的问题,但是使用其他型号的单片机如CC3200测试,传感器是正常的。

,

Susan Yang:

“每次接收完成后,也查看过lengt,lengt经常与本应接收到的字节数不符合,或多或少。”

那是否可以尝试以lengt来作为判断条件?

,

Xu Yuchen:

尝试过,但是使用仿真器看过接收缓冲区里面的数据,是乱的,前面的并不是我需要的传感器返回的正确数据。

赞(0)
未经允许不得转载:TI中文支持网 » MSP430关于UART串口接收多字节数组被覆盖的问题
分享到: 更多 (0)