justfloat

重点
  • 在51单片机中,浮点为大端,使用JustFloat需要调换一下字节序;
  • 字节接收区请勾选十六进制,以十六进制方式打印字符,否则只能打印乱码。

协议特点

本协议是小端浮点数组形式的字节流协议,纯十六进制浮点传输,节省带宽。此协议非常适合用在通道数量多、发送频率高的时候。

采样数据解析

数据格式

#define CH_COUNT <N>
struct Frame {
float ch_data[CH_COUNT];
unsigned char tail[4]{0x00, 0x00, 0x80, 0x7f};
};
  • ch_data为小端浮点数组,里面放着需要发送的CH_COUNT个通道。
  • tail为帧尾。

发送4个曲线的数据长这个样子

bf 10 59 3f b1 02 95 3e 57 a6 16 be 7b 4d 7f bf 00 00 80 7f

Arduino示例代码

void setup() {
Serial.begin(115200);
}
float t = 0;
void loop() {
t += 0.1;
// 发送数据
float ch[4];
ch[0] = sin(t);
ch[1] = sin(2*t);
ch[2] = sin(3*t);
ch[3] = sin(4*t);
Serial.write((char *)ch, sizeof(float) * 4);
// 发送帧尾
char[4] tail = {0x00, 0x00, 0x80, 0x7f};
Serial.write(tail, 4);
delay(100);
}

图片解析

数据格式

  • 先发送前导帧:
// 先发送前导帧
int preFrame[7] = {
IMG_ID,
IMG_SIZE,
IMG_WIDTH,
IMG_HEIGHT,
IMG_FORMAT,
0x7F800000,
0x7F800000
};
  • IMG_ID - 图片通道ID,用于标识不同图片;
  • IMG_SIZE - 即将发送过来的图片尺寸;
  • IMG_HEIGHT - 即将发送过来的图片高度;
  • IMG_WIDTH - 即将发送过来的图片宽度;
  • IMG_FORMAT - 图片格式,诸如8位灰度图、16位灰度图、jpg等等。
  • 两个0x7F800000 - JustFloat约定的前导帧结尾,用于告诉协议引擎这是一个图片前导帧。
  • 然后发送真正的图片数据,FireWater会根据前导帧里的IMG_FORMAT指定的格式将图片解析出来。

Arduino示例代码

void setup() {
Serial.begin(115200);
}
float t = 0;
void loop() {
// 先发送前导帧
int preFrame[7] = {0, 0, 0, 0, 0, 0x7F800000, 0x7F800000};
preFrame[0] = IMG_ID; // 此ID用于标识不同图片通道
preFrame[1] = IMG_SIZE; // 图片数据大小
preFrame[2] = IMG_WIDTH; // 图片宽度
preFrame[3] = IMG_HEIGHT; // 图片高度
preFrame[4] = IMG_FORMAT; // 图片格式
Serial.write((char*)&preFrame[0], 7 * sizeof(int));
// 然后发送真正的图片数据
Serial.write(IMG_DATA, IMG_SIZE);
delay(100);
}

文本打印

  • JustrFloat以小端的0x7f80000,也就是{ 0x00, 0x00, 0x80, 0x7f }作为帧结束标志,所以遇到{ 0x00, 0x00, 0x80, 0x7f }才会开启一帧的解析,判断它是采样数据帧、图片前导帧还是其他数据;没有开启数据解析,就不会打印文本
  • 图片前导帧加上后续图片数据,被并称为图片数据包,图片数据会缩略打印;
  • 点击字节接收区设置按钮,可以设置是否单独隐藏样数据帧、图片数据包,也可以设置隐藏包括其他数据在内的所有数据;
  • 字节接收区请勾选十六进制,以十六进制方式打印字符,否则只能打印乱码;
  • 如果你发送的数据一直没有{ 0x00, 0x00, 0x80, 0x7f },那么JustFloat无法解析消耗缓冲区内的数据,会造成缓冲区爆满,软件卡死;

下图展示的是:

设置了隐藏采样数据包,没有设置隐藏图片数据包的文本打印情况。