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, ¶m))
{
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:
尝试过,但是使用仿真器看过接收缓冲区里面的数据,是乱的,前面的并不是我需要的传感器返回的正确数据。