2012-03-26 47 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