- 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 ビュー (過去 30 日間)
古いコメントを表示
Richard Stephens
2019 年 10 月 13 日
コメント済み: Richard Stephens
2020 年 11 月 26 日
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 件のコメント
Stephen23
2019 年 10 月 14 日
Start by checking:
採用された回答
Debarghya Kundu
2020 年 11 月 25 日
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.
その他の回答 (0 件)
参考
カテゴリ
Help Center および File Exchange で Device Driver Blocks についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!