void onGetProtocolData(VCI_CAN_OBJ *vci,unsigned int dwRel,unsigned int channel)函数详解

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();//QString::number(recvCANData[i].frame.data[j],16) + " ";
                validData[j] = vci[i].Data[j];
                qDebug()<<"j"<<j<<"validData[j]"<<QString::asprintf("%02x", 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类型的数据
    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};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值