SparkFun Forums 

Where electronics enthusiasts find answers.

For the discussion of Arduino related topics.
By MobileWill
#118210
I have searched and can't figure this out

I have a basic sketch for reading from the serial port and sending it to the TTS chip which sends to the speakjet. I am using the sparkfun voice shield with the TTS chip in the proto area.

Problem is I can't send commands from serial. It works if I do a println but not from the serial.

For example speakjet.println("Test\375"); that works but if i type Test\375 from the serial monitor it speaks the \ 3 7 5.  (375 is the code for 253 for gunshot sound per example in http://www.sparkfun.com/datasheets/Comp ... prelim.pdf

It doesn't read the escape character correctly.

Below is my code. This is based on the Sparkfun example, I removed my LCD code.
Code: Select all
/*
Testing Sketch for Robot
*/

//Soft serial library used to send serial commands on pin 2 instead of regular serial pin.
#include <SoftwareSerial.h>

//Define the Pin Numbers of the Voicebox shield for the sketch.
#define E0  5
#define E1  6
#define E2  7
#define E3  8
#define E4  9
#define E5  10
#define E6  11
#define E7  12

#define RDY  13
#define RES  3
#define SPK  4

//Pin 2 of the shield should be wired to the TTS256 chip.
#define txPin  2

//Create a SoftSerial Object to send strings to the TTS256 chip.
SoftwareSerial speakjet = SoftwareSerial(0, txPin);

//Create a message buffer to hold the ascii message to be converted to sound
char message[128]="";

void setup()  
{
  //Configure the pins for the SpeakJet module
  pinMode(txPin, OUTPUT);
  pinMode(SPK, INPUT);
  
  //Set up a serial port to talk from Arduino to the SpeakJet module on pin 3.
  speakjet.begin(9600);    
  
  //Set up a serial port to get the ascii message from the host
  Serial.begin(9600);
  
  //Configure the Ready pin as an input
  pinMode(RDY, INPUT);
  
  //Configure Reset line as an output
  pinMode(RES, OUTPUT);
       
  //Configure all of the Event pins as outputs from Arduino, and set them Low.
  for(int i=E0; i<=E7; i++)
  {
    pinMode(i, OUTPUT);
    digitalWrite(i, LOW);
  }
  
  //All I/O pins are configured. Reset the SpeakJet module
  digitalWrite(RES, LOW);
  delay(100);
  digitalWrite(RES, HIGH);
  delay(1000);
  char sounds[] = {200, 201, 202, 203, 220, 221, 222};
  speakjet.println(sounds);
  //speakjet.println("Test\375"); // This works for sending commands inline
  
}

void loop()
{  
  //Get a message from the serial port
  getMessage(message);
  
  //Send the message to the TTS256
  speakjet.println(message);
  Serial.println(message);
  print(message);
  print(" ");
  
  
  //Wait 12ms before checking the ready line (specified in TTS256 datasheet)
  delay(12);
  //Wait for the Speakjet to become 'ready' before sending more text.
  while(digitalRead(RDY)==0);
}

//Function: getMessage(char *)
//Description: Retrieves a string from the Serial port. Doesn't return the string until a carriage return character is detected.
//Inputs: None
//Outputs: char * message - The message received on the serial port.
//Returns: Nothing
//usage: getMessage(english_sentance);
void getMessage(char * message)
{
    char in_char=0;    //Create a character to store the incoming byte from the serial port.
    //Wait for a character to come into the serial port
    while(Serial.available() <=0);
    //Copy the incoming character to our variable.
    in_char=Serial.read();
    //Keep retreiving characters until the 'end of sentance(0x0D)' character is received.
    while(in_char != 0x0D){
        *message++=in_char;    //Every time we receive a character we should add the character to the message string.
        while(Serial.available() <=0);    //Now wait for the next character...
        in_char = Serial.read();            //and copy it to the variable again.
    }
   *message='\0';    //Strings must end with a Null terminator so we need to add this to our message.
    return;
}

Thanks.