FireflyApi2 CAN
3.3.3 CAN使用
在使用之前需要了解 CanFilter,CanMessage,CanMessageListener,CanSocket 四个类的主要作用和用法。
CanFilter
构造函数:public CanFilter(final int mask, final int filter)
描述:用于存储过滤接收帧信息
参数:mask 掩码
filter 帧id
范例:
//无接收过滤信息
CanFilter[] nofilters = new CanFilter[0];
//仅接收id为 0x400 和 0x410的帧
CanFilter[] filters = new CanFilter[]{new CanFilter(0xfff, 0x400), new CanFilter(0xfff, 0x410)};
CanMessage
构造函数:public CanMessage(final boolean isEFF, final boolean isRTR, final int id, final byte[] data)
描述:用于存储帧信息
参数:isEFF true 为扩展帧,false 为标准帧
isRTR true 为远程帧,false 为数据帧
id 帧ID
data 帧数据
范例:
存储一帧信息,id 为0x100, 标准帧,数据帧,数据为{0x01,0x02,0x03,0x04,0x05,0x6,0x7},长度为7的帧信息
boolean isEFF = false;
boolean isRTR = false;
int canid = 0x100;
byte[] data = new byte[] {(byte)1, (byte)2, (byte)3, (byte)4, (byte)5, (byte)6,(byte)7};
CanMessage message = new CanMessage(isEFF, isRTR, canid, data);
- 获取帧信息 ID
函数:public final int getRawId()描述:获取帧 ID范例:int can_id = message.getRawId();
- 获取帧信息数据
函数:public final byte[] getData()描述:获取帧信息范例:byte[] data = message.getData();
- 帧信息
函数:public final String toString()描述:帧信息范例:Log.i("debug", message.toString());
CanMessageListener
函数:public void rxedCanMessage()
描述:用于接收到 can 信息的处理接口函数
范例:
public class TestCanHelper implements CanMessageListener {
public final void rxedCanMessage(final CanMessage message)
{
Log.i(TAG, message.toString());
}
}
CanSocket
- 打开can设备
函数:public int canDeviceOpen(final String canDevice)throws IOException描述:打开 can 设备,获取 socket 套接字参数:canDevice can通道返回:socket 套接字,失败返回-1范例:int socket = mCanSocket.canDeviceOpen("can0");
- 初始化接收任务
函数:public void initReceiveTask(final int socket, CanFilter[] filters)描述:初始化接收任务参数:socket 套接字filters 过滤器范例:mCanSocket.initReceiveTask(mRxSocket, filters);
- 开始接收任务
函数:public boolean startReceiveTask()描述:开始接收任务返回:true(成功)/false(失败)范例:boolean result = mCanSocket.startReceiveTask();
- 停止接收任务
函数:public boolean stopReceiveTask()描述:停止接收任务返回:true(成功)/false(失败)范例:boolean result = mCanSocket.stopReceiveTask();
- 发送帧信息
函数:public void transmit(CanMessage message, int socket)throws IOException描述:发送帧信息参数:message 帧信息socket 套接字范例:mCanSocket.transmit(message, mTxSocket);
- 获取接收任务状态
函数:public boolean RxTaskState()描述:获取接收任务状态返回:true 接收任务处于运行状态false 接收任务处于停止状态范例:boolean state = mCanSocket.RxTaskState();
- 关闭can设备
函数:public void closeDevice(final int socket, final String canDevice)描述:关闭can设备参数:canDevice can通道范例:mCanSocket.closeDevice(socket, "can0");
- 添加接收监听器
函数:public void addMessageListener(final CanMessageListener canMessageListener)描述:添加接收监听器参数:canMessageListener 接收监听器范例:mCanSocket.addMessageListener(this);
- 移除接收监听器
函数:public void removeMessageListener(final CanMessageListener canMessageListener)描述:移除接收监听器参数:canMessageListener 接收监听器范例:mCanSocket.removeMessageListener(this);
- 清空接收监听器
函数:public void clearMessageListeners()描述:清空接收监听器范例:mCanSocket.clearMessageListeners();
- 设置波特率
函数:public static boolean setCanBaudRate(String canDevice, String baudrate)描述:设置波特率参数:canDevice can设备baudrate 波特率返回:true(成功)/false(失败)范例:boolean result = CanSocket.setCanBaudRate("can0", "500000"); // can0波特率为500Kbps
- 获取can设备
函数:public static String[] getCanDeviceArr()描述:获取can设备返回:可用的can设备范例:String[] canDeviceArr = CanSocket.getCanDeviceArr();
简单使用范例
import android.util.Log;
import com.firefly.api2.can.CanFilter;
import com.firefly.api2.can.CanMessage;
import com.firefly.api2.can.CanMessageListener;
import com.firefly.api2.can.CanSocket;
import java.io.IOException;
public class CanTest implements CanMessageListener {
private static String TAG = "CanTest";
private CanSocket mCanSocket = new CanSocket();
private int txSocket, rxSocket;
public CanTest(){}
public void send()throws IOException {
boolean isEFF = false;
boolean isRTR = false;
int id = 0x100;
byte[] data = new byte[] {(byte)1, (byte)2, (byte)3, (byte)4, (byte)5, (byte)6,(byte)7, (byte)8};
CanMessage message = new CanMessage(isEFF, isRTR, id, data);
CanSocket.setCanBaudRate("can0", "500000");
txSocket = mCanSocket.canDeviceOpen("can0");
mCanSocket.transmit(message,txSocket);
mCanSocket.closeDevice(txSocket, "can0");
}
public void receive()throws IOException{
CanFilter[] filter = new CanFilter[0];
CanSocket.setCanBaudRate("can1", "500000");
int rxSocket = mCanSocket.canDeviceOpen("can1");
mCanSocket.initReceiveTask(rxSocket, filter);
mCanSocket.clearMessageListeners();
mCanSocket.addMessageListener(this);
mCanSocket.startReceiveTask();
}
public void stopTask(){
mCanSocket.stopReceiveTask();
mCanSocket.removeMessageListener(this);
mCanSocket.closeDevice(rxSocket, "can1");
}
@Override
public void rxedCanMessage(final CanMessage message){
Log.d(TAG, "rxedCanMessage: " + message.toString());
}
}