2012-03-26 48 views
0

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

0x31 0x32 0x33 0x2e 0x34 0x35 0x20 0x36 0x37 0x2e 0x38 0x43 0x37 0x41 0x41 0x20 0x0a ,0X0D,0×00,...

我想提取两个双打中其它一些实例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); 
} 

我知道b。我在这里做一些傻事b呃什么? 我使用中断程序来接收字符串,我应该在那里进行提取还是应该尽可能短/快?

谢谢你告诉我,我怎么这么傻我,我想我需要它;-)

+0

你真的,真的不应该在中断函数中执行任何格式化/转换/浮点“填充”。你有权尽可能缩短这部分。 – 2012-03-27 13:18:32

回答

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); 
+0

感谢的ouah,但是... – fredus4 2012-03-27 04:26:14

+0

谢谢ouah! 问题解决了! 我更改为 sscanf(rbuf.buf [],“%f%f”,&a,&b); ... – fredus4 2012-03-27 05:48:09

+0

但是,而不是123.45我现在得到123.449999所以我需要四舍五入浮法。 – fredus4 2012-03-27 06:01:05