• 大小: 656KB
    文件类型: .zip
    金币: 2
    下载: 1 次
    发布日期: 2021-06-24
  • 语言: Java
  • 标签: Android  JNI  串口  

资源简介

Android串口工具源码,通过JNI实现串口的连接,发送数据,接收数据。不需要第三方包就可以实现我们自己的串口功能

资源截图

代码片段和文件信息


/**
 * 由于要用到串口硬件,但android没有串口相关的API函数,所以就必须用到JNI层来控制串口设备。
 * 这里用到的都是LINUX编程。还有一些JNI函数。
 *
 * @author Hong
 */
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include “com_CES_SerialPort_SerialPort.h“


#define LOGI(...)  __android_log_print(ANDROID_LOG_INFO “SerialPort_JNI“ __VA_ARGS__)
#define LOGE(...)  __android_log_print(ANDROID_LOG_ERROR “SerialPort_JNI“ __VA_ARGS__)

static speed_t getBaudrate(jint baudrate);

int serial = -1;
int isInit = 0;

/**
 * 与SerialPort.java中的open(String path int baudrate)函数相关联。
 * 作用是打开串口设备
 */
JNIEXPORT jobject JNICALL Java_com_CES_SerialPort_SerialPort_open
  (JNIEnv *env jobject object jstring deviceName jint baudrate)
{
// 获取String的字符。不能直接的用device = deviceName;最后还要释放device指针。
const char *device = (*env)->GetStringUTFChars(env deviceName 0);
LOGI(“Device=%s BaudRate= %d“ device baudrate);

// 打开设备
int fd = open(device O_RDWR);
if (-1 == fd) {
LOGE(“Can‘t Open %s[%d]: %s“ device errno strerror(errno));
goto exit;
}

speed_t speed = getBaudrate(baudrate);
if (speed == -1) {
LOGE(“Invalid baudrate“);
goto exit;
}

//设置串口参数
struct termios Opt;
tcgetattr(fd &Opt);
cfmakeraw(&Opt);
tcflush(fd TCIFLUSH);
cfsetispeed(&Opt speed);
cfsetospeed(&Opt speed);

Opt.c_cflag |= CS8;
Opt.c_cflag &= ~PARENB;
Opt.c_oflag &= ~(OPOST);
Opt.c_cflag &= ~CSTOPB;
Opt.c_lflag &= ~(ICANON | ISIG | ECHO | IEXTEN);
Opt.c_iflag &= ~(INPCK | BRKINT | ICRNL | ISTRIP | IXON);
Opt.c_cc[VMIN] = 0;
Opt.c_cc[VTIME] = 0;

if (tcsetattr(fd TCSANOW &Opt) != 0) {
LOGE(“SetupSerial![%d]: %s“ errno strerror(errno));
goto exit;
}

// 用JNI函数创建一个FileDescriptor类的实例
jclass cls = (*env)->FindClass(env “java/io/FileDescriptor“);
jmethodID initId = (*env)->GetMethodID(env cls ““ “()V“);
jfieldID fieldId = (*env)->GetFieldID(env cls “descriptor“ “I“);
jobject obj = (*env)->Newobject(env cls initId);
(*env)->SetIntField(env obj fieldId (jint)fd);

// 记录设备ID
serial = fd;
isInit = 1;
// 用完这个device指针后要释放。
(*env)->ReleaseStringUTFChars(env deviceName device);
LOGI(“Open fd=%d“ fd);
return obj;

exit: // 错误跳转处。
if(fd != -1)
close(fd); //关闭设备
isInit = 0;
// 用完这个device指针后要释放。
(*env)->ReleaseStringUTFChars(env deviceName device);
return NULL;
}

/**
 * 与SerialPort.java中的close(FileDescriptor fd);函数相关联。
 * 作用是关闭串口设备。
 */
JNIEXPORT jboolean JNICALL Java_com_CES_SerialPort_SerialPort_close
  (JNIEnv *env jobject object jobject descriptor)
{
if(descriptor != NULL) {
// 用JNI函数来得到参数descriptor里的“descriptor”属性值。
// “descriptor”属性是在FileDescriptor类里的。
jclass cls = (*env)->FindClass(env “java/io/FileDescriptor“);
jfieldID fieldId = (*env)->GetFieldID(env cls “descriptor“ “I“);
jint fd = (*env)->GetIntField(env descriptor fieldId);
LOGI(“Close fd=%d“ fd);
// 关闭设备。
close(fd);
}

serial = -1;
isInit = 0;
retu

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2016-04-20 08:57  SerialPort\
     文件         364  2013-07-08 17:01  SerialPort\.classpath
     文件        1187  2013-08-22 14:19  SerialPort\.project
     文件         876  2013-07-08 17:01  SerialPort\AndroidManifest.xml
     目录           0  2016-12-14 15:37  SerialPort\assets\
     目录           0  2014-05-07 18:15  SerialPort\bin\
     文件      210307  2014-01-08 16:29  SerialPort\bin\SerialPort.apk
     文件       51394  2013-07-08 17:01  SerialPort\ic_launcher-web.png
     目录           0  2016-04-20 08:57  SerialPort\jni\
     文件         213  2013-07-08 17:05  SerialPort\jni\Android.mk
     文件         773  2013-07-08 17:11  SerialPort\jni\com_CES_SerialPort_SerialPort.h
     文件        4388  2014-01-08 16:11  SerialPort\jni\serial_port.c
     目录           0  2014-05-07 17:29  SerialPort\libs\
     文件      393154  2013-07-08 17:01  SerialPort\libs\android-support-v4.jar
     目录           0  2016-04-20 08:57  SerialPort\libs\armeabi\
     文件       13436  2014-01-08 16:11  SerialPort\libs\armeabi\libSerialPort.so
     文件         781  2013-07-08 17:01  SerialPort\proguard-project.txt
     文件         563  2013-07-08 17:01  SerialPort\project.properties
     目录           0  2014-05-07 17:29  SerialPort\res\
     目录           0  2014-05-07 17:29  SerialPort\res\drawable-hdpi\
     文件        7658  2013-07-08 17:01  SerialPort\res\drawable-hdpi\ic_launcher.png
     目录           0  2016-12-14 15:37  SerialPort\res\drawable-ldpi\
     目录           0  2014-05-07 17:29  SerialPort\res\drawable-mdpi\
     文件        3777  2013-07-08 17:01  SerialPort\res\drawable-mdpi\ic_launcher.png
     目录           0  2014-05-07 17:29  SerialPort\res\drawable-xhdpi\
     文件       12516  2013-07-08 17:01  SerialPort\res\drawable-xhdpi\ic_launcher.png
     目录           0  2014-05-07 17:29  SerialPort\res\drawable-xxhdpi\
     文件       24777  2013-07-08 17:01  SerialPort\res\drawable-xxhdpi\ic_launcher.png
     目录           0  2016-04-20 08:57  SerialPort\res\layout\
     文件        3124  2013-07-09 10:40  SerialPort\res\layout\activity_main.xml
     目录           0  2016-04-20 08:57  SerialPort\res\menu\
............此处省略21个文件信息

评论

共有 条评论