Hi everyone, I really need your help . Okay here's a intro to what I'm doing. I'm currently trying to use a multiplexer to control 4 serial device by using 1 software serial , and hardware serial for the computer , After tested and proven , I would make use of the hardware serial to program my stuff.
My connection is fairly simple , for arduino board pins 2 , 3, 6, 7 to Multiplexer pin 13, 3, 10, 9 respectively. You can refer to the image for reference:
Here's how's my code look like :
#include <SoftwareSerial.h> //add the soft serial libray
#define rxpin 2 //set the RX pin to pin 2
#define txpin 3 //set the TX pin to pin 3
SoftwareSerial myserial(rxpin, txpin); //enable the soft serial port
String inputstring = ""; //a string to hold incoming data from the PC
String sensorstring = ""; //a string to hold the data from the Atlas Scientific product
boolean input_stringcomplete = false; //have we received all the data from the PC
boolean sensor_stringcomplete = false; //have we received all the data from the Atlas Scientific product
int s0 = 7;
int s1 = 6;
char *channel;
char *cmd;
void setup(){ //set up the hardware
Serial.begin(38400); //set baud rate for the hardware serial port to 38400
myserial.begin(38400); //set baud rate for software serial port to 38400
inputstring.reserve(5); //set aside some bytes for receiving data from the PC
sensorstring.reserve(30); //set aside some bytes for receiving data from Atlas Scientific product
pinMode(s0 , OUTPUT);
pinMode(s1 , OUTPUT);
}
void serialEvent() { //if the hardware serial port receives a char
char inchar = (char)Serial.read(); //get the char we just received
inputstring += inchar; //add it to the inputString
if(inchar == '\r') {
input_stringcomplete = true;
} //if the incoming character
}
void open_channel(){ //This function controls what UART port is opened.
switch (*channel) { //Looking to see what channel to open
case '0': //If channel==0 then we open channel 0
digitalWrite(s0, LOW); //S0 and S1 control what channel opens
digitalWrite(s1, LOW); //S0 and S1 control what channel opens
break; //Exit switch case
case '1':
digitalWrite(s0, HIGH);
digitalWrite(s1, LOW);
break;
case '2':
digitalWrite(s0, LOW);
digitalWrite(s1, HIGH);
break;
case '3':
digitalWrite(s0, HIGH);
digitalWrite(s1, HIGH);
break;
}
}
void loop(){ //here we go....
if (input_stringcomplete){ //if a string from the PC has been recived in its entierty
myserial.print(inputstring); //send that string to the Atlas Scientific product
char carray[inputstring.length() + 1]; //determine size of the array
inputstring.toCharArray(carray, sizeof(carray)); //put readStringinto an array
Serial.print("c array:'");
Serial.print(carray);
Serial.println("'");
channel=strtok(carray , ":"); //Let's parse the string at each colon
cmd=strtok(NULL, ":"); //Let's parse the string at each colon
open_channel(); //Call the function "open_channel" to open the correct data path
myserial.print(cmd); //Send the command from the computer to the Atlas Scientific device using the softserial port
myserial.print("\r"); //After we send the command we send a carriage return <CR>
input_stringcomplete = false; //reset the flage used to tell if we have recived a completed string from the PC
}
while (myserial.available()) { //while a char is holding in the serial buffer
char inchar = (char)myserial.read(); //get the new char
sensorstring += inchar; //add it to the sensorString
if (inchar == '\r') {
sensor_stringcomplete = true;
} //if the incoming character is a <CR>, set the flag
}
Serial.print("channel :");
Serial.print(channel);
Serial.println("'");
delay(500);
Serial.print("command syntax");
Serial.print(cmd);
Serial.println("'");
delay(500);
if (sensor_stringcomplete){ //if a string from the Atlas Scientific product has been received in its entirety
Serial.print(sensorstring); //use the hardware serial port to send that data to the PC
//clear the string:
sensor_stringcomplete = false; //reset the flag used to tell if we have received a completed string from the Atlas Scientific product
}
inputstring ="";
sensorstring="";
delay(500);
}
So My command for switching the multiplexer would be 0 , 1, 2, 3, 4 . So if you were to type something would be like this ---> 0:(your string) <\CR>
But here's what I seen on the serial monitor , though there's data coming out but it's not correct as though all number are jumble up.
Serial monitor Image :