1

I am trying to get the serial monitor to prompt me to input two settings - the PWM level and the Resonance level. I am being prompted to input the PWM level, but before I can input the Resonance level it is set to zero and then I am asked again for the PWM level.

I am using Serial.flush(); inbetween the commands to clear the serial input, but I still cannot input the Resonance level before it is set to zero.

Here is my code:

int PWMPin = 10;       // Pin 10 connects to MOSFET gate on breadboard 
int ResPin = 4;        // Pin for the resonator stage 


void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);   // Define baud rate for console to be 9600
  pinMode(PWMPin, OUTPUT);  
  pinMode(ResPin, OUTPUT);   

}

void loop() {
  // put your main code here, to run repeatedly:

Serial.println("What PWM level do you want to test?");   // Testing only  
 while (Serial.available() == 0) {
     // Wait for user input
  }
  int test_level_PWM = Serial.parseInt();
    analogWrite(PWMPin, test_level_PWM);
    Serial.print("PWM Level: ");
    Serial.println(test_level_PWM);
    
Serial.flush();

Serial.println("What Resonance level do you want to test?");    
 while (Serial.available() == 0) {
     // Wait for user input
  }
  int test_level = Serial.parseInt();
    analogWrite(ResPin, test_level);
    Serial.print("Resonance Level: ");
    Serial.println(test_level);

   delay(1000); 

Here is the serial monitor output. I was able to input the PWM level but the Resonance level was set to zero immediately after and then I was asked to input the PWM level again.

enter image description here

3
  • I would consider restructuring this into a state machine with (something like) "input" and "run" states. I'd also reconsider using parseInt because its default timeout of 1s can lead to unexpected behavior; might just want to handle that manually. Commented Jul 2, 2021 at 13:59
  • 1
    Serial.flush() doesn't do what you think. the line end characters will be still in the RX buffer. flush() waits for TX buffer to be send. arduino.cc/reference/en/language/functions/communication/serial/… Commented Jul 2, 2021 at 15:16
  • in the serial monitor, in place of new line ending, select no line ending. After making this change, your code worked on my system. Commented Nov 14, 2022 at 8:21

1 Answer 1

1

Your line

Serial.flush();

is probably intended to remove additional input after the expected numerical input. But that's not what it's doing. (See @jurai's comment)

Either avoid additional input like NewLine characters, or remove them using something like

while (Serial.available()) {delay(1); Serial.read();}

( The delay(1); takes care of slowly coming in serial data at 9600 Baud )

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.