此代码是否在 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);
这个数据正确吗?
您只是将绘图复制到代码中。如果不理解绘图的含义,它将无法工作。你似乎错过了:
LEN
字段似乎是一个小端整数,它给出了 DATA
字段中的字节数 - 也许它是携带有用信息的字节数如果数据包具有固定大小。
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));
}
我是 Qt.I 的新手,正在使用 this 文档制作指纹 madoule。我想以这种格式将我的数据发送到串口:
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);
这个数据正确吗?
您只是将绘图复制到代码中。如果不理解绘图的含义,它将无法工作。你似乎错过了:
LEN
字段似乎是一个小端整数,它给出了DATA
字段中的字节数 - 也许它是携带有用信息的字节数如果数据包具有固定大小。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));
}