title: Arduino - garbled serial output
body: <p>I've hooked up a ADH8066 (Sparkfun) GSM Module to my Arduino Uno, and am trying to get some correct serial going between the Arduino and the GSM module. It works fine when I connect to it directly (via USB or just the TTL lines) but not when being controlled via the Arduino. Some text will output correctly, the rest will be garbled, almost as if the baud rate is wrong, but I'm just using the same baud (115200) I do as when I connect from a PC.</p>
  
  <p>Here is the Arduino code I'm using:</p>
  
  <pre><code>#include &lt;SoftwareSerial.h&gt;
  
  #define rxPin 7
  #define txPin 8
  SoftwareSerial mySerial = SoftwareSerial(rxPin, txPin);
  
  // EN: String buffer for the GPRS shield message
  String SmsStorePos = String("");
  String msg = String("");
  String snTmp = String("");
  String snFull = String("");
  
  // EN: Set to 1 when the next GPRS shield message will contains the SMS message
  int SmsContentFlag = 0;
  
  // EN: Pin of the LED to turn ON and OFF depending on the received message
  int ledPin = 5;
  int powerPin = 6;
  
  void setup()
  {
    mySerial.begin(115200);               // the GPRS baud rate   
    mySerial.print("\r");
    delay(1000);
    Serial.begin(115200);                 // the Arduino IDE serial
    Serial.println("Started!");
  
    pinMode( ledPin, OUTPUT ); 
    digitalWrite( ledPin, LOW ); 
  
    pinMode( powerPin, OUTPUT);
    digitalWrite(powerPin, LOW);    // brings ONKEY low to turn on the modem (aka pressing the ONKEY)
    delay(3000);
    digitalWrite(powerPin, HIGH);    // sets the pin HIGH again (restore 5V)
    delay(5000);
  
    // test LED pin
    digitalWrite ( ledPin, HIGH);
    delay(1000);
    digitalWrite( ledPin, LOW); 
  }
  
  void loop()
  {
      char SerialInByte;
  
      // Send anything we receive from the IDE to the modem
      if(Serial.available())
      {
         mySerial.print((unsigned char)Serial.read());
       }  
      else  if(mySerial.available())
      {
          char SerialInByte;
          SerialInByte = (unsigned char)mySerial.read();
          //SerialInByte = mySerial.read();
  
          // EN: Relay to Arduino IDE Monitor
          Serial.print( SerialInByte );
  
          // -------------------------------------------------------------------
          // EN: Program also listen to the GPRS shield message.
          // -------------------------------------------------------------------
  
          // EN: If the message ends with &lt;CR&gt; then process the message
          if( SerialInByte == 13 ){
            // EN: Store the char into the message buffer
            ProcessGprsMsg();
           }
           if( SerialInByte == 10 ){
              // EN: Skip Line feed
           }
           else {
             // EN: store the current character in the message string buffer
             msg += String(SerialInByte);
           }
       }   
  }
  
  // EN: Make action based on the content of the SMS. 
  //     Notice than SMS content is the result of the processing of several GPRS shield messages.
  void ProcessSms( String sms ){
    sms.toLowerCase();
    Serial.print( "ProcessSms for [" );
    Serial.print( sms );
    Serial.println( "]" );
  
    if( sms.indexOf("on") &gt;= 0 ){
      digitalWrite( ledPin, HIGH );
      Serial.println( "LED IS ON" );
      return;
    }
    if( sms.indexOf("off") &gt;= 0 ){
      digitalWrite( ledPin, LOW );
      Serial.println( "LED IS OFF" );
      return;
    } else {
      mySerial.print("AT+CMGF=1\r");    //Because we want to send the SMS in text mode
      delay(1000);
      mySerial.print("AT+CMGS=\"");
      mySerial.print(snFull);
      mySerial.print("\"\r");
      delay(1000);
      mySerial.print("Unknown Command: ");
      mySerial.print(sms);
      mySerial.print("\r");
      delay(1000);
      mySerial.write(0x1A);  //Equivalent to sending Ctrl+Z     
      return;
    }
  }
  // EN: Request Text Mode for SMS messaging
  void GprsTextModeSMS(){
    mySerial.println( "AT+CMGF=1" );
  }
  
  void GprsReadSmsStore( String SmsStorePos ){
    // Serial.print( "GprsReadSmsStore for storePos " );
    // Serial.println( SmsStorePos ); 
    mySerial.print( "AT+CMGR=" );
    mySerial.println( SmsStorePos );
  }
  
  // EN: Clear the GPRS shield message buffer
  void ClearGprsMsg(){
    msg = "";
  }
  
  // EN: interpret the GPRS shield message and act appropiately
  void ProcessGprsMsg() {
    Serial.println("");
    Serial.print( "GPRS Message: [" );
    Serial.print( msg );
    Serial.println( "]" );
  
    if( msg.indexOf( "Call Ready" ) &gt;= 0 ){
       Serial.println( "*** GPRS Shield registered on Mobile Network ***" );
       GprsTextModeSMS();
    }
  
    // EN: unsolicited message received when getting a SMS message
    if( msg.indexOf( "+CMTI" ) &gt;= 0 ){
       Serial.println( "*** SMS Received ***" );
       // EN: Look for the coma in the full message (+CMTI: "SM",6)
       //     In the sample, the SMS is stored at position 6
       int iPos = msg.indexOf( "," );
       SmsStorePos = msg.substring( iPos+1 );
       Serial.print( "SMS stored at " );
       Serial.println( SmsStorePos );
  
       // EN: Ask to read the SMS store
       GprsReadSmsStore( SmsStorePos );
    }
  
    // EN: SMS store read via UART (result of GprsReadSmsStore request)  
    if( msg.indexOf( "+CMGR:" ) &gt;= 0 ){
      // get number of sender
      int snPos = msg.indexOf("+1");
      Serial.print("SMS From: ");
      snTmp = msg.substring(snPos+1);
      snFull = "";
      for (int i = 0; i &lt; 11; i++){
        snFull += snTmp[i];    
      }
      Serial.println(snFull);
  
      // EN: Next message will contains the BODY of SMS
      SmsContentFlag = 1;
      // EN: Following lines are essentiel to not clear the flag!
      ClearGprsMsg();
      return;
    }
  
    // EN: +CMGR message just before indicate that the following GRPS Shield message 
    //     (this message) will contains the SMS body
    if( SmsContentFlag == 1 ){
      Serial.println( "*** SMS MESSAGE CONTENT ***" );
      Serial.println( msg );
      Serial.println( "*** END OF SMS MESSAGE ***" );
      ProcessSms( msg );
      delSMS();
    }
  
    ClearGprsMsg();
    // EN: Always clear the flag
    SmsContentFlag = 0; 
  }
  void delSMS() {
    mySerial.print("AT+CMGD=");
    mySerial.println(SmsStorePos);
  }  
  </code></pre>
  
  <p>Below is what I'm seeing in the serial monitor:</p>
  
  <p><img src="https://i.stack.imgur.com/RDF0o.png" alt="http://imgur.com/i5jEPds"></p>