I would connect the shield TX and RX to the PC's serial port directly and then manually issue the commands and see the responses. As the responses will illuminate your problem and solution. This can be done simply by a few jumps on the Arduino
- jump RST to GND
- jump 0 to 2 and 1 to 3. ( i might have that backwards 0 to 3 and 1 to 2.)
The RST shuts down the ATmega328 and the others jump the TX/RX to between the Cell device and the bases FTDI chip to the PC's USB serial port.
If you use Arduino's IDE serial monitor, take note to set the LineFeed correctly.
You are trying to use Three devices:
- SoftwareSerial cell(2,3);
- SoftwareSerial uart_gps(0,1);
- Serial.Print
Where you are only actually using 2 pairs of Tx and Rx pins, not 3 pair. Note that the Serial Class is already defined by the Arduino Core to use the Hardware UART on pins 0 and 1. But yet you are defining a SoftwareSerial (aka UART) on 0,1 for the GPS. Hence two things using the same pins - problem.
The SMS work initial as the uart_gps.begin disable the hardware uart used by Serial.begin. So your cell.prints work. But then your Serial.prints conflict with your uart_gps and things go bad.
Not sure of your exact symptoms but one needs to clear up the resource issues first. Looking at the GPS and GPRS shields I see move are selectable as you state between 0,1 and 2,3. Where 0,1 is to do my original suggestion of jamming the Arduino CPU into RESET, which then tri-states is use of pins 0 and 1, allowing the Shield when selected to 0,1 to route the radio's uart to the FTDI for direct PC control. Whereas this can be used to the Arduino's CPU but then the FTDI needs to be in Tristate.
The solution is some jumpers on the shield, to use pins other than 0,1 to unused pins and move the corresponding SoftwareSerial to those pins. While making sure the 0,1 pins are not connected between shields, likely bending them away when stacked.