C#,从 USART 接收字符缓冲区中提取双精度

Posted

技术标签:

【中文标题】C#,从 USART 接收字符缓冲区中提取双精度【英文标题】:C#, extract double from USARTs receive char buffer 【发布时间】:2012-03-26 21:26:42 【问题描述】:

我的 USART 正在从“黑匣子”接收一个字符串,该字符串包含两个双精度值和几个十六进制值。该字符串被放置在我的缓冲区 rbuf.buf 中,总大小为 32 个字符。通常我会收到 19 个字符,但最后会收到几次额外的错误字符。缓冲区通常如下所示(十六进制):

0x31, 0x32, 0x33, 0x2e, 0x34, 0x35, 0x20, 0x36, 0x37, 0x2e, 0x38, 0x39, 0x20, 0x37, 0x41, 0x41, 0x20, 0x0a, 0x0d, 0x00, ...

我想提取两个双精度数 123.45 和 67.89,并尝试了以下几个示例:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

...

void buffer_to_float(void)

static char string1[10] = "";
char *string2;
for(uint8_t i=0;i<6;i++)
  
  char c = rbuf.buf[i];  // this is a char but how do I make it a pointer?
  string2 = strcat ( string1, c );  // ... "char" is incompatible with "char*" ...
  

double R = atof(string2);
printf("%lf\n", R);

我知道我在这里做了一些愚蠢的事情,但是什么? 我使用中断例程来接收字符串,我应该在那里进行提取还是这个例程应该尽可能短/快?

谢谢你告诉我我有多傻,我想我需要它;-)

【问题讨论】:

你真的,真的不应该在中断函数中做任何格式化/转换/浮点“东西”。尽量缩短那部分是对的。 【参考方案1】:

您可以使用sscanf 函数读取您的两个float 值:

char bla[] = 0x31, 0x32, 0x33, 0x2e,
              0x34, 0x35, 0x20, 0x36,
              0x37, 0x2e, 0x38, 0x39,
              0x20, 0x37, 0x41, 0x41,
              0x20, 0x0a, 0x0d, 0x00;

float a, b;

sscanf(bla, "%f %f", &a, &b);
printf("%f %f\n", a, b);

【讨论】:

谢谢你! 问题解决了! 我改为 sscanf(rbuf.buf[], "%f %f", &a, &b); ... 但是,我现在得到的不是 123.45,而是 123.449999,所以我需要对浮点数进行四舍五入。 这是什么问题?在你的处理器的浮点版本世界 123.45 IS 123.449999。值 123.45 可能不存在。 嗨,伊恩,没问题。只是我想的时间不够长。对其他人的一个更正:我将倒数第二行更改为 sscanf(rbuf.buf, "%f %f", &a, &b);然后它也适用于我的 USART。再次感谢您的帮助!

以上是关于C#,从 USART 接收字符缓冲区中提取双精度的主要内容,如果未能解决你的问题,请参考以下文章

无法从不区分大小写的字符串中提取双精度数?

正则表达式无法从字符串中提取双参数子字符串

USART通信

在 C# 中将字符串转换为双精度

C# 将字符转换为双精度浮点型

在 C# 中使用德文小数分隔符对双精度值进行 XML 反序列化