to convert string into char

Hello i am working on a certain project in which i need to convert my input read string into char. Hereby i want to note that i dont want to convert it into char array... only character. here is my demo code snippet

[code]char in_data;
 char ss;

//int flag = 0;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
///////Serial.print("AT+CIPSTART = 'TCP'"); 
  }

void loop() {
  // put your main code here, to run repeatedly:
//in_st = char(in_data);
//ss = char(in_data);
//ss = in_data;
String in_st = "";
if(Serial.available()){ 
 String in_st = Serial.readString(); 
 Serial.print(in_st);
 in_data = in_st.charAt(2);
 // in_st = (char)(in_data);
 Serial.print(in_data);
  
 
 
// Serial.write(*ss);
 }
}

[/code]

Have a look at the parse example in Serial Input Basics - simple reliable ways to receive data.

It is not a good idea to use the String (capital S) class on an Arduino as it can cause memory corruption in the small memory on an Arduino. This can happen after the program has been running perfectly for some time. Just use cstrings - char arrays terminated with '\0' (NULL).

...R

You are reading a String (capital S) not a string (lowercase s). They are different things

It is not clear what you want to do. A variable declared as type char can only hold one character

What is it exactly that you want to do ?
Can you provide an example input String and the result of whatever it is you want to do ?

UKHeliBob:
You are reading a String (capital S) not a string (lowercase s).

The OP is reading a string (a set of charcaters) that are arriving at the UART Port and saving them in a variable named in_st of type String.

The OP has executed this code: String in_st = Serial.readString(); to accommodate charcaters as much as he can within the default timeout time (1 sec) and save them into the said variable.

The OP is reading a string (a set of charcaters)

I am sure that you know very well that a set of characters is not a string unless it is terminated by a zero.

The readStringUntil() function reads characters and puts them into a String, not a string

Perhaps you could provide one of the diagrams you like to do showing where and when the stream of characters read by the readStringUntil() function is turned into a string (lowercase s)

UKHeliBob:
You are reading a String (capital S) not a string (lowercase s). They are different things

It is not clear what you want to do. A variable declared as type char can only hold one character

What is it exactly that you want to do ?
Can you provide an example input String and the result of whatever it is you want to do ?

basically i am doing a gsm application in which i want to access my variable into the library's internal function. i dont want to give any hardcode data to it.

int InetGSM::connectTCP(char server, int port) this is the function in which i want to put my variable data into that char server. it is nothing but a ITEAD gsm library

Your code fragment certainly puts element 2 of the String in_st into a char variable in_data.

What problems are you having?

int InetGSM::connectTCP(char server, int port)I am not familiar with the library but from its name it seems unlikely that the first parameter of the function is a single char

Can you please post a link to where you got the library ?

UKHeliBob:
int InetGSM::connectTCP(char server, int port)I am not familiar with the library but from its name it seems unlikely that the first parameter of the function is a single char

Can you please post a link to where you got the library ?

i made some changes in that library. it was const char* initially

this is the link

rt009:
i made some changes in that library. it was const char* initially

Do you really know the differences among --

char* intially;
char *intially;
char initiallyl;

GolamMostafa:
Do you really know the differences among --

char* intially;
char *intially;
char initiallyl;

it was not working with char*. hence i changed it to char to test if it works or not.

it was not working with char*. hence i changed it to char to test if it works or not.

Reinstate the library and try your program again.
Post the program here and explain what does not work. Are you passing a pointer to the server name or something else I wonder ?

UKHeliBob:
Reinstate the library and try your program again.
Post the program here and explain what does not work. Are you passing a pointer to the server name or something else I wonder ?

i passed char* server before editing. problem was char* server was recieving null value

problem was char* server was recieving null value

Then you were passing an empty string, or an invalid pointer, to the method.

i passed char* server before editing. problem was char* server was recieving null value

Examples please

#include <EEPROM.h>
#include <EEPROMAnything.h>

#include "SIM900.h"
#include <SoftwareSerial.h>
#include "inetGSM.h"
//#include "sms.h"
//#include "call.h"

//To change pins for Software mySerial, use the two lines in GSM.cpp.

//GSM Shield for Arduino
//www.open-electronics.org
//this code is based on the example of Arduino Labs.

//Simple sketch to start a connection as client.

InetGSM inet;
//CallGSM call;
//SMSGSM sms;
char in_data[10];
char msg[50];
char a1[30];
int numdata;
char data;
char inSerial[50];
int i = 0;
int j = 0;
boolean started = false;
String s1 = "";
char m[10];
char* s;
int reader_flag = 0;
void url_reader();
//////EEPROM/////////////
int add1 = 10;
int add2 = 15;
int add3 = 20;
char first;
//////////flags////////////
int tcp_flag = 0;

void setup()
{
  //Serial connection.
  Serial.begin(9600);
  Serial.println(tcp_flag);
  Serial.println("GSM Shield testing.");
  /// reader_flag = 1;
    if (gsm.begin(9600)) {
     Serial.println("\nstatus=READY");
     started = true;
    } else Serial.println("\nstatus=IDLE");

    if (started) {
     //GPRS attach, put in order APN, username and password.
     //If no needed auth let them blank.
     if (inet.attachGPRS("internet.wind", "", ""))
       Serial.println("status=ATTACHED");
     else Serial.println("status=ERROR");
     delay(1000);

     //Read IP address.
     gsm.SimpleWriteln("AT+CIFSR");
     delay(5000);
     //Read until serial buffer is empty.
     gsm.WhileSimpleRead();
     tcp_flag = 1;
     // read_s();
     /// data = inet.connectTCP(s, 80);  ///////////// uncomment if not done////////////
     //TCP Client GET, send a GET request to the server and
     //save the reply.
     //   numdata=inet.httpGET("www.google.com", 80, "/", msg, 50);
     ///   data=inet.httpGET(s, 80, "/", msg, 50);

     //Print the results.




    }

  // s = EEPROM.read(add2);
  //data = inet.connectTCP(s, 80);

  tcp_flag = 1;

}

///////////////loop///////////////////////////
void loop()
{

  if (tcp_flag == 1) {

    tcp_fun();
    tcp_flag = 0;

  }
  read_s();

  //  serialhwread();
  //Read for new byte on NewSoftSerial.
  serialswread();
  // char s = char(inSerial[50]);




}
////////////////////////////////////////////////////////
void serialhwread()
{
  i = 0;
  j = 0;
  char s = char(inSerial[i]);
  if (Serial.available() > 0) {
    while (Serial.available() > 0) {
      //inSerial[0] = '

this is the code which i have done. that s is nothing but a character which is passed inside inet.connectTCP(); function;
      inSerial[i] = (Serial.read());
      //  char s = char(inSerial[i]);
      //  data = inet.connectTCP(s, 90);
      delay(10);
      i++;
      tcp_flag = 0;
      reader_flag = 0;
      //Serial.print(s);
      /*if (strcmp(inSerial, s))
        {
        i = 0;
        Serial.print("TCP IS:");
        data = (inet.connectTCP(s, 90));

}*/
      ///
      //break;
    }

inSerial[i] = '\0';
    //  s = (char*)(inSerial);
    if (!strcmp(inSerial, "/END")) {
      Serial.println("_");
      inSerial[0] = 0x1a;
      inSerial[1] = '\0';

gsm.SimpleWriteln(inSerial);

}
    //Send a saved AT command using serial port.
    if (!strcmp(inSerial, "TEST")) {
      Serial.println("SIGNAL QUALITY");
      gsm.SimpleWriteln("AT+CSQ");
    }
    //Read last message saved.
    if (!strcmp(inSerial, "MSG")) {
      Serial.println(msg);
    } else {
      Serial.println(inSerial);
      gsm.SimpleWriteln(inSerial);
    }
    inSerial[0] = '\0';
  }
}

void serialswread()
{
  gsm.SimpleRead();
}

void read_s() {

// s1 = char(s);
  // s1 = "";
  if (Serial.available()) {

//reader_flag = 1;
    //  s = Serial.read();
    gsm.WhileSimpleRead();
    //String s1 = Serial.readString();
    in_data[10] = Serial.read();
    gsm.SimpleRead();
    char s = char(in_data[10]);
    ///Serial.write(s);
    //  gsm.SimpleWrite(in_data[10]);
    ///tcp_flag = 0;
    reader_flag = 0;
    ////////Serial.println(j);

///in_data[9] = "\0";

/* if (j == 2) {
      s = EEPROM.read(add2);
      gsm.SimpleWrite(s);
      }
      if (j == 3) {
      s = EEPROM.read(add3);
      gsm.SimpleWrite(s);
      }*/

// Serial.write("\r\n");

//
    // Serial.write(*ss);
  }

/////////gsm.SimpleWrite(s);

}

void tcp_fun() {

tcp_flag = 1;
  read_s();
  data = inet.connectTCP(s, 80); //////gsm.SimpleWrite(s);

}


this is the code which i have done. that s is nothing but a character which is passed inside inet.connectTCP(); function

One thing I notice is this

void read_s()
{
  if (Serial.available())
  {
    gsm.WhileSimpleRead();
    in_data[10] = Serial.read();
    gsm.SimpleRead();
    char s = char(in_data[10]);
    reader_flag = 0;
  }
}

s is declared within the function so it is a local variable.
Once the function ends the variable will not exist any more but you use it here

void tcp_fun()
{
  tcp_flag = 1;
  read_s();
  data = inet.connectTCP(s, 80);
}

I see that you have a different variable of the same (silly) name declared elsewhere in the program with its own scope

UKHeliBob:
One thing I notice is this

void read_s()

{
  if (Serial.available())
  {
    gsm.WhileSimpleRead();
    in_data[10] = Serial.read();
    gsm.SimpleRead();
    char s = char(in_data[10]);
    reader_flag = 0;
  }
}



s is declared within the function so it is a local variable.
Once the function ends the variable will not exist any more but you use it here


void tcp_fun()
{
  tcp_flag = 1;
  read_s();
  data = inet.connectTCP(s, 80);
}




I see that you have a different variable of the same (silly) name declared elsewhere in the program with its own scope

globally s is declared. so should i remove that second "s " ?

void read_s()
{
  if (Serial.available())
  {
    gsm.WhileSimpleRead();
    in_data[10] = Serial.read();
    gsm.SimpleRead();
    char s = char(in_data[10]);
    reader_flag = 0;
  }
}

from here?

globally s is declared.

Not in the code you posted

should i remove that second "s "

If you want to update the globally declared s then just remove the type specifier when you use s in the function. But for sanity sake please give the variable a more sensible descriptive name

What about the other s variable declared in the serialhwread() function ?

UKHeliBob:
Not in the code you posted
If you want to update the globally declared s then just remove the type specifier when you use s in the function. But for sanity sake please give the variable a more sensible descriptive name

What about the other s variable declared in the serialhwread() function ?

yeah well there was lots of cross testing involve in that code. so maybe it is creating a bit chaotic situation. your right i should remove the temporary names from that.