10. CAN 通信

CAN总线协议(Controller Area Network), 控制器局域网总线,是德国BOSCH(博世)公司研发的一种串行通讯协议总线, 它可以使用双绞线来传输信号,是世界上应用最广泛的现场总线之一

10.1. can fd配置

在使用can之前,需要对can进行配置

注意

野火Android SDK中,如果发现can设备树配置和can驱动跟下面图片对不上,请联系技术支持更新。

../../_images/can_dts.png ../../_images/can_drv.png

10.2. CAN硬件连接

CAN模块之间接线:CAN_1H接CAN_2H,CAN_1L接CAN2_L

10.3. can通信测试

在Android系统中,同样可以使用can-utils工具进行测试。不过想要通过adb shell进行can测试,需要在Android SDK中自行移植can-utils。

通信测试

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
执行adb
adb shell

超级用户权限
su

更改测试工具权限
chmod 0777 candump
chmod 0777 cansend

查询当前网络设备:
ifconfig -a

CAN启动:
    关闭CAN:
    ip link set can0 down
    ip link set can1 down

    设置比特率500KHz:
    ip link set can0 type can bitrate 500000
    ip link set can1 type can bitrate 500000

    打印can0信息:
    ip -details link show can0
    ip -details link show can1

    启动CAN:
    ip link set can0 up
    ip link set can1 up

CAN接收:
    开启打印,等待接收:
    candump can0 &

CAN发送:
    发送(标准帧,数据帧,ID:123,date:DEADBEEF):
    cansend can1 123#DEADBEEF

10.4. Android app can通信测试

在Android系统中,想要实现Android app去实现can通信,首先我们介绍一下Android jni

10.4.1. Android jni

Java Native Interface ,即 Java 本地接口 作用:使得 Java 与本地其他类型语言(如 C、C++ )进行交互。 实际的使用中,Java 需要与本地代码进行交互,因为 Java 项目具备跨平台的特点,所以 Java 与本地代码交互的能力非常弱,采用 JNI 特性,增强 Java 与本地代码交互的能力。

10.4.2. Android app 实现can 通信

以 LubanCat-2IO为例,使用的系统为android 11

连线方式如下:

../../_images/can_1.png

安卓界面整体布局如下:

../../_images/can_screen.png

在点击初始化按钮的时候,会先读取波特率,然后用该波特率去初始化2io的can0 和can1 。同时也会读取文本框的内容来决定canX来进行发送信息。 点击下方的send按钮可以将信息发送出去。同时后台会将can接收到的信息显示到文本框中,运行效果如下

../../_images/can_screen2.png