使用函数时的异常堆叠条目

时间:2019-04-25 08:02:56

标签: c embedded stm32

我正在使用带有MikroC编译器的STM32F407。我有一些代码,当我在函数中使用该代码时会导致异常堆栈条目,但是通常使用的相同代码行可以正常工作。

char *gridVoltage ;
float convertedVolt;

char gridVoltStr[4][10]= {{'0','0','0','0','0','0'},{'0','0','0','0','0','0'},
{'0','0','0','0','0','0'},
{'0','0','0','0','0','0'}};

void getInverterData(){

        gridVoltage = readMeasurementParamaters(2);
        convertedVolt = rebuildFloatVal(gridVoltage);
        FloatToStr(convertedVolt, gridVoltStr[0]);

}

void main() {


      GPIO_Digital_Output(&GPIOD_BASE, _GPIO_PINMASK_ALL);
      GPIOD_ODR = 0;

      // Configure GPIOC_BASE.2 pins as digital output :
         GPIO_Config(&GPIOC_BASE,  _GPIO_PINMASK_2 ,  _GPIO_CFG_MODE_OUTPUT | _GPIO_CFG_SPEED_MAX | _GPIO_CFG_OTYPE_PP);


      UART1_Init(19200);
      Delay_ms(100);
      UART2_Init_Advanced(19200, _UART_8_BIT_DATA, _UART_NOPARITY, _UART_ONE_STOPBIT, &_GPIO_MODULE_USART2_PD56);
      Delay_ms(100);


      //getInverterData();


      gridVoltage = readMeasurementParamaters(2);
      convertedVolt = rebuildFloatVal(gridVoltage);
      FloatToStr(convertedVolt, gridVoltStr[0]);


      while(1) {
           //  Do stuff
      }

}

readMeasurementParamaters函数仅发送并接收uart数据,然后返回指向该数据的指针。当函数名称被注释掉(如图所示)时,它可以正常工作,但包含函数则不能。该代码将被多次调用,因此我无法继续重写代码。我以前从未见过此问题,也不确定如何解决。有什么想法吗?

谢谢。

编辑1:

因此,我设法使其正常运行。 readMeasurementParamaters()函数为:

char* readMeasurementParamaters(char devAddr){

 float gridVoltage;
 char gridVoltagetxt[15];
 char *rxData;
 int crcOK, crcRx, crcCheck, i;
 char readMeasurementParamsCmd[8] = {0,59,1,32,0,0,0,0};
 readMeasurementParamsCmd[0] = devAddr;

 rxData = requestInverterData(readMeasurementParamsCmd) ;

 crcRx = Crc16(rxData, 0, 6);
 crcCheck = rxData[6]  << 8 | rxData[7] ;

 if(crcRx == crcCheck){
    gridVoltage = rebuildFloatVal(rxData);
    FloatToStr(gridVoltage, gridVoltagetxt);

    UART1_Write_Text("Voltage is:  ");
    for ( i = 0; i < 15; i++ ) {

         UART1_Write(gridVoltagetxt[i]);
         UART1_Write_Text("   ");
    }
    UART1_Write_Text(newline);
    UART1_Write_Text(newline);
 }
 else
    UART1_Write_Text("CRC Error :  ");

 return rxData;

}

我将这段代码放入getInverterData()函数中,并重命名了一些变量以获取以下信息:

void getInverterData(char devAddr){


float gridVoltage;
char gridVoltagetxt[15];
char *rxData;
int crcOK, crcRx, crcCheck, i;
char readMeasurementParamsCmd[8] = {0,59,1,32,0,0,0,0};
readMeasurementParamsCmd[0] = devAddr;

rxData = requestInverterData(readMeasurementParamsCmd) ;

crcRx = Crc16(rxData, 0, 6);
crcCheck = rxData[6]  << 8 | rxData[7] ;

if(crcRx == crcCheck){
    gridVoltage = rebuildFloatVal(rxData);
    FloatToStr(gridVoltage, gridVoltStr[0]);

    UART1_Write_Text("Voltage is:  ");
    for ( i = 0; i < 15; i++ ) {

         UART1_Write(gridVoltagetxt[i]);
         UART1_Write_Text("   ");
    }
    UART1_Write_Text(newline);
    UART1_Write_Text(newline);
}
else
    UART1_Write_Text("CRC Error :  ");  


}
buildInvDataJsonString();

}

它可能取决于嵌套函数。仍然不能完全确定为什么它一开始不起作用。

0 个答案:

没有答案