Float to byte. byte to float. byte to string.Скетч. 4

кодирования значения диапазона от -255.255 до +255.255 в 3 байта

Значение кодируем в 3 байта данных.
1 байт — знак(+/-)
1 байт — целая часть до 255
1 байт дробная часть до 0.255
На входе функции значение типа float на выходе uint8_t buff[3];
Скетч кодирования

1
2
3
4
5
6
7
8
9
10
11
12
uint8_t* temp_float_to_buf(float temp)
{
    if (temp>255.255 || temp<-255.255) return 0;
    uint8_t buff[3];
    if (temp>=0) //передаем знак значения + или -
        buff[0]=0x00;
    else
        buff[0]=0x01;
    buff[1]=ABS((int)temp);
    buff[2]=ABS((int)((temp - (int)temp)*1000));
    return buff;
}
uint8_t* temp_float_to_buf(float temp)
{
	if (temp>255.255 || temp<-255.255) return 0;
	uint8_t buff[3];
	if (temp>=0) //передаем знак значения + или -
		buff[0]=0x00;
	else
		buff[0]=0x01;
	buff[1]=ABS((int)temp);
	buff[2]=ABS((int)((temp - (int)temp)*1000));
	return buff;
}

Скетч декодирования в string

1
2
3
4
5
6
7
8
9
10
11
12
13
14
String temp_buf_to_string(uint8_t* buff)
{
    String float_s;
    int val=0;
    val=buff[0];
    if (val==0x01) float_s='-';
    val=buff[1];
    float_s=float_s+val+'.';
    val=buff[2];
    if (val>99) float_s=float_s+val;
        else if (val>9) float_s=float_s+'0'+val;
            else float_s=float_s+'00'+val;
    return float_s;
}
String temp_buf_to_string(uint8_t* buff)
{
	String float_s;
	int val=0;
	val=buff[0];
	if (val==0x01) float_s='-';
	val=buff[1];
	float_s=float_s+val+'.';
	val=buff[2];
	if (val>99) float_s=float_s+val;
		else if (val>9) float_s=float_s+'0'+val;
			else float_s=float_s+'00'+val;
	return float_s;
}

Скетч декодирования в float

1
2
3
4
5
6
7
8
9
10
11
12
float temp_buf_to_float(uint8_t* buff)
{
    float float_;
    int val=0;
    val=buff[0];
    if (val==0x01) float_=-1;
    val=buff[1];
    float_=float_*val;
    val=buff[2];
    float_=float_+val/1000;
    return float_;
}
float temp_buf_to_float(uint8_t* buff)
{
	float float_;
	int val=0;
	val=buff[0];
	if (val==0x01) float_=-1;
	val=buff[1];
	float_=float_*val;
	val=buff[2];
	float_=float_+val/1000;
	return float_;
}

Данные скетч были написан для передачи комнатной температуры с контроллера на контроллер при программировании «Умного Дома».

Конвертация других типов

4 комментс для “Float to byte. byte to float. byte to string.Скетч.

  1. Ответить bentos Апр 17, 2015 04:34

    uint8_t* temp_float_to_buf(float temp)
    {
    ….
    uint8_t buff[3];
    ….
    return buff;
    }

    Здесь область памяти для buff выделяется автоматически внутри функции, то есть в стеке, а наружу возвращается указатель на эту область. Это очень плохая практика, поскольку стек, при выходе из функции разрушается и возвращенный указатель становится недействительным. То, что это возможно работает — дело случая, значит освобожденная стеком память пока не потребовалась и не затерлась чем-то другим. Правильнее будет передавать в функцию указатель на буфер, созданный вне ее.

  2. Ответить Михаил Фев 6, 2016 23:56

    а теперь подставим, например, -23,35 в скетч для кодирования и …

  3. Ответить Андрей Мар 27, 2016 10:38

    Не работают примеры, пишет что функция не задана.

Добавить комментарий