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 接收字符缓冲区中提取双精度的主要内容,如果未能解决你的问题,请参考以下文章