firewater

重点

FireWater遇到换行才会打印数据,很多新用户在这里产生疑惑。

协议特点

本协议是CSV风格的字符串流,直观简洁,编程像printf简单。但由于字符串解析消耗更多的运算资源(无论在上位机还是下位机),建议仅在通道数量不多、发送频率不高的时候使用。

采样数据解析

数据格式

"<any>:ch0,ch1,ch2,...,chN\n"
  • any和冒号可以为空,但换行(\n)不可省略;
  • any不可以为"image",这个前缀用于解析图片数据;
  • 此处\n为换行,并非指字符斜杠+字符n;
  • \n也可以为\n\r,或\r\n。
  • 发送4个曲线的数据长这个样子
"channels: 1.386578,0.977929,-0.628913,-0.942729\n"

  • 或者不加any和冒号
"1.386578,0.977929,-0.628913,-0.942729\n"

Arduino示例代码

void setup() {
Serial.begin(115200);
}
float t = 0;
void loop() {
t += 0.1;
Serial.print("samples:%f, %f, %f, %f\n", sin(t), sin(2*t), sin(3*t), sin(4*t));
// 不加any和冒号也可以
// Serial.print("%f, %f, %f, %f\n", sin(t), sin(2*t), sin(3*t), sin(4*t));
delay(100);
}

图片解析

数据格式

  • 先发送前导帧:
// 先发送前导帧
"image:IMG_ID, IMG_SIZE, IMG_WIDTH, IMG_HEIGHT, IMG_FORMAT\n"
  • image: - FireWater约定的前导帧开头,用于告诉协议引擎这是一个图片前导帧;
  • IMG_ID - 图片通道ID,用于标识不同图片;
  • IMG_SIZE - 即将发送过来的图片尺寸;
  • IMG_HEIGHT - 即将发送过来的图片高度;
  • IMG_WIDTH - 即将发送过来的图片宽度;
  • IMG_FORMAT - 图片格式,诸如8位灰度图、16位灰度图、jpg等等。
  • 然后发送真正的图片数据,FireWater会根据前导帧里的IMG_FORMAT指定的格式将图片解析出来。

Arduino示例代码

void setup() {
Serial.begin(115200);
}
void loop() {
// 先发送前导帧
Serial.write("image:%d,%d,%d,%d,%d\n",
IMG_ID, // 此ID用于标识不同图片通道
IMG_SIZE, // 图片数据大小
IMG_WIDTH, // 图片宽度
IMG_HEIGHT, // 图片高度
IMG_FORMAT // 图片格式
);
// 然后发送真正的图片数据
Serial.write(IMG_DATA, IMG_LENGTH);
}

文本打印

  • FireWater以换行作为帧结束标志,所以遇到换行才会开启一帧的解析,判断它是采样数据帧、图片前导帧还是其他数据;没有开启数据解析,就不会打印文本
  • 图片前导帧加上后续图片数据,被并称为图片数据包,图片数据会缩略打印;
  • 点击字节接收区设置按钮,可以设置是否单独隐藏样数据帧、图片数据包,也可以设置隐藏包括其他数据在内的所有数据;
  • 如果你发送的数据一直没有换行,那么FireWater无法解析消耗缓冲区内的数据,会造成缓冲区爆满,软件卡死。

下图展示的是:

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