Я использую STM32F407 с компилятором MikroC. У меня есть код, который, когда я использую функцию, вызывает запись в стеке исключений, но те же строки кода, которые обычно используются, работают нормально.
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();
}
Вероятно, это связано с вложенными функциями. Все еще не совсем уверен, почему это не сработало.