void cellInfo::onGetProtocolData(VCI_CAN_OBJ *vci,unsigned int dwRel,unsigned int channel)
{
qDebug() << "onGetProtocolData";
for(unsigned int i = 0;i < dwRel;i ++)
{
QString str = "";
if(vci[i].RemoteFlag == 0)
{
str = "x| ";
for(int j = 0;j < vci[i].DataLen;j ++){
byteValues.append(vci[i].Data[j]);
str += QString("%1 ").arg(vci[i].Data[j],2,16,QChar('0')).toUpper();
validData[j] = vci[i].Data[j];
qDebug()<<"j"<<j<<"validData[j]"<<QString::asprintf("%02x", validData[j]);
}
}
qDebug() <<"cell info::"<< str;
}
}
参数一:VCI_CAN_OBJ *vci
typedef struct _VCI_CAN_OBJ{
UINT ID;
UINT TimeStamp;
BYTE TimeFlag;
BYTE SendType;
BYTE RemoteFlag;
BYTE ExternFlag;
BYTE DataLen;
BYTE Data[8];
BYTE Reserved[3];
}VCI_CAN_OBJ,*PVCI_CAN_OBJ;
参数二:unsigned int dwRel,代表是接收到的CAN数据帧的数量
参数三:unsigned int channel,can通道号
函数中的byteValues和validData。
byteValues是QList<unsigned char> byteValues类型的变量,validData是uint validData[8]类型的变量。
QList<unsigned char> byteValues;
byteValues.append(0x01);
byteValues.append(0xFF);
unsigned char firstByte = byteValues.at(0);
unsigned char secondByte = byteValues.at(1);
qDebug() << "List of byte values:";
for (int i = 0; i < byteValues.size(); ++i) {
qDebug() << "Byte" << i << ":" << QString::number(byteValues.at(i), 16).toUpper();
}
str += QString("%1 ").arg(vci[i].Data[j], 2, 16, QChar('0')).toUpper();是什么意思?
解释:
假设 vci[i].Data[j] 的值是 0xA(十进制的 10),那么这段代码的执行过程如下:
1. %1:占位符,等待插入值。
2. .arg(vci[i].Data[j], 2, 16, QChar('0')):
vci[i].Data[j] 的值是 0xA。
将 0xA 转换为十六进制字符串,结果是 "a"。
宽度参数是 2,所以需要补齐到 2 个字符。
使用填充字符 '0' 补齐,结果是 "0a"。
3. .toUpper():将 "0a" 转换为大写,结果是 "0A"。
最终,QString("%1 ").arg(vci[i].Data[j], 2, 16, QChar('0')).toUpper(); 的结果是 "0A "。
将 CAN 数据帧中的数据字节格式化为十六进制字符串并输出。
假设 vci[i].Data 的值是 {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0},那么输出将是:
j 0 validData[j] "12"
j 1 validData[j] "34"
j 2 validData[j] "56"
j 3 validData[j] "78"
j 4 validData[j] "9a"
j 5 validData[j] "bc"
j 6 validData[j] "de"
j 7 validData[j] "f0"
cell info:: "x| 12 34 56 78 9A BC DE F0 "
通过这个示例,你可以看到如何将 CAN 数据帧中的数据字节格式化为十六进制字符串并输出。
`validData[j] = vci[i].Data[j];` 这句代码的作用是将接收到的 CAN 数据帧中的数据字节存储到 `validData` 数组中。具体来说,它将 `vci[i]` 这个 CAN 数据帧中的第 `j` 个数据字节赋值给 `validData` 数组的第 `j` 个位置。
解释
vci 是一个指向 VCI_CAN_OBJ 结构体数组的指针,每个 VCI_CAN_OBJ 结构体表示一个 CAN 数据帧。
dwRel 是接收到的 CAN 数据帧的数量。
channel 是 CAN 通道号。
vci[i].Data[j] 表示第 i 个 CAN 数据帧中的第 j 个数据字节。
validData[j] 是一个数组,用于存储接收到的有效数据。
举例
假设我们接收到一个 CAN 数据帧,其数据内容如下:
VCI_CAN_OBJ vci[1];
vci[0].DataLen = 8;
vci[0].Data[0] = 0x12;
vci[0].Data[1] = 0x34;
vci[0].Data[2] = 0x56;
vci[0].Data[3] = 0x78;
vci[0].Data[4] = 0x9A;
vci[0].Data[5] = 0xBC;
vci[0].Data[6] = 0xDE;
vci[0].Data[7] = 0xF0;
在 `onGetProtocolData` 函数中,假设 `dwRel` 为 1(表示接收到一个 CAN 数据帧),那么 `vci[0]` 表示接收到的这个 CAN 数据帧。
validData = {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0};