Dear support team,
I am programming a FRDM-MCXN947 dev board using MCUXpresso VS code extension. I need a way to look for any input from the serial monitor in a non blocking way. Looking through the drivers I was unable to find this and I was unsuccessful in implementing this myself.
Below you find my main.c to give a better idea of what I need to implement. Whenever there is input from a python GUI that communicates with the microcontroller I need to read the parameter and then restart the ADC and DAC with these parameters. Now I check for the parameters once and that works. I now need a now blocking way to check for new parameters.
If someone could tell me if there is a driver I am completely missing or help me implement this it would be much appreciated.
Thank you in advance
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "global.h"
#include "DAC_files/DAC_micro_hot_plate.h"
#include "board.h"
#include "fsl_debug_console.h"
#include "source/drivers/pin_mux.h"
#include "source/ADC_files/adc_16_strip.h"
// Handler for the SysTick interrupt
void SysTick_Handler(void) {
// Increment the timestamp
g_timestamp_ms++;
}
// Function to parse the input string and update parameters
int updateParameters(char* input) {
char* token;
// Parse waveType
token = strtok(input, ",");
if (token != NULL) {
waveType = atoi(token);
PRINTF("waveType: %d\n", waveType);
} else {
PRINTF("Error parsing waveType\n");
return -1;
}
// Parse dutyCycle
token = strtok(NULL, ",");
if (token != NULL) {
dutyCycle = atoi(token);
PRINTF("dutyCycle: %d\n", dutyCycle);
} else {
PRINTF("Error parsing dutyCycle\n");
return -1;
}
// Parse desiredFrequency
token = strtok(NULL, ",");
if (token != NULL) {
desiredFrequency = atof(token);
PRINTF("desiredFrequency: %f\n", desiredFrequency);
} else {
PRINTF("Error parsing desiredFrequency\n");
return -1;
}
// Parse desiredAmplitude
token = strtok(NULL, ",");
if (token != NULL) {
desiredAmplitude = atof(token);
PRINTF("desiredAmplitude: %f\n", desiredAmplitude);
} else {
PRINTF("Error parsing desiredAmplitude\n");
return -1;
}
// Parse excitationVoltagePerStrip
token = strtok(NULL, ",");
if (token != NULL) {
excitationVoltagePerStrip = atof(token);
PRINTF("excitationVoltagePerStrip: %f\n", excitationVoltagePerStrip);
} else {
PRINTF("Error parsing excitationVoltagePerStrip\n");
return -1;
}
// Parse mux_freq
token = strtok(NULL, ",");
if (token != NULL) {
mux_freq = atoi(token);
PRINTF("mux_freq: %d\n", mux_freq);
} else {
PRINTF("Error parsing mux_freq\n");
return -1;
}
return 0; // Success
}
int initialize_dac_hot_plate(void) {
// Initialize the DAC
Dac_and_other_setup();
// Proceed with DAC setup and wave generation only after receiving parameters
g_Dac14ValueArraySize = (uint32_t)(SAMPLE_RATE / desiredFrequency);
if (g_Dac14ValueArraySize > MAX_ARRAY_SIZE) {
g_Dac14ValueArraySize = MAX_ARRAY_SIZE;
}
if (desiredFrequency < LOWEST_FREQ_POSSIBLE) {
PRINTF("Desired frequency is too low, please enter a frequency above 0.002Hz\n");
return -1;
}
switch (waveType) {
case 0:
generateSineWave(g_Dac14Values, g_Dac14ValueArraySize);
break;
case 1:
generateSquareWave(g_Dac14Values, g_Dac14ValueArraySize);
break;
case 2:
generateTriangleWave(g_Dac14Values, g_Dac14ValueArraySize);
break;
default:
PRINTF("Invalid wave type\n");
return -1;
}
// Initialize the timer
SetupTimer();
return 0; // Success
}
int initialize_voltage_adc(void) {
// Initialize the ADC
ADC_Initialize();
ADC_timer_setup(mux_freq);
return 0; // Success
}
int main(void) {
char buffer[256] = {0};
int index = 0;
char ch;
int paramsReceived = 0;
BOARD_InitPins();
BOARD_InitBootClocks();
BOARD_InitDebugConsole();
// Dac_and_other_setup();
// ADC_Initialize();
// Configure Systick for 1ms for the timestamps
SysTick_Config(SystemCoreClock / 1000U);
// Enable interrupt and set priority for systick interrupt
NVIC_SetPriority(SysTick_IRQn, 1U);
PRINTF("Waiting for parameters...\n");
while (!paramsReceived) {
ch = GETCHAR(); // Wait and read a character from UART
buffer[index++] = ch; // Store the received character in the buffer
if (ch == '\n' || ch == '\r') {
buffer[index] = '\0'; // Null-terminate the string
PRINTF("Received string: %s\n", buffer); // Print the received string for debugging
if (updateParameters(buffer) == 0) {
PRINTF("Parameters received and set.\n");
paramsReceived = 1;
} else {
PRINTF("Error receiving parameters. Please resend.\n");
}
index = 0;
buffer[0] = '\0';
}
}
// Initialize the DAC and timer
if (initialize_dac_hot_plate() != 0) {
PRINTF("Failed to initialize DAC and hot plate\n");
// Handle error
}
// Initialize the ADC and timer
if (initialize_voltage_adc() != 0) {
PRINTF("Failed to initialize ADC and timer\n");
// Handle error
}
// Start the ADC timer
// ADC_timer_setup(mux_freq);
while (1) {
// Main loop - could be used for further processing
//print the array containing adc values to the console
for (int i = 0; i < g_strip_count; i++) {
PRINTF("Strip %d: %d\n", g_strip_values[i][0], g_strip_values[i][1]);
}
}
return 0;
}