RC controlled Stepper Motors

// Positive for forward, negative for reverse
void drive(int speed_a, int speed_b) {

  // Limit speed between -255 and 255
  speed_a = constrain(speed_a, -500, 500);
  speed_b = constrain(speed_b, -500, 500);



}

You changed the values in the arguments that were passed by value. The caller has no idea that you did that, so you might as well not have done that.

// If we're receiving numbers, convert them to motor PWM

As opposed to elephants or grapefruit?

What the heck else would you be receiving?

  // Convert to PWM value (-255 to 255)
  ch_2 = pulseToPWM(ch_2);

That is NOT what that code does.

Before you try to use data that you do not KNOW is good, the FIRST thing to do is to make sure that it is good. Why are you not doing that?