前段时间做了一个移动开发的嵌入式项目,目前有时间所以写这篇博客,第一次写,多有不对望指正
好入正题,希望通俗易懂
安卓系统是架构在Linux上的,如果要将一个串口设备让应用层APP识别,或者说将数据读取出来应该有一下的几个必要的事要做
1、APP是用java写的,因此要实现Java调用C/Cpp代码,
2、应该有C/Cpp编写的Linux应用
3、应该有Linux驱动
4、应该要定义协议
——————————————————————————————>
上面的4步实际上google[今天这小伙18岁了],在设计安卓的时候已经做好了,我们只需要依葫芦画瓢而已。
1、 实际上是android的JNI开发,有两种方式:NDK和直接使用CPP写一个native方法的调用表然后再JNI代码中实现。
2、 这就对应着android中的HAL开发,和开发Linux的应用是一样的。
3、 这个通常不需要去开发,因为linux自带PL2303的USB转串口的驱动,如果是纯粹的串口设备的话需要自己去开发驱动。
4、协议的定义是许多外设IC和SOC通信时必须做的如GPRS模块的AT指令,GPS的nema数据,但是这里指的是和Cyber_M0板子通信的协议。
——————————————————————————————>
设计的思路是这四步,但是凡事总有仙人发明的轮子,linux哲学就是不要发明重复的轮子,哈哈,实际上android的GPS代码和我们要开发的几乎是一样的。
一、 JNI的开发:(设计从简,因为把握主线理解这种移动开发模式为主,不再模仿GPS那种直接将他做成安卓的服务,做成Framework层的东西)。
static JNINativeMethod zgbMethods[] = {
{
"InitZgb", "()I", (void *)Init_zgb},
{
"CloseZgb", "()I", (void *)close_zgb},
{
"Ledctrl", "(I)I", (void *)Ledctrl_zgb},
{
"Fanctrl", "(I)I", (void *)Fanctrl_zgb},
};
代码只设计打开四个native的接口。
InitZgb:负责初始化设备,主要是打开设备节点,绑定串口的一次参数。
/*------------------------------------------------------
注册相应的回调方法
加载HAL库
获取HAL的接口
打开设备创建设备节点
成功返回0
失败返回-1
------------------------------------------------------*/
jint Init_zgb(JNIEnv *env, jobject thiz)
{
ALOGD("-----%s--------\n", __FUNCTION__);
jint ret,err;
/*将从主线程传递过来的对象做成本地全局的*/
if (!mCallbacksObj)
mCallbacksObj = env->NewGlobalRef(thiz);
if (!mCallbacksObj)
ALOGD("mCallbacksObj get error \n");
#ifdef NEVER/*这里将数据单独做成一个类在JNI无法找到,水很深没研究透*/
jclass SensorCls = env->FindClass(
"com/wl/zgb/bean/SensorData");
#else/*因为接口简单所以Java里面的方法设计在native类里面*/
jclass SensorCls = env->FindClass(
"com/android/zgb/ZgbComCtrl");
#endif
method_reportHumTemp = env->GetMethodID(SensorCls, "ReportHumTemp", "(Ljava/lang/String;)V");
ret