Как разделить строку на отдельные типы, может ли сигнал? - PullRequest
0 голосов
/ 18 ноября 2018

Я работаю над 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

В этом сигнале мне нужно прочитать идентификаторы из каждой строки, а затем отобразить данные только для идентификаторов, которые мне нужны.В настоящее время я делаю это, используя кучу операторов if и for, и используя массивы char для чтения различных частей строки.

Это кажется мне очень неэффективным, есть ли другой способ сделать это?Может быть, напрямую извлечь часть Id или сравнить часть идентификатора, не сохраняя весь поток в массиве?Или любой лучший или эффективный способ сделать то же самое?Я не нахожу переменную, хранящую данные или идентификатор в structdef struct xlCanRxEvt.Любое предложение будет с благодарностью.

1 Ответ

0 голосов
/ 19 ноября 2018

Вы говорите о библиотеке драйверов Vector XL.

Сначала вы получите XlEvent из XLCANReceive (). Этот 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;

Я думаю, этого достаточно, чтобы вы нашли более "изящный" способ извлечения данных.

...