如何将字符串分隔为不同类型,可以发出信号?

时间:2018-11-17 21:53:38

标签: c string parsing can-bus

我正在使用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的变量。任何建议将不胜感激。

1 个答案:

答案 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;

我认为这足以让您找出更“优雅”的数据提取方式。