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

кодирования значения диапазона от -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_;
}

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

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

5 комментс для “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

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

  4. Ответить Сергей Дек 16, 2017 01:07

    увидел 2 ошибки в функции декодирования во float
    1. вы объявили val как int и тем самым лишили себя возможности работать со значениями после точки, т.е val/1000 всегда будет 0 возвращать.
    2. вы забыли про знак в втором сложении. но так как там всегда 0 заметить это сложно.
    3. в функциях деления и умножения надо делать на 100 а не на 1000, так вы все сохраняете в байт, а int занимает 2 байта. При умножении на 1000, все что больше 0.255 (после запятой) просто теряется. Попробуйте вбить температуру 7.8 она превратится в 7.

    Правильный код декодирования во float выглядит так
    (не забыть что в кодировании тоже на 100 поменять надо)

    float buf_to_float(uint8_t* buff)
    {
    float float_;
    float val=0;
    val=buff[0];
    if (val==0x01) float_=-1;
    val=(float)buff[1];
    float_=float_*val;
    val=(float)buff[2];
    Serial.print(«val=»);
    Serial.println(val);
    if (float_=0)
    {float_=float_+(val/100);}

    return float_;
    }

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