我正在使用API读取CAN信号。这部分代码以字符串形式输出接收到的CAN。
xlCanGetEventString(&xlCanRxEvt)
CAN信号的形式为:
XL_CAN_EV_TAG_RX_OK ch:1 t=9026813952 id:98FF1880 dlc:8 862EC5350C138336
XL_CAN_EV_TAG_RX_OK ch:1 t=9027108864 id:98FF1980 dlc:8 500111065C018C03
XL_CAN_EV_TAG_RX_OK ch:1 t=9027411968 id:98FF1A80 dlc:8 0000FFFFFFFFFFFF
XL_CAN_EV_TAG_RX_OK ch:1 t=9027411968 id:98FF1A80 dlc:8 0000FFFFFFFFFFFF
XL_CAN_EV_TAG_RX_OK ch:1 t=9027657728 id:98FF5180 dlc:5 C000000000
在该信号中,我需要从每一行读取ID,然后仅显示所需ID的数据。我目前正在通过使用一堆if和for语句,并使用char数组读取行的不同部分来执行此操作。
这对我来说效率很低,还有另一种方法吗?是否可以直接提取ID部分或比较ID部分而不必将整个线程存储到数组中?还是任何最佳或有效的方法来做到这一点?我也没有在typedef struct xlCanRxEvt中找到存储数据或ID的变量。任何建议将不胜感激。
答案 0 :(得分:2)
您正在谈论Vector XL驱动程序库。
您首先从XLCANReceive()获取XlEvent。 XLEvent是一个结构,
structs_xl_event{
XLeventTag tag;
unsignedchar chanIndex;
unsignedshort transId;
unsignedshort portHandle;
unsignedchar flags;
unsignedchar reserved;
XLuint64 timeStamp;
unions_xl_tag_datatagData;
};
您可以这样访问他们的内容:
xlEvent[i].tag =XL_TRANSMIT_MSG;
xlEvent[i].tagData.msg.id =0x04;
xlEvent[i].tagData.msg.flags =0;
xlEvent[i].tagData.msg.data[0]=1;
xlEvent[i].tagData.msg.data[1]=2;
xlEvent[i].tagData.msg.data[2]=3;
xlEvent[i].tagData.msg.data[3]=4;
xlEvent[i].tagData.msg.data[4]=5;
xlEvent[i].tagData.msg.data[5]=6;
xlEvent[i].tagData.msg.data[6]=7;
xlEvent[i].tagData.msg.data[7]=8;
xlEvent[i].tagData.msg.dlc =8;
我认为这足以让您找出更“优雅”的数据提取方式。