Arduino使用sscanf读取浮点数
Arduino Reading floating point numbers with sscanf
我试图用sscan((读取数字,但我用双变量没有成功,但可以读取int
双示例
//double var reading not working
const char KBuffer[80] = "0x3:2.1:2.1:2.1";
int rt;
double p,i,d;
int n = sscanf(KBuffer, "%x:%lf:%lf:%lf", &rt, &p, &i, &d);
Serial.println();
Serial.print("rt "); Serial.print(rt);
Serial.print(" P ");Serial.print(p);
Serial.print(" i ");Serial.print(i);
Serial.print(" d ");Serial.print(d);
//输出rt 3 P 0.00 i ovf d 0.00
int 示例
// int reading working ok
const char KBuffer[80] = "0x3:2:2:2";
int rt;
int p,i,d;
int n = sscanf(KBuffer, "%x:%d:%d:%d", &rt, &p, &i, &d);
Serial.println();
Serial.print("rt "); Serial.print(rt);
Serial.print(" P ");Serial.print(p);
Serial.print(" i ");Serial.print(i);
Serial.print(" d ");Serial.print(d);
// output
rt 3 P 2 i 2 i 2
所以你知道做错了什么吗
当我在c++在线编译器上运行时,同样的代码如下:https://onlinegdb.com/ryS8zfE3r
我得到了正确的结果
即使第一次转换顺利,arduino scanf也不会读取浮点数,printf也不会打印它们。默认情况下,scanf和printf族函数不支持浮点数。
第一个问题很容易分类:int n = sscanf(KBuffer, "0x%x:%d:%d:%d", &rt, &p, &i, &d);
第二个问题需要通过添加-Wl,-u,vfscanf -lscanf_flt -lm
来更改编译器(或链接器(操作,但irt将使图像大小增加约15kb。
在安装板库的目录中的hardware/tools/avr/doc/avr-libc/group__avr__stdio.html
中阅读更多信息
花了一段时间后,我得出结论,sscanf不能处理浮点/双值,所以为了解决通过串行通信输入浮点的问题,我采用了另一种方法,我分享它可能会帮助
void setup() {
Serial.begin(9600);
}
void loop() {
char KBuffer[80] = "c:0x3;p:2.12;i:2.15;d:2.17";
bool top_pid_input = false;
// Read each command pair
char* command = strtok(KBuffer, ";");
while (command != NULL)
{
// Serial.print(command);
// Split the command in two values
char* separator = strchr(command, ':');
if (separator != 0)
{
// Actually split the string in 2: replace ':' with 0
*separator = 0;
// string
if(strcmp(command, "c") == 0 ){
top_pid_input = true;
Serial.println();Serial.print(" command: ");Serial.print(command);
++separator;
Serial.print(separator);
}else if(top_pid_input && strcmp(command, "p") == 0 ){
Serial.println();Serial.print(" p: ");Serial.print(command);
++separator;
Serial.print(separator);
}else if(top_pid_input && strcmp(command, "i") == 0 ){
Serial.println();Serial.print(" i: ");Serial.print(command);
++separator;
Serial.print(separator);
}else if(top_pid_input && strcmp(command, "d") == 0 ){
Serial.println();Serial.print(" d: ");Serial.print(command);
++separator;
Serial.print(separator);
}
// convert char to float
top_kd = atof(separator);
}
// Find the next command in input string
command = strtok(0, ";");
}
delay(300000);
}
编辑:问题已编辑,因此此答案不再相关
根据scanf()
系列功能的手册页:
返回值这些函数返回输入项的数量成功匹配和分配,数量可能少于提供的数量例如在早期匹配失败的情况下为零。
您应该在代码中检查返回值n
,以查看转换是否失败。
这里,第一次转换失败:%d
无法读取十六进制数字。再次从手册页:
d
匹配一个可选的带符号十进制整数;下一个指针必须是指向内部的指针
您必须改用%x
:
x
匹配一个无符号十六进制整数;下一个指针必须是指向无符号整数的指针
因为第一次转换失败,所以不会执行其他转换。
- 读取带有浮点数的矢量
- Arduino使用sscanf读取浮点数
- 读取文件由c 中的mmap()的浮点数组成
- 在同一行中读取混合输入(字符串/浮点数),并将其存储在数组中
- 使用输入运算符读取浮点数C++
- 有没有办法更有效地将二进制双精度从文件读取到浮点数组中
- 使用 ifstream 读取浮点数
- 从输入流读取浮点数而不拖尾"E"
- 将浮点数的文本文件读取到C++中的 2D 矢量中
- 从文件中读取 4 个十六进制值并转换为浮点数
- 如何读取和写入浮点数组
- C++银行项目;如何将一组字符串读取为单独的浮点数并添加它们
- C ++读取(大端序)二进制浮点数
- 从二进制读取 2D 浮点数组,从 char* 转换为浮点数[2]
- C++ 程序,用于将具有恒定(但未知)列数的未知大小的 CSV 文件(仅填充浮点数)读取到数组中
- C++到C#将二进制文件读取到二维浮点数组中
- 从.txt文件中读取浮点数
- 从文本文件中读取多行浮点数
- setLocale用于从字符串中读取浮点数
- c++如何从文件中读取浮点数并存储到另一个文件中