天嵌 ARM开发社区

 找回密码
 注册
查看: 4142|回复: 7

分享自写的can在android下的测试程序,新问题需要高手帮忙

[复制链接]
wangdapengxp 发表于 2013-5-16 10:59:34 | 显示全部楼层 |阅读模式
本帖最后由 wangdapengxp 于 2013-5-16 11:19 编辑









新手,只能模仿和抄袭canutils写了一个测试程序,在android下测试过了,可以用,但是新的问题出现了。
我应用程序是java做的,需要现实can数据,我怎么才能在java中获得这些can的数据呢?难道还是必须写hal层和jni层么?

附件是我抄袭canutils写的android下的can测试程序,在串口终端里运行cansend 会自己初始化can波特率为50000bps,然后发送两个数据 id为0x11 数据为y  另一个 id为0x22 数据为n  发送完以后会等待接受数据,只收id为0x11的数据,接受到数据后会把数据显示到终端上,然后循环,继续发送yn那两个数据,继续进入等带接受数据。


请高手指点下一步需要做什么,才能让我在java中去处理can数据,

我已经尝试了如下内容:模仿led创建了hal层的can.h 实现文件can.c  其中can.c几乎就是cansend的内容,编译android文件系统,提示sockaddr_can这个结构体不认识,是不能这么用,还是我那里写错了。大致代码如下:
__BEGIN_DECLS

/**
* The id of this module
*/
#define CAN_HARDWARE_MODULE_ID "can"
struct led_module_t
{
        struct hw_module_t common;
};

struct can_control_device_t {
    struct hw_device_t common;
   
        int (*can_init)(const char *name);
           int (*can_do_start)(const char *name);
           int (*can_do_stop)(const char *name);
            int (*can_send)(int32_t id,int dlc,char *data);
            int (*can_dump)(const char *name);
};
__END_DECLS
#endif  // ANDROID_LED_INTERFACE_H
模仿led.h写的,基本没什么改的。我不知道方法声明那对不对,请指教
static int can_init(const struct hw_module_t *module, char const *name,
                struct hw_device_t **device) {

        struct can_control_device_t *dev;
        dev = (struct can_control_device_t *) malloc(
                        sizeof(struct can_control_device_t));

        if (dev == NULL)
                return 0;

        memset(dev, 0, sizeof(*dev));
        dev->common.tag = HARDWARE_DEVICE_TAG;
        dev->common.version = 0;
        dev->common.module =  module;
        dev->common.close = (int (*)(struct hw_device_t *)) can_do_stop;
        *device = (struct hw_device_t *) &dev->common;

        dev->can_send = can_send;
        dev->can_dump = can_dump;

        if (can_open() == -1) {
                free(dev);
                dev = NULL;
                return -1;
        }
        return 0;
}

static struct hw_module_methods_t can_module_methods = {
                open : can_init
};

const struct can_module_t HAL_MODULE_INFO_SYM =
{
        common:
    {
        tag: HARDWARE_MODULE_TAG,
        version_major: 1,
        version_minor: 0,
        id: CAN_HARDWARE_MODULE_ID,
        name: "can Stub",
        author: "embedsky",
        methods: &can_module_methods,
    }
};
这个是can.c的部分内容,其他没贴出来的,几乎都是和cansend。c一样。

提示sockaddr_can这个结构体好像不认识,还有PF_CAN和CAN_RAW什么的都说没定义,我头文件引用了sys/socket.h和linux/can.h还有什么linux/netlink什么的 凡是cansend.c中引用的 我都加到can.c中了,为什么编译cansend可以收发,编译android系统却不认识这些了呢

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
TQ-lkp 发表于 2013-5-16 11:17:56 | 显示全部楼层
楼主贴下你编绎的方法和报错的详细信息
 楼主| wangdapengxp 发表于 2013-5-16 11:23:52 | 显示全部楼层
本帖最后由 wangdapengxp 于 2013-5-16 15:34 编辑

TQ-lkp 发表于 2013-5-16 11:17




楼主贴下你编绎的方法和报错的详细信息

cansend那个我就用arm-linux-gcc -static -o cansend cansend.c 编译后拷贝到开发的sbin下  改了权限就能用了

hal层那个 我还是把代码也发上来吧,我按照led的教程,放到相应的位置,直接进入到TQ3358_Androidv4.0_v1.0下 运行自带的那个build_android.sh  就提示如图的错误了

can.h我放到了hardware 里 就是有led.h和adc.h那个文件夹里,can.c我放到了devices/Embedsky/tq335x下面我建立了一个libcan的文件夹,复制了libled文件夹下的内容,然后改了一下相应的内容,不太会改,mk那个文件我只是把led改成了can

我修改了几个地方,我发现我can.c里那个can_send和can_dump重复了,我把can.c中can_send改成了can_do_send、can_dump改成了can_do_dump can.h里有个led也没改can,我也改了,错误还是一样
不懂纯猜测,感觉引用的部分头文件好像不好用 我把can_do_send里的具体内容都注释了,只return 1实验了一下,发现运行build_android.sh后提示如下:没有linux/can.h和linux/can/raw.h,请问在can.c中如何引用这两个头文件。

我又尝试了,提示错误的地方都注释掉,我注释掉了can_do_send中的所有有关socket的内容后,又把include <linux/can.h>和include <linux/can/raw.h>注释掉以后,运行build_android.sh编译过去了,但是这样根本没有发送can数据和接受can数据的方法啊,请问我怎么能在can.c中使用s=socket(PF_CAN,SOCK_RAW,CAN_RAW)
很难理解为什么我引用了linux/netlink.h和linux/types.h不报错,为什么引用同文件夹下的linux/can.h,linux/can/raw.h却报错呢

一边尝试一边等帮忙,求大神和各位版主帮忙啊。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
TQ-lkp 发表于 2013-5-16 17:08:17 | 显示全部楼层
编绎单个模块最好不要使用build_android.sh ,使用mmm命令,用法手册上有介绍,要先设置环境变量
linux/can.h和linux/can/raw.h应该只存在于我们提供的4.4.6的编绎器, android提供的编绎器中没这个东西
从我们提供的编绎器中找到对应的头文件和源码,库放到android的编绎器对应目录试下
 楼主| wangdapengxp 发表于 2013-5-17 09:18:14 | 显示全部楼层
TQ-lkp 发表于 2013-5-16 17:08
编绎单个模块最好不要使用build_android.sh ,使用mmm命令,用法手册上有介绍,要先设置环境变量
linux/can ...

请问您说的这个“android的编译器对应目录“ 能具体告诉我下是哪个目录么?

我在android的系统里TQ3358_Android4.0_v1.0/kernel/include/linux/下 已经找到了can.h和can/raw.h  我只是不确定hal层头文件引用的是不是这个。

如果不是,请告诉我下我把can.h和can/raw.h放到哪个文件夹下,我文件路径都是按照手册上的,没有改变。
 楼主| wangdapengxp 发表于 2013-5-17 16:21:03 | 显示全部楼层
本帖最后由 wangdapengxp 于 2013-5-17 16:22 编辑
TQ-lkp 发表于 2013-5-16 17:08
编绎单个模块最好不要使用build_android.sh ,使用mmm命令,用法手册上有介绍,要先设置环境变量
linux/can ...


这个有点过于复杂了,超出我目前理解的范围了,请版主告诉我下将那几个文件和库放到 android中的哪个位置。

我尝试了,我搜索了一下android系统下 找到好多个can.h 和raw.h   我发现socket(PF_CAN,SOCK_RAW,CAN_RAW)中的参数也提示没定义,那应该是socket.h这个文件也引用的不对,我一搜索,我了个去,更多10多个socket.h的文件,目前对于我来说还太难了。

请版主告诉我下  can.h raw.h socket.h 和库文件 等等放到哪个文件下。
 楼主| wangdapengxp 发表于 2013-5-27 15:44:35 | 显示全部楼层
这么久了,还没有android下的can测试例子么?
 楼主| wangdapengxp 发表于 2013-5-29 14:30:36 | 显示全部楼层
问题也没有人回答,真无奈啊,支持新产品是要付出代价的啊。。。。。。。。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-4-29 00:33 , Processed in 1.031250 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表