- that the correct function is being called (e.g. which str2double -all).
- the actual input data does not contain any non-numeric characters (convert to double and print in the command window. Show us some examples).
NaNs from str2double on Arduino hardware
4 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Richard Stephens
le 13 Oct 2019
Commenté : Richard Stephens
le 26 Nov 2020
I'm running a Simulink model with a Matlab Function Block on an Arduino Mega 2560. The Matlab code includes converting a string to a double.
E.g.:
function x = convert(str)
x = str2double(str);
It works in Normal mode simulation, but when running on the hardware (External mode) I keep getting NaNs returned in x instead of the number. To try to work out what's wrong, I've tried the following simplified code:
x = str2double('32'); % returns NaN
x = str2double('32.0') % returns 32
Can anyone explain this behaviour, and what do I do to get over it? I've tried using real() function and that seems to make no difference.
2 commentaires
Stephen23
le 14 Oct 2019
Start by checking:
Réponse acceptée
Debarghya Kundu
le 25 Nov 2020
The reason for the observed behavior is the stdio library used by Arduino.
The code generated by str2double uses a function called sscanf. This function internally calls vfscanf function.
vfscanf is available in three different versions. Out of these three versions, the default version does not implement scanning float variables. This is mentioned in the doc:
"By default, all the conversions described above are available except the floating-point conversions and the width is limited to 255 characters. The float-point conversion will be available in the extended version provided by the library libscanf_flt.a. Also, in this case the width is not limited (exactly, it is limited to 65535 characters). To link a program against the extended version, use the following compiler flags in the link stage: -Wl,-u,vfscanf -lscanf_flt -lm "
Refer the following doc link for more details:
To use compiler flags mentioned in the doc, you can follow the steps mentioned below:
1. Open config set
2. Go to "Code Generation" tab
3. In "Build configuration" drop down, select "Specify"
4. In C++ Liker, append the following: -Wl,-u,vfscanf -lscanf_flt -lm
5. Dont forget to add a space to the existing flags before appending the new flags.
6. Click apply, OK.
7. Run the model in external mode.
Please note that using the extended version of this library will consume a lot of code space.
Plus de réponses (0)
Voir également
Catégories
En savoir plus sur Device Driver Blocks dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!