飞凌嵌入式吧 关注:443贴子:465
  • 0回复贴,共1

imx6q android can filter

只看楼主收藏回复

因为设置can波特率必须要有系统权限,开系统进程,所以我把系统权限打开了。这导致我写的can过滤器功能失效了。求大佬解答!!!!!!!
上代码
bool canRcvFiltersSet(const int *canIdArray, const int &arraySize, short filterType)
{
if(canfd1 <= 0) //canfd就不用解释了…
return false;
if(NULL == canIdArray){
setsockopt(canfd1, SOL_CAN_RAW, CAN_RAW_FILTER, NULL, 0); //不需要接收任何报文
return true;
}
struct can_filter rfilter[arraySize];
bzero(rfilter,sizeof (rfilter));
for(int i = 0; i < arraySize; ++i){
if(canIdArray[i]){
if(filterType & CAN_FILTER_PASS){
rfilter[i].can_id = canIdArray[i];
}
else{
rfilter[i].can_id = (canIdArray[i] | CAN_INV_FILTER);
}
rfilter[i].can_mask = CAN_EFF_MASK; //这个掩码怎么设置看自己需求
}else{
return false;
}
}
//重点!!!很多文章没提到这一点,过滤器反转时需要设置,使各过滤器之间由逻辑或变成逻辑与关系,
//否则设置的反转过滤器因为相互矛盾导致不起作用
//简单举例解释,过滤器A接收除0x123之外的报文,过滤器B接收除0x124之外的报文,
//那么0x123虽然被过滤器A过滤了,但是会被过滤器B通过,同理0x124会被过滤器A通过,所以实际上不起作用
//下面的设置就是让过滤器之间join起来,只有符合所有过滤器的规则才会被通过
if(filterType & CAN_FILTER_REJECT){//can过滤反转设置
int join_filter = 1;
setsockopt(canfd1, SOL_CAN_RAW, CAN_RAW_JOIN_FILTERS, &join_filter, sizeof(join_filter));
}
setsockopt(canfd1, SOL_CAN_RAW, CAN_RAW_FILTER, &rfilter, sizeof(rfilter));
return true;
}
JNIEXPORT bool JNICALL Java_forlinx_hardware_hardwareControl_rfilterCan1
(JNIEnv *env, jclass ojb, jintArray jarr,int flag) {
jboolean *isCopy = NULL;
//获取数组首地址
int *jo = (env)->GetIntArrayElements(jarr, isCopy);
//获取数组长度
int len =(env)->GetArrayLength(jarr);
canRcvFiltersSet(jo,len,flag);
// const int can_id_reject[] = {0x123, 0x11111678, 0x282}; //除这三种canid之外的报文,都接收
// canRcvFiltersSet(can_id_reject, sizeof(can_id_reject)/sizeof(int), CAN_FILTER_REJECT);
// const int can_id_pass[] = {0x111, 0x11111678, 0x282}; //只接收这三种canid报文,其它不接收
// canRcvFiltersSet(can_id_pass, sizeof(can_id_pass)/sizeof(int), CAN_FILTER_PASS);
return sizeof(jo)/sizeof(int);
}


1楼2021-11-04 15:31回复