我正在使用带有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();
}
它可能取决于嵌套函数。仍然不能完全确定为什么它一开始不起作用。