求助关于arduino串口字符串提取浮点数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求助关于arduino串口字符串提取浮点数相关的知识,希望对你有一定的参考价值。

参考技术A char buf[] = "A10.2 B200.6 C5000.2 D8.2";
float a,b,c,d;
sscanf(buf,"A%f B%f C%f D%f",&a,&b,&c,&d);
注意空格,enjoy.

从 CString 中提取浮点数

【中文标题】从 CString 中提取浮点数【英文标题】:Extract a floating point number from a CString 【发布时间】:2012-08-13 14:00:59 【问题描述】:

我想从格式如下的 CString 中提取一个浮点数:(例如提取 22.760348)

Incidence_angle(inc)[deg]                 :22.760348

基本上我正在读取一个包含一些参数的纯文本文件,并且我想对这些值执行一些计算。我使用 CStdioFile 对象读取文件并使用 readString 方法提取每一行,如下所示:

CStdioFile result(global::resultFile,CFile::modeRead);
while( result.ReadString(tmp) )
            
                if(tmp.Find(L"Incidence_angle(inc)[deg]") != -1)
                
                    //extract value of theeta i here
                    // this is probably wrong
                    theeta_i = _tscanf(L"Incidence_angle(inc)[deg]  :%f",&theeta_i);
                
            

我尝试使用 scanf,因为我想不出任何其他方式。

如果这个问题看起来非常基本和愚蠢,我深表歉意,但我已经坚持了很长时间,希望得到一些帮助。

编辑:拿出我写的概念证明程序,造成混乱

【问题讨论】:

你能出示theeta_i的声明吗? @Andrey - float pixel_spacing=0, line_spacing=0, theeta_i=0; 【参考方案1】:

假设tmpCString,那么正确的代码是

CStdioFile result(global::resultFile,CFile::modeRead);
while( result.ReadString(tmp) )

if (swscanf_s(tmp, L"Incidence_angle(inc)[deg]  :%f", &theeta_i) == 1)
    
        // Use the float falue
    

【讨论】:

嗨@Andrey 我实现了这个。但它永远不会进入 if 大括号。条件始终评估为假。我在这里做错了吗? CStdioFile 结果(global::resultFile,CFile::modeRead); while( result.ReadString(tmp) ) if(tmp.Find(L"Incidence_angle(inc)[deg]") != -1) //提取 theeta i 的值 if (wscanf_s(tmp, L"Incidence_angle( inc)[deg] :%f", &theeta_i) == 1) // 使用浮点数 AfxMessageBox(L"Float",0,0); @eternalDreamer:它到达 sscanf 了吗?如果是,请确保"Incidence_angle(inc)[deg] :" 与输入流中的字符串完全匹配(包括大小写和空格数)。另外,那是 MBCS 还是 Unicode 应用程序? 它到达了 sscanf。我从文本文件中完全复制了字符串。它是一个 Unicode 应用程序。如果我缺乏知识让您感到沮丧,我很抱歉。 @eternalDreamer 对不起,那你应该使用sscanf的Unicode等价物,它被称为swscanf_sAFAIR【参考方案2】:

为什么不使用atof?

示例取自链接:

   /* atof example: sine calculator */
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>

    int main ()
    
      double n,m;
      double pi=3.1415926535;
      char szInput [256];
      printf ( "Enter degrees: " );
      gets ( szInput );
      n = atof ( szInput );
      m = sin (n*pi/180);
      printf ( "The sine of %f degrees is %f\n" , n, m );
      return 0;
    

【讨论】:

它不是控制台程序。如果我的概念验证程序引起了混乱,我很抱歉。【参考方案3】:

为什么不完全采用 C++ 方式?

这只是一个提示:

#include <iostream>
#include <string>
#include <sstream>

int main()

   double double_val=0.0;
   std::string dump("");
   std::string oneline("str 123.45 67.89 34.567"); //here I created a string containing floating point numbers
   std::istringstream iss(oneline);
   iss>>dump;//Discard the string stuff before the floating point numbers
   while ( iss >> double_val )
   
      std::cout << "floating point number is = " << double_val << std::endl;
   
   return 0;

如果你想按照你的说明使用,只使用 cstring,也可以试试strtod()来源:man -s 3 strtod

【讨论】:

【参考方案4】:

_tscanf() 返回分配的数量,而不是读取的值:

theeta_i = _tscanf(L"Incidence_angle(inc)[deg]  :%f",&theeta_i); 

所以如果float 被成功读取,theeta_i 将包含1(.0)。改为:

if (1 == _tscanf(L"Incidence_angle(inc)[deg]  :%f",&theeta_i))

    /* One float value successfully read. */


从缓冲区读取应该是_stscanf()_tscanf() 将等待来自标准输入的输入。

【讨论】:

感谢您的解释。我需要提取浮点值,所以我尝试使用这个:sscanf_s

以上是关于求助关于arduino串口字符串提取浮点数的主要内容,如果未能解决你的问题,请参考以下文章

Arduino 浮点数转字符数组输出,π常量输出,sprintf打印

arduino怎么写小数吗

ValueError:无法将字符串转换为浮点数:使用 matplotlib、arduino 和 pyqt5 时

Arduino 使用 sscanf 读取浮点数

如何从字符串中提取浮点数[重复]

从php中的字符串中提取正负浮点数