首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用‘%f’和‘%f’的问题(Avr)

使用‘%f’和‘%f’的问题(Avr)
EN

Stack Overflow用户
提问于 2021-05-04 21:09:10
回答 1查看 323关注 0票数 0

(注:在这个问题的早期版本中,我假设我使用了错误的引用。这是一个不同的问题,我对标题/问题做了相应的修改。

我的代码打算用avr-gcc编译,并在ATmega168p微控制器上运行。

我在C中有以下函数,用于解析缓冲区(char数组)中的浮点值,并将其分配给相应的浮动变量:

代码语言:javascript
运行
复制
void read_float_from_buffer(float *var, char *buffer, uint8_t start, uint8_t end) {
    char val_buf[8];

    // transfer characters representing float to a temporary buffer
    uint8_t p=0;
    for (uint8_t i=start;i<=end && p<7;i++) {
        val_buf[p++]=buffer[i];
    }
    val_buf[p]='\0';

    // perform sscanf on this temporary buffer
    float buf=-1;
    if(sscanf(val_buf, "%.2f", &buf)==1) // this fails, sscanf returns 0
      *var=buf;
}

我有另一个函数find_float_in_buffer(),它在char缓冲区中搜索浮点值的开始和结束索引。函数read_float_from_buffer()在此函数中调用:

代码语言:javascript
运行
复制
float a_float_variable=0.;
void find_float_in_buffer(char *buffer) {
    uint8_t start,end=0;
    /*
    I do some magic here to find out where my float string starts and ends
    */
    read_buffer_float(&a_float_variable,buffer,start,end);
}

根据我的理解,这应该可以工作,但是由于某种原因,扫描val_buf临时缓冲区失败了(sscanf返回0)。

我的问题是:我将buffer的引用传递给find_float_in_buffer中的read_buffer_float的方式正确吗?我以为我终于理解了如何传递指向函数的指针或引用,但我不确定这是否是将一个函数中的指针传递给另一个函数的方式。

编辑:,我正在Atmel微控制器上运行这段代码,并使用avr-gcc进行编译。

编辑2: --我删除了我的整个固件,并得到了以下MWE:

代码语言:javascript
运行
复制
#define F_CPU 8000000UL

#include <stdlib.h>
#include <stdbool.h>
#include <stdio.h>
#include <util/delay.h>
#include "src/peripheral-core/uart.c"

int main() {
  _delay_ms(200);
  uart_init();
  uartWriteString("application started\n\r\0");

  char test[]="12.34\0";
  float testfloat=-1;
  sscanf(test, "%f", &testfloat);

  uartWriteString("teststring is:\t\0");
  uartWriteString(test);
  uartWriteString("\n\rscanned float is:\t\0");
  uartWriteFloat(testfloat);
  uartWriteString("\n\0");

  for (;;) {
    _delay_ms(1000);
  }
}

对我来说,这个指纹:

代码语言:javascript
运行
复制
application started

teststring is:  12.34

scanned float is:   -1.000

要构建.hex文件,我运行以下命令:

代码语言:javascript
运行
复制
avr-gcc -std=gnu99 -c -Os -Wall -mmcu=atmega168p main.c -o main.o
avr-gcc -std=gnu99 -Wl,-u,vfprintf -lprintf_flt -lm -mmcu=atmega168p main.o -o main.elf
avr-objcopy -O ihex -j .data -j .text main.elf main.hex

AVR-GCC版本:

avr-gcc --version给出avr-gcc.exe (GCC) 10.1.0

当我在我的开发系统上运行下面的等价物时,它可以工作。

代码语言:javascript
运行
复制
#include <stdio.h>

int main() {
  printf("application started\n\r\0");

  char test[]="12.34\0";
  float testfloat=-1;
  sscanf(test, "%f", &testfloat);

  printf("teststring is:\t\0");
  printf(test);
  printf("\n\rscanned float is:\t\0");
  printf("%.2f",testfloat);
  printf("\n\0");
}

但是:当我将"%.2f"作为格式说明符传递给sscanf() (正如注释中指出的那样无效)时,该版本在相同的行为下失败。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-05 06:58:19

由于您已经强制编译器使用printf和对float支持,所以您知道标准库的这个限制。

您也需要为scanf()这样做。请看文件。

代码语言:javascript
运行
复制
avr-gcc -std=gnu99 -Wl,-u,vfprintf -lprintf_flt -Wl,-u,vfscanf -lscanf_flt -lm -mmcu=atmega168p main.o -o main.elf
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67392247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档