此代码是否在 Qt C++ 中以正确的方式发送十六进制数据?

Is this code send hex data in correct way in Qt C++?

我是 Qt.I 的新手,正在使用 this 文档制作指纹 madoule。我想以这种格式将我的数据发送到串口:
我以这种格式编写代码,但我认为我的数据有误,因为这段代码在某些设备中打开了 LED:

QByteArray ba;
ba.resize(24);
ba[0]=0x55;
ba[1]=0xAA;
ba[2]=0x24;
ba[3]=0x01;
ba[4]=0x01;
ba[5]=0x00;
ba[6]=0x00;
ba[7]=0x00;
ba[8]=0x00;
ba[9]=0x00;
ba[10]=0x00;
ba[11]=0x00;
ba[12]=0x00;
ba[13]=0x00;
ba[14]=0x00;
ba[15]=0x00;
ba[16]=0x00;
ba[17]=0x00;
ba[18]=0x00;
ba[19]=0x00;
ba[20]=0x00;
ba[21]=0x00;
ba[22]=0x27;
ba[23]=0x01;

p->writedata(ba);  

这个数据正确吗?

您只是将绘图复制到代码中。如果不理解绘图的含义,它将无法工作。你似乎错过了:

  1. LEN 字段似乎是一个小端整数,它给出了 DATA 字段中的字节数 - 也许它是携带有用信息的字节数如果数据包具有固定大小。

  2. CKS 字段似乎是某种校验和。您需要根据数据包的内容进行计算。协议文档应指出它是否跨越整个数据包,以及如何计算该值。

您似乎在与 FPM-1502、SM-12、ADST11SD300/310 或类似的指纹识别模块通话。如果是这样,那么您可以获得如下有效的命令包:

QByteArray cmdPacket(quint16 cmd, const char *data, int size) {
  Q_ASSERT(size <= 16);
  QByteArray result(24, '[=10=]');
  QDataStream s(&result, QIODevice::WriteOnly);
  s.setByteOrder(QDataStream::LittleEndian);
  s << quint16(0xAA55) << cmd << quint16(size);
  s.writeRawData(data, size);
  s.skipRawData(22 - s.device()->pos());
  quint16 sum = 0;
  for (int i = 0; i < 22; ++i)
     sum += result[i];
  s << sum;
  qDebug() << result.toHex();
  return result;
}

QByteArray cmdPacket(quint16 cmd, const QByteArray& data) {
   return cmdPacket(cmd, data.data(), data.size());
}

打开sensor led on/off的命令包如下:

QByteArray cmdSensorLed(bool on) {
   char data[2] = {'[=11=]', '[=11=]'};
   if (on) data[0] = 1;
   return cmdPacket(0x124, data, sizeof(data));
}