Problems with exiting a loop through an interrupt

Ok, i've got the following Problem:
I have a program which drives a stepper motor (interfaced over serial) and wanted to install a hardware emergency button.

#include <TimedAction.h>
#include <Stepper.h>
#include <NewPing.h>

#define ECHO_PIN     7  // Arduino pin tied to echo pin on the ultrasonic sensor.
#define MAX_DISTANCE 200 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.

NewPing sonar(ECHO_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.
TimedAction timedActionPing = TimedAction(300,pinguS);
TimedAction timedActionTemp = TimedAction(3000,temperature);

// Map our pins to constants to make things easier to keep track of
const int pwmA = 3;
const int pwmB = 11;
const int brakeA = 9;
const int brakeB = 8;
const int dirA = 12;
const int dirB = 13;


// The amount of steps for a full revolution of your motor.
// 360 / stepAngle
const int STEPS = 200;
int tempPin = 3;
float tempC = 20;
float UStoMM = 5.809;
Stepper myStepper(STEPS, dirA, dirB);
volatile boolean hardReset = false;




void setup() 
{ 
  //Initialize pins as OUTPUTS and begin serial connection
  attachInterrupt(0, stopAll, RISING);

  // Set the RPM of the motor
  myStepper.setSpeed(30);

  // Turn on pulse width modulation
  pinMode(pwmA, OUTPUT);
  digitalWrite(pwmA, HIGH);
  pinMode(pwmB, OUTPUT);
  digitalWrite(pwmB, HIGH);

  // Turn off the brakes
  pinMode(brakeA, OUTPUT);
  digitalWrite(brakeA, LOW);
  pinMode(brakeB, OUTPUT);
  digitalWrite(brakeB, LOW);

  // Log some shit
  Serial.begin(9600);

} 
void loop() 
{
  timedActionPing.check();
  timedActionTemp.check();
  breaksOn();
  while (Serial.available() > 0){                           // Serial available? Read it.
    unsigned int cmdData;
    unsigned int thickness;
    unsigned int thicknessO;
    byte cmdByte = readByte();                           // Read command
    timedActionPing.check();

    if (cmdByte >= 'a' && cmdByte <= 'z'){

    }
    switch(cmdByte) {

    case 'g':      
      {
        thickness = Serial.parseInt();
        thicknessO = thickness*20;                        // thicknessO = Schichtstärke x (Schritte/mm)
        myStepper.step(thicknessO);
        breaksOn();
      }   
      break;

    case 'b':      
      {
        thickness = Serial.parseInt();
        thicknessO = thickness*20;                        // thicknessO = Schichtstärke x (Schritte/mm)
        myStepper.step(-thicknessO);
        breaksOn();

      }   
      break;      

    case 'u':                                             // Kontinuierliche Fahrt nach oben

      myStepper.step(10);
      cmdByte = readByte();

      timedActionPing.check();
      timedActionTemp.check();
      if (cmdByte == 's' || hardReset == true) {
        breaksOn();
        break;
      }




    case 'd':                                           // Kontinuierliche Fahrt nach oben
      do {
        myStepper.step(10);
        cmdByte = readByte(); 
        timedActionPing.check();
        timedActionTemp.check();           
      } 
      while (cmdByte != 's');
      breaksOn();
      break;


    }


hardReset = false;
  }
}
byte readByte() {
  byte cmdByte = Serial.read();
  cmdByte |= 0X20;
  return cmdByte;
}


void breaksOn() {
  digitalWrite(dirA, LOW);
  digitalWrite(dirB, LOW);


}  

void temperature() {
  tempC = analogRead(tempPin);           //read the value from the sensor
  tempC = (5.0 * tempC * 100.0)/1024.0;  //convert the analog data to temperature
  Serial.print('T');
  Serial.print(tempC);
  Serial.print(",");
  int c = 331.5 + 0.596 * tempC;
  UStoMM = c*0.0005;

}

void pinguS() {
  unsigned long uS = sonar.ping();
  int mM = (uS * UStoMM);
  Serial.print('P');
  Serial.print(mM);
  Serial.print(",");

}

void stopAll() {
  hardReset = true;
  Serial.print("Red Alert!");

}

The Crucial parts are:

volatile boolean hardReset = false;
...
void setup() {
  attachInterrupt(0, stopAll, RISING);
...
}
....


    case 'u':                                             // Kontinuierliche Fahrt nach oben

      myStepper.step(10);
      cmdByte = readByte();

      timedActionPing.check();
      timedActionTemp.check();
      if (cmdByte == 's' || hardReset == true) {
        breaksOn();
        break;
      }
...
void stopAll() {
  hardReset = true;
  Serial.print("Red Alert!");

}

The break command through sending an 's' over serial works just fine, but i can't figure out why my boolean trigger doesn't work. I get the printed "Red Alert!" on my serial monitor, so hardReset should be true, too, shouldn't it? Maybe you are able to find my mistake. Thanks in advance!
Tried with Ints and Bytes, too. Didn't work either.

Have you tried displaying the value of hardReset in your main loop?

You only check the value of hardReset if you have typed the letter 'u' and then typed one more letter. You reset it after any character is typed.
If it is meant to be an emergency shutdown, I would check for it before the while() loop and only set it to false there when it has been detected as true. E.g.

  if(hardReset) {
    // shutdown code here
    hardReset = false;
  }
  while(...) {
  ...
  }

Pete