Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
6 years, 9 months ago.
How to retype std::string to string
I am testing communication on Nucleo-32. I have got the string message from USB into a buffer - message is: 0.750
#include "mbed.h" #include <string> char buff[128]; std::string message; float pw_p; pocitac.gets(buff,10); //In buffer I have separate character buff[3] is 0, buff[4] is . , buff[5] is 7, buff[6] is 5, buff[7] is 0, //Then I have tried to retype it to float message=buff[3]+buff[4]+buff[5]+buff[6]+buff[7]; pw_p = atof(message.c_str()); PWM_Out1.period_ms(10); PWM_Out1.write(pw_p); pocitac.printf("Info: %f\n", pw_p); }
But in the pw_p is the value 0.000 :( Do you have any idea, where is a problem and how to do it correctly? Thank you very much for your help.
2 Answers
6 years, 8 months ago.
Hi there,
Your code is very close, you're just missing a few components of a C++ String. In C++, in order for a string to be valid, they must end with a null termination or the character "\0". So you need to append that to the end of your string in addition to the characters from your buff[128]
array. You also are not appending to your message
string correctly. Since you previously initialized the std::string message;
on line 5, in your code you need to append the buffer onto your existing initialized variable:
message = message + buff[3] + buff[4] + buff[5] + buff[6] + buff[7] + '\0';
Then your pw_p
variable should have the correct float value.
Please let me know if you have any questions!
- Jenny, team Mbed
6 years, 8 months ago.
Hello Lukas,
Let's make first the gets(char * buff, int num)
function work properly. It reads characters from the serial line and stores them as a C string into buff
until (num-1) characters have been read or either a newline or the end-of-file is reached, whichever happens first. It includes in the buff
string any ending newline character ('\n') and also a terminating null character ('\0') is automatically appended after the characters copied. So if you send a string like 0.750
with appended newline character ('\n') from the serial monitor running on your PC then the buff
should contain a string like "0.750\n\0" (make sure that the serial monitor is configured to automatically append a newline char to the string you send). Then you do not need to use std::string
in your code at all. When that works then you can easily convert the alphanumeric string to floating point number and set the PWM duty cycle:
#include "mbed.h" Serial pocitac(USBTX, USBRX); char buff[128]; float pw_p; PwmOut PWM_Out1(p21); // substitute p21 with the PWM pin name on your board int main(void) { while (1) { // Receive a string (that has a newline character at the end) representing a floating point number pocitac.printf("Enter a number:\r\n"); pocitac.gets(buff, 128); pocitac.printf("buff: %s", buff); // Convert the string to floating point number pw_p = atof(buff); pocitac.printf("number = %4.3f\r\n", pw_p); // Set PWM duty cycle PWM_Out1.period_ms(10); PWM_Out1.write(pw_p ); } }