From ed6bf90dfec89e474d9fba14c57cab1b765b3d20 Mon Sep 17 00:00:00 2001 From: John Lee Date: Thu, 13 Jun 2019 03:25:15 +0800 Subject: [PATCH 01/18] Update README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 15c9752..d2f54ca 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,4 @@ # Android-SerialPort-API -Google官方的Android串口通信Demo,修改成Android Studio项目 用这个API写的一个小工具 https://github.com/licheedev/Android-SerialPort-Tool From 2cbea74cee36d66e380d0e34ed2022f2f6a903d0 Mon Sep 17 00:00:00 2001 From: John Lee Date: Mon, 17 Jun 2019 09:10:23 +0800 Subject: [PATCH 02/18] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d2f54ca..8b74543 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ allprojects { ``` dependencies { - compile 'com.github.licheedev.Android-SerialPort-API:serialport:1.0.1' + implementation 'com.github.licheedev.Android-SerialPort-API:serialport:1.0.1' } ``` From 112ebc610f827515cbab4559201a911d5e298221 Mon Sep 17 00:00:00 2001 From: licheedev Date: Wed, 3 Jul 2019 09:40:16 +0800 Subject: [PATCH 03/18] =?UTF-8?q?=E9=87=8D=E6=96=B0=E6=8F=90=E4=BA=A41.0.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index ae2d444..8c43433 100644 --- a/build.gradle +++ b/build.gradle @@ -2,8 +2,8 @@ buildscript { repositories { - jcenter() google() + jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.1.3' @@ -15,8 +15,8 @@ buildscript { allprojects { repositories { - jcenter() google() + jcenter() } } From 095453810cf11271e3791678e99519724d45dd01 Mon Sep 17 00:00:00 2001 From: licheedev Date: Wed, 3 Jul 2019 10:04:34 +0800 Subject: [PATCH 04/18] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=9E=84=E5=BB=BA?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 6 +++--- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/build.gradle b/build.gradle index 8c43433..09729ea 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.1.3' + classpath 'com.android.tools.build:gradle:3.2.1' classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files @@ -25,10 +25,10 @@ task clean(type: Delete) { } ext { - compileSdkVersion = 27 + compileSdkVersion = 28 minSdkVersion = 8 - targetSdkVersion = 27 + targetSdkVersion = 28 versionCode = 2 versionName = "1.0.1" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 5159e9d..8afa263 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Fri Aug 03 19:41:33 CST 2018 +#Wed Jul 03 10:00:36 CST 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip From 18733925d9e1765a679c457389781ea3143915fc Mon Sep 17 00:00:00 2001 From: John Lee Date: Wed, 13 Nov 2019 10:44:32 +0800 Subject: [PATCH 05/18] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 8b74543..903fb1a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ # Android-SerialPort-API 用这个API写的一个小工具 https://github.com/licheedev/Android-SerialPort-Tool +基于这个API封装的库[SerialWroker](https://github.com/licheedev/SerialWorker) + [![](https://jitpack.io/v/licheedev/Android-SerialPort-API.svg)](https://jitpack.io/#licheedev/Android-SerialPort-API) From f9c1b0010fb217b92fe27de87ed5f081b19b220a Mon Sep 17 00:00:00 2001 From: John Lee Date: Wed, 13 Nov 2019 10:44:56 +0800 Subject: [PATCH 06/18] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 903fb1a..3e9d82f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # Android-SerialPort-API 用这个API写的一个小工具 https://github.com/licheedev/Android-SerialPort-Tool + 基于这个API封装的库[SerialWroker](https://github.com/licheedev/SerialWorker) From db496a9853257bdf30582a230e3c2a139e3d0bf1 Mon Sep 17 00:00:00 2001 From: John Lee Date: Wed, 13 Nov 2019 10:50:18 +0800 Subject: [PATCH 07/18] Update README.md --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 3e9d82f..132249c 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,8 @@ # Android-SerialPort-API -用这个API写的一个小工具 https://github.com/licheedev/Android-SerialPort-Tool - -基于这个API封装的库[SerialWroker](https://github.com/licheedev/SerialWorker) +用这个API写的一个小工具 [Android-SerialPort-Tool](https://github.com/licheedev/Android-SerialPort-Tool) +基于这个API封装的库 [SerialWroker](https://github.com/licheedev/SerialWorker),有分包、粘包疑惑的,可以参考一下里面的DEMO [![](https://jitpack.io/v/licheedev/Android-SerialPort-API.svg)](https://jitpack.io/#licheedev/Android-SerialPort-API) From fc65d18ec23851e6611cf448db8af5229f4ac72c Mon Sep 17 00:00:00 2001 From: licheedev Date: Tue, 19 Nov 2019 15:16:00 +0800 Subject: [PATCH 08/18] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=8F=AF=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=95=B0=E6=8D=AE=E4=BD=8D=E3=80=81=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E4=BD=8D=E3=80=81=E5=81=9C=E6=AD=A2=E4=BD=8D=20=E5=8F=82?= =?UTF-8?q?=E8=80=83=20https://juejin.im/post/5c010a19e51d456ac27b40fc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 25 +- build.gradle | 2 +- .../serialport/sample/Application.java | 24 +- serialport/src/main/cpp/SerialPort.c | 310 +++++++++++------- serialport/src/main/cpp/SerialPort.h | 15 +- .../java/android/serialport/SerialPort.java | 142 ++++++-- serialport_bin/.gitignore | 1 - serialport_bin/build.gradle | 32 -- serialport_bin/proguard-rules.pro | 25 -- serialport_bin/src/main/AndroidManifest.xml | 10 - .../java/android/serialport/SerialPort.java | 113 ------- .../android/serialport/SerialPortFinder.java | 128 -------- .../main/jniLibs/arm64-v8a/libserial_port.so | Bin 9904 -> 0 bytes .../jniLibs/armeabi-v7a/libserial_port.so | Bin 9632 -> 0 bytes .../main/jniLibs/armeabi/libserial_port.so | Bin 9628 -> 0 bytes .../src/main/jniLibs/mips/libserial_port.so | Bin 71224 -> 0 bytes .../src/main/jniLibs/mips64/libserial_port.so | Bin 10480 -> 0 bytes .../src/main/jniLibs/x86/libserial_port.so | Bin 5476 -> 0 bytes .../src/main/jniLibs/x86_64/libserial_port.so | Bin 10176 -> 0 bytes .../src/main/res/values/strings.xml | 3 - 20 files changed, 362 insertions(+), 468 deletions(-) delete mode 100644 serialport_bin/.gitignore delete mode 100644 serialport_bin/build.gradle delete mode 100644 serialport_bin/proguard-rules.pro delete mode 100644 serialport_bin/src/main/AndroidManifest.xml delete mode 100644 serialport_bin/src/main/java/android/serialport/SerialPort.java delete mode 100644 serialport_bin/src/main/java/android/serialport/SerialPortFinder.java delete mode 100644 serialport_bin/src/main/jniLibs/arm64-v8a/libserial_port.so delete mode 100644 serialport_bin/src/main/jniLibs/armeabi-v7a/libserial_port.so delete mode 100644 serialport_bin/src/main/jniLibs/armeabi/libserial_port.so delete mode 100644 serialport_bin/src/main/jniLibs/mips/libserial_port.so delete mode 100644 serialport_bin/src/main/jniLibs/mips64/libserial_port.so delete mode 100644 serialport_bin/src/main/jniLibs/x86/libserial_port.so delete mode 100644 serialport_bin/src/main/jniLibs/x86_64/libserial_port.so delete mode 100644 serialport_bin/src/main/res/values/strings.xml diff --git a/README.md b/README.md index 132249c..82016c1 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,5 @@ # Android-SerialPort-API -用这个API写的一个小工具 [Android-SerialPort-Tool](https://github.com/licheedev/Android-SerialPort-Tool) - -基于这个API封装的库 [SerialWroker](https://github.com/licheedev/SerialWorker),有分包、粘包疑惑的,可以参考一下里面的DEMO - [![](https://jitpack.io/v/licheedev/Android-SerialPort-API.svg)](https://jitpack.io/#licheedev/Android-SerialPort-API) **Gradle 引用** @@ -23,7 +19,7 @@ allprojects { ``` dependencies { - implementation 'com.github.licheedev.Android-SerialPort-API:serialport:1.0.1' + implementation 'com.github.licheedev.Android-SerialPort-API:serialport:2.0.0' } ``` @@ -34,3 +30,22 @@ dependencies { // 可通过此方法修改 SerialPort.setSuPath("/system/xbin/su"); ``` + +**可选配置数据位、校验位、停止位** + +实现方式参考 +> https://juejin.im/post/5c010a19e51d456ac27b40fc + +```java + +// 默认8N1(8数据位、无校验位、1停止位) +SerialPort serialPort = SerialPort.newBuilder(path, baudrate).build(); + +// 7E2(7数据位、偶校验、2停止位) +SerialPort serialPort = SerialPort // + .newBuilder(path, baudrate) // 串口地址地址,波特率 + .parity(2) // 校验位;0:无校验位(NONE,默认);1:奇校验位(ODD);2:偶校验位(EVEN) + .dataBits(7) // 数据位,默认8;可选值为5~8 + .stopBits(2) // 停止位,默认1;1:1位停止位;2:2位停止位 + .build(); +``` diff --git a/build.gradle b/build.gradle index 09729ea..4b0c6dd 100644 --- a/build.gradle +++ b/build.gradle @@ -31,5 +31,5 @@ ext { targetSdkVersion = 28 versionCode = 2 - versionName = "1.0.1" + versionName = "2.0.0" } \ No newline at end of file diff --git a/sample/src/main/java/android/serialport/sample/Application.java b/sample/src/main/java/android/serialport/sample/Application.java index e58cf46..a5c3ab3 100644 --- a/sample/src/main/java/android/serialport/sample/Application.java +++ b/sample/src/main/java/android/serialport/sample/Application.java @@ -1,17 +1,17 @@ /* * Copyright 2009 Cedric Priscal - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. */ package android.serialport.sample; @@ -19,7 +19,6 @@ import android.content.SharedPreferences; import android.serialport.SerialPort; import android.serialport.SerialPortFinder; -import java.io.File; import java.io.IOException; import java.security.InvalidParameterException; @@ -38,13 +37,22 @@ public SerialPort getSerialPort() String path = sp.getString("DEVICE", ""); int baudrate = Integer.decode(sp.getString("BAUDRATE", "-1")); - /* Check parameters */ + /* Check parameters */ if ((path.length() == 0) || (baudrate == -1)) { throw new InvalidParameterException(); } - /* Open the serial port */ - mSerialPort = new SerialPort(new File(path), baudrate, 0); + /* Open the serial port */ + //mSerialPort = new SerialPort(new File(path), baudrate, 0); + + SerialPort serialPort = SerialPort // + .newBuilder(path, baudrate) // 串口地址地址,波特率 + .parity(2) // 校验位;0:无校验位(NONE,默认);1:奇校验位(ODD);2:偶校验位(EVEN) + .dataBits(7) // 数据位,默认8;可选值为5~8 + .stopBits(2) // 停止位,默认1;1:1位停止位;2:2位停止位 + .build(); + + mSerialPort = serialPort; } return mSerialPort; } diff --git a/serialport/src/main/cpp/SerialPort.c b/serialport/src/main/cpp/SerialPort.c index 7211cd9..07049cb 100644 --- a/serialport/src/main/cpp/SerialPort.c +++ b/serialport/src/main/cpp/SerialPort.c @@ -25,47 +25,79 @@ #include "SerialPort.h" #include "android/log.h" -static const char *TAG="serial_port"; + +static const char *TAG = "serial_port"; #define LOGI(fmt, args...) __android_log_print(ANDROID_LOG_INFO, TAG, fmt, ##args) #define LOGD(fmt, args...) __android_log_print(ANDROID_LOG_DEBUG, TAG, fmt, ##args) #define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, TAG, fmt, ##args) -static speed_t getBaudrate(jint baudrate) -{ - switch(baudrate) { - case 0: return B0; - case 50: return B50; - case 75: return B75; - case 110: return B110; - case 134: return B134; - case 150: return B150; - case 200: return B200; - case 300: return B300; - case 600: return B600; - case 1200: return B1200; - case 1800: return B1800; - case 2400: return B2400; - case 4800: return B4800; - case 9600: return B9600; - case 19200: return B19200; - case 38400: return B38400; - case 57600: return B57600; - case 115200: return B115200; - case 230400: return B230400; - case 460800: return B460800; - case 500000: return B500000; - case 576000: return B576000; - case 921600: return B921600; - case 1000000: return B1000000; - case 1152000: return B1152000; - case 1500000: return B1500000; - case 2000000: return B2000000; - case 2500000: return B2500000; - case 3000000: return B3000000; - case 3500000: return B3500000; - case 4000000: return B4000000; - default: return -1; - } +static speed_t getBaudrate(jint baudrate) { + switch (baudrate) { + case 0: + return B0; + case 50: + return B50; + case 75: + return B75; + case 110: + return B110; + case 134: + return B134; + case 150: + return B150; + case 200: + return B200; + case 300: + return B300; + case 600: + return B600; + case 1200: + return B1200; + case 1800: + return B1800; + case 2400: + return B2400; + case 4800: + return B4800; + case 9600: + return B9600; + case 19200: + return B19200; + case 38400: + return B38400; + case 57600: + return B57600; + case 115200: + return B115200; + case 230400: + return B230400; + case 460800: + return B460800; + case 500000: + return B500000; + case 576000: + return B576000; + case 921600: + return B921600; + case 1000000: + return B1000000; + case 1152000: + return B1152000; + case 1500000: + return B1500000; + case 2000000: + return B2000000; + case 2500000: + return B2500000; + case 3000000: + return B3000000; + case 3500000: + return B3500000; + case 4000000: + return B4000000; + default: + return -1; + } } /* @@ -74,74 +106,123 @@ static speed_t getBaudrate(jint baudrate) * Signature: (Ljava/lang/String;II)Ljava/io/FileDescriptor; */ JNIEXPORT jobject JNICALL Java_android_serialport_SerialPort_open - (JNIEnv *env, jclass thiz, jstring path, jint baudrate, jint flags) -{ - int fd; - speed_t speed; - jobject mFileDescriptor; - - /* Check arguments */ - { - speed = getBaudrate(baudrate); - if (speed == -1) { - /* TODO: throw an exception */ - LOGE("Invalid baudrate"); - return NULL; - } - } - - /* Opening device */ - { - jboolean iscopy; - const char *path_utf = (*env)->GetStringUTFChars(env, path, &iscopy); - LOGD("Opening serial port %s with flags 0x%x", path_utf, O_RDWR | flags); - fd = open(path_utf, O_RDWR | flags); - LOGD("open() fd = %d", fd); - (*env)->ReleaseStringUTFChars(env, path, path_utf); - if (fd == -1) - { - /* Throw an exception */ - LOGE("Cannot open port"); - /* TODO: throw an exception */ - return NULL; - } - } - - /* Configure device */ - { - struct termios cfg; - LOGD("Configuring serial port"); - if (tcgetattr(fd, &cfg)) - { - LOGE("tcgetattr() failed"); - close(fd); - /* TODO: throw an exception */ - return NULL; - } - - cfmakeraw(&cfg); - cfsetispeed(&cfg, speed); - cfsetospeed(&cfg, speed); - - if (tcsetattr(fd, TCSANOW, &cfg)) - { - LOGE("tcsetattr() failed"); - close(fd); - /* TODO: throw an exception */ - return NULL; - } - } - - /* Create a corresponding file descriptor */ - { - jclass cFileDescriptor = (*env)->FindClass(env, "java/io/FileDescriptor"); - jmethodID iFileDescriptor = (*env)->GetMethodID(env, cFileDescriptor, "", "()V"); - jfieldID descriptorID = (*env)->GetFieldID(env, cFileDescriptor, "descriptor", "I"); - mFileDescriptor = (*env)->NewObject(env, cFileDescriptor, iFileDescriptor); - (*env)->SetIntField(env, mFileDescriptor, descriptorID, (jint)fd); - } - - return mFileDescriptor; + (JNIEnv *env, jobject thiz, jstring path, jint baudrate, jint dataBits, jint parity, + jint stopBits, + jint flags) { + + int fd; + speed_t speed; + jobject mFileDescriptor; + + /* Check arguments */ + { + speed = getBaudrate(baudrate); + if (speed == -1) { + /* TODO: throw an exception */ + LOGE("Invalid baudrate"); + return NULL; + } + } + + /* Opening device */ + { + jboolean iscopy; + const char *path_utf = (*env)->GetStringUTFChars(env, path, &iscopy); + LOGD("Opening serial port %s with flags 0x%x", path_utf, O_RDWR | flags); + fd = open(path_utf, O_RDWR | flags); + LOGD("open() fd = %d", fd); + (*env)->ReleaseStringUTFChars(env, path, path_utf); + if (fd == -1) { + /* Throw an exception */ + LOGE("Cannot open port"); + /* TODO: throw an exception */ + return NULL; + } + } + + /* Configure device */ + { + struct termios cfg; + LOGD("Configuring serial port"); + if (tcgetattr(fd, &cfg)) { + LOGE("tcgetattr() failed"); + close(fd); + /* TODO: throw an exception */ + return NULL; + } + + cfmakeraw(&cfg); + cfsetispeed(&cfg, speed); + cfsetospeed(&cfg, speed); + + + cfg.c_cflag &= ~CSIZE; + switch (dataBits) { + case 5: + cfg.c_cflag |= CS5; //使用5位数据位 + break; + case 6: + cfg.c_cflag |= CS6; //使用6位数据位 + break; + case 7: + cfg.c_cflag |= CS7; //使用7位数据位 + break; + case 8: + cfg.c_cflag |= CS8; //使用8位数据位 + break; + default: + cfg.c_cflag |= CS8; + break; + } + + switch (parity) { + case 0: + cfg.c_cflag &= ~PARENB; //无奇偶校验 + break; + case 1: + cfg.c_cflag |= (PARODD | PARENB); //奇校验 + break; + case 2: + cfg.c_iflag &= ~(IGNPAR | PARMRK); // 偶校验 + cfg.c_iflag |= INPCK; + cfg.c_cflag |= PARENB; + cfg.c_cflag &= ~PARODD; + break; + default: + cfg.c_cflag &= ~PARENB; + break; + } + + switch (stopBits) { + case 1: + cfg.c_cflag &= ~CSTOPB; //1位停止位 + break; + case 2: + cfg.c_cflag |= CSTOPB; //2位停止位 + break; + default: + cfg.c_cflag &= ~CSTOPB; //1位停止位 + break; + } + + if (tcsetattr(fd, TCSANOW, &cfg)) { + LOGE("tcsetattr() failed"); + close(fd); + /* TODO: throw an exception */ + return NULL; + } + } + + /* Create a corresponding file descriptor */ + { + jclass cFileDescriptor = (*env)->FindClass(env, "java/io/FileDescriptor"); + jmethodID iFileDescriptor = (*env)->GetMethodID(env, cFileDescriptor, "", "()V"); + jfieldID descriptorID = (*env)->GetFieldID(env, cFileDescriptor, "descriptor", "I"); + mFileDescriptor = (*env)->NewObject(env, cFileDescriptor, iFileDescriptor); + (*env)->SetIntField(env, mFileDescriptor, descriptorID, (jint) fd); + } + + return mFileDescriptor; } /* @@ -150,18 +231,17 @@ JNIEXPORT jobject JNICALL Java_android_serialport_SerialPort_open * Signature: ()V */ JNIEXPORT void JNICALL Java_android_serialport_SerialPort_close - (JNIEnv *env, jobject thiz) -{ - jclass SerialPortClass = (*env)->GetObjectClass(env, thiz); - jclass FileDescriptorClass = (*env)->FindClass(env, "java/io/FileDescriptor"); + (JNIEnv *env, jobject thiz) { + jclass SerialPortClass = (*env)->GetObjectClass(env, thiz); + jclass FileDescriptorClass = (*env)->FindClass(env, "java/io/FileDescriptor"); - jfieldID mFdID = (*env)->GetFieldID(env, SerialPortClass, "mFd", "Ljava/io/FileDescriptor;"); - jfieldID descriptorID = (*env)->GetFieldID(env, FileDescriptorClass, "descriptor", "I"); + jfieldID mFdID = (*env)->GetFieldID(env, SerialPortClass, "mFd", "Ljava/io/FileDescriptor;"); + jfieldID descriptorID = (*env)->GetFieldID(env, FileDescriptorClass, "descriptor", "I"); - jobject mFd = (*env)->GetObjectField(env, thiz, mFdID); - jint descriptor = (*env)->GetIntField(env, mFd, descriptorID); + jobject mFd = (*env)->GetObjectField(env, thiz, mFdID); + jint descriptor = (*env)->GetIntField(env, mFd, descriptorID); - LOGD("close(fd = %d)", descriptor); - close(descriptor); + LOGD("close(fd = %d)", descriptor); + close(descriptor); } diff --git a/serialport/src/main/cpp/SerialPort.h b/serialport/src/main/cpp/SerialPort.h index 76638ab..bed2cc7 100644 --- a/serialport/src/main/cpp/SerialPort.h +++ b/serialport/src/main/cpp/SerialPort.h @@ -10,10 +10,10 @@ extern "C" { /* * Class: android_serialport_SerialPort * Method: open - * Signature: (Ljava/lang/String;II)Ljava/io/FileDescriptor; + * Signature: (Ljava/lang/String;IIIII)Ljava/io/FileDescriptor; */ JNIEXPORT jobject JNICALL Java_android_serialport_SerialPort_open - (JNIEnv *, jclass, jstring, jint, jint); + (JNIEnv *, jobject, jstring, jint, jint, jint, jint, jint); /* * Class: android_serialport_SerialPort @@ -27,3 +27,14 @@ JNIEXPORT void JNICALL Java_android_serialport_SerialPort_close } #endif #endif +/* Header for class android_serialport_SerialPort_Builder */ + +#ifndef _Included_android_serialport_SerialPort_Builder +#define _Included_android_serialport_SerialPort_Builder +#ifdef __cplusplus +extern "C" { +#endif +#ifdef __cplusplus +} +#endif +#endif diff --git a/serialport/src/main/java/android/serialport/SerialPort.java b/serialport/src/main/java/android/serialport/SerialPort.java index cc189d2..7633b3c 100644 --- a/serialport/src/main/java/android/serialport/SerialPort.java +++ b/serialport/src/main/java/android/serialport/SerialPort.java @@ -1,17 +1,17 @@ /* * Copyright 2009 Cedric Priscal - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. */ package android.serialport; @@ -25,11 +25,11 @@ import java.io.InputStream; import java.io.OutputStream; -public class SerialPort { +public final class SerialPort { private static final String TAG = "SerialPort"; - private static final String DEFAULT_SU_PATH = "/system/bin/su"; + public static final String DEFAULT_SU_PATH = "/system/bin/su"; private static String sSuPath = DEFAULT_SU_PATH; @@ -45,16 +45,38 @@ public static void setSuPath(String suPath) { sSuPath = suPath; } + /** + * Get the su binary path + * + * @return + */ + public static String getSuPath() { + return sSuPath; + } + /* - * Do not remove or rename the field mFd: it is used by native method close(); - */ + * Do not remove or rename the field mFd: it is used by native method close(); + */ private FileDescriptor mFd; private FileInputStream mFileInputStream; private FileOutputStream mFileOutputStream; - public SerialPort(File device, int baudrate, int flags) throws SecurityException, IOException { + /** + * 串口 + * + * @param device 串口设备文件 + * @param baudrate 波特率 + * @param dataBits 数据位,默认8 + * @param parity 奇偶校验位,默认0(无校验) + * @param stopBits 停止位,默认1 + * @param flags 默认0 + * @throws SecurityException + * @throws IOException + */ + private SerialPort(File device, int baudrate, int dataBits, int parity, int stopBits, int flags) + throws SecurityException, IOException { - /* Check access permission */ + /* Check access permission */ if (!device.canRead() || !device.canWrite()) { try { /* Missing read/write permission, trying to chmod the file */ @@ -71,7 +93,7 @@ public SerialPort(File device, int baudrate, int flags) throws SecurityException } } - mFd = open(device.getAbsolutePath(), baudrate, flags); + mFd = open(device.getAbsolutePath(), baudrate, dataBits, parity, stopBits, flags); if (mFd == null) { Log.e(TAG, "native open returns null"); throw new IOException(); @@ -80,19 +102,6 @@ public SerialPort(File device, int baudrate, int flags) throws SecurityException mFileOutputStream = new FileOutputStream(mFd); } - public SerialPort(String devicePath, int baudrate, int flags) - throws SecurityException, IOException { - this(new File(devicePath), baudrate, flags); - } - - public SerialPort(File device, int baudrate) throws SecurityException, IOException { - this(device, baudrate, 0); - } - - public SerialPort(String devicePath, int baudrate) throws SecurityException, IOException { - this(new File(devicePath), baudrate, 0); - } - // Getters and setters public InputStream getInputStream() { return mFileInputStream; @@ -103,11 +112,94 @@ public OutputStream getOutputStream() { } // JNI - private native static FileDescriptor open(String path, int baudrate, int flags); + private native FileDescriptor open(String absolutePath, int baudrate, int dataBits, int parity, + int stopBits, int flags); public native void close(); static { System.loadLibrary("serial_port"); } + + public static Builder newBuilder(File device, int baudrate) { + return new Builder(device, baudrate); + } + + public static Builder newBuilder(String devicePath, int baudrate) { + return new Builder(devicePath, baudrate); + } + + public final static class Builder { + + private File device; + private int baudrate; + private int dataBits = 8; + private int parity = 0; + private int stopBits = 1; + private int flags = 0; + + private Builder(File device, int baudrate) { + this.device = device; + this.baudrate = baudrate; + } + + private Builder(String devicePath, int baudrate) { + this(new File(devicePath), baudrate); + } + + /** + * 数据位 + * + * @param dataBits 默认8,可选值为5~8 + * @return + */ + public Builder dataBits(int dataBits) { + this.dataBits = dataBits; + return this; + } + + /** + * 校验位 + * + * @param parity 0:无校验位(NONE,默认);1:奇校验位(ODD);2:偶校验位(EVEN) + * @return + */ + public Builder parity(int parity) { + this.parity = parity; + return this; + } + + /** + * 停止位 + * + * @param stopBits 默认1;1:1位停止位;2:2位停止位 + * @return + */ + public Builder stopBits(int stopBits) { + this.stopBits = stopBits; + return this; + } + + /** + * 标志 + * + * @param flags 默认0 + * @return + */ + public Builder flags(int flags) { + this.flags = flags; + return this; + } + + /** + * 打开并返回串口 + * + * @return + * @throws SecurityException + * @throws IOException + */ + public SerialPort build() throws SecurityException, IOException { + return new SerialPort(device, baudrate, dataBits, parity, stopBits, flags); + } + } } diff --git a/serialport_bin/.gitignore b/serialport_bin/.gitignore deleted file mode 100644 index 796b96d..0000000 --- a/serialport_bin/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/serialport_bin/build.gradle b/serialport_bin/build.gradle deleted file mode 100644 index 44832c7..0000000 --- a/serialport_bin/build.gradle +++ /dev/null @@ -1,32 +0,0 @@ -apply plugin: 'com.android.library' - -android { - compileSdkVersion rootProject.ext.compileSdkVersion - buildToolsVersion rootProject.ext.buildToolsVersion - - defaultConfig { - minSdkVersion rootProject.ext.minSdkVersion - targetSdkVersion rootProject.ext.targetSdkVersion - versionCode rootProject.ext.versionCode - versionName rootProject.ext.versionName - - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" - } - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - } -} - -dependencies { -// compile fileTree(dir: 'libs', include: ['*.jar']) -// androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { -// exclude group: 'com.android.support', module: 'support-annotations' -// }) -// compile 'com.android.support:appcompat-v7:25.3.0' -// testCompile 'junit:junit:4.12' -} - -apply from: '../jitpack.gradle' \ No newline at end of file diff --git a/serialport_bin/proguard-rules.pro b/serialport_bin/proguard-rules.pro deleted file mode 100644 index 415e11f..0000000 --- a/serialport_bin/proguard-rules.pro +++ /dev/null @@ -1,25 +0,0 @@ -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in D:\DevTools\Android\sdk/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the proguardFiles -# directive in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# Add any project specific keep options here: - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile diff --git a/serialport_bin/src/main/AndroidManifest.xml b/serialport_bin/src/main/AndroidManifest.xml deleted file mode 100644 index 808f2ee..0000000 --- a/serialport_bin/src/main/AndroidManifest.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/serialport_bin/src/main/java/android/serialport/SerialPort.java b/serialport_bin/src/main/java/android/serialport/SerialPort.java deleted file mode 100644 index cc189d2..0000000 --- a/serialport_bin/src/main/java/android/serialport/SerialPort.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright 2009 Cedric Priscal - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.serialport; - -import android.util.Log; -import java.io.File; -import java.io.FileDescriptor; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -public class SerialPort { - - private static final String TAG = "SerialPort"; - - private static final String DEFAULT_SU_PATH = "/system/bin/su"; - - private static String sSuPath = DEFAULT_SU_PATH; - - /** - * Set the su binary path, the default su binary path is {@link #DEFAULT_SU_PATH} - * - * @param suPath su binary path - */ - public static void setSuPath(String suPath) { - if (suPath == null) { - return; - } - sSuPath = suPath; - } - - /* - * Do not remove or rename the field mFd: it is used by native method close(); - */ - private FileDescriptor mFd; - private FileInputStream mFileInputStream; - private FileOutputStream mFileOutputStream; - - public SerialPort(File device, int baudrate, int flags) throws SecurityException, IOException { - - /* Check access permission */ - if (!device.canRead() || !device.canWrite()) { - try { - /* Missing read/write permission, trying to chmod the file */ - Process su; - su = Runtime.getRuntime().exec(sSuPath); - String cmd = "chmod 666 " + device.getAbsolutePath() + "\n" + "exit\n"; - su.getOutputStream().write(cmd.getBytes()); - if ((su.waitFor() != 0) || !device.canRead() || !device.canWrite()) { - throw new SecurityException(); - } - } catch (Exception e) { - e.printStackTrace(); - throw new SecurityException(); - } - } - - mFd = open(device.getAbsolutePath(), baudrate, flags); - if (mFd == null) { - Log.e(TAG, "native open returns null"); - throw new IOException(); - } - mFileInputStream = new FileInputStream(mFd); - mFileOutputStream = new FileOutputStream(mFd); - } - - public SerialPort(String devicePath, int baudrate, int flags) - throws SecurityException, IOException { - this(new File(devicePath), baudrate, flags); - } - - public SerialPort(File device, int baudrate) throws SecurityException, IOException { - this(device, baudrate, 0); - } - - public SerialPort(String devicePath, int baudrate) throws SecurityException, IOException { - this(new File(devicePath), baudrate, 0); - } - - // Getters and setters - public InputStream getInputStream() { - return mFileInputStream; - } - - public OutputStream getOutputStream() { - return mFileOutputStream; - } - - // JNI - private native static FileDescriptor open(String path, int baudrate, int flags); - - public native void close(); - - static { - System.loadLibrary("serial_port"); - } -} diff --git a/serialport_bin/src/main/java/android/serialport/SerialPortFinder.java b/serialport_bin/src/main/java/android/serialport/SerialPortFinder.java deleted file mode 100644 index 229a984..0000000 --- a/serialport_bin/src/main/java/android/serialport/SerialPortFinder.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright 2009 Cedric Priscal - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.serialport; - -import android.util.Log; -import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.io.LineNumberReader; -import java.util.Iterator; -import java.util.Vector; - -public class SerialPortFinder { - - public class Driver { - public Driver(String name, String root) { - mDriverName = name; - mDeviceRoot = root; - } - - private String mDriverName; - private String mDeviceRoot; - Vector mDevices = null; - - public Vector getDevices() { - if (mDevices == null) { - mDevices = new Vector(); - File dev = new File("/dev"); - - File[] files = dev.listFiles(); - - if (files != null) { - int i; - for (i = 0; i < files.length; i++) { - if (files[i].getAbsolutePath().startsWith(mDeviceRoot)) { - Log.d(TAG, "Found new device: " + files[i]); - mDevices.add(files[i]); - } - } - } - } - return mDevices; - } - - public String getName() { - return mDriverName; - } - } - - private static final String TAG = "SerialPort"; - - private Vector mDrivers = null; - - Vector getDrivers() throws IOException { - if (mDrivers == null) { - mDrivers = new Vector(); - LineNumberReader r = new LineNumberReader(new FileReader("/proc/tty/drivers")); - String l; - while ((l = r.readLine()) != null) { - // Issue 3: - // Since driver name may contain spaces, we do not extract driver name with split() - String drivername = l.substring(0, 0x15).trim(); - String[] w = l.split(" +"); - if ((w.length >= 5) && (w[w.length - 1].equals("serial"))) { - Log.d(TAG, "Found new driver " + drivername + " on " + w[w.length - 4]); - mDrivers.add(new Driver(drivername, w[w.length - 4])); - } - } - r.close(); - } - return mDrivers; - } - - public String[] getAllDevices() { - Vector devices = new Vector(); - // Parse each driver - Iterator itdriv; - try { - itdriv = getDrivers().iterator(); - while (itdriv.hasNext()) { - Driver driver = itdriv.next(); - Iterator itdev = driver.getDevices().iterator(); - while (itdev.hasNext()) { - String device = itdev.next().getName(); - String value = String.format("%s (%s)", device, driver.getName()); - devices.add(value); - } - } - } catch (IOException e) { - e.printStackTrace(); - } - return devices.toArray(new String[devices.size()]); - } - - public String[] getAllDevicesPath() { - Vector devices = new Vector(); - // Parse each driver - Iterator itdriv; - try { - itdriv = getDrivers().iterator(); - while (itdriv.hasNext()) { - Driver driver = itdriv.next(); - Iterator itdev = driver.getDevices().iterator(); - while (itdev.hasNext()) { - String device = itdev.next().getAbsolutePath(); - devices.add(device); - } - } - } catch (IOException e) { - e.printStackTrace(); - } - return devices.toArray(new String[devices.size()]); - } -} diff --git a/serialport_bin/src/main/jniLibs/arm64-v8a/libserial_port.so b/serialport_bin/src/main/jniLibs/arm64-v8a/libserial_port.so deleted file mode 100644 index 29dc82c72793c8180e159b77d77e45eaac6a9f7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9904 zcmeHNeQZVz3c0D-E-HTT~3EXFlgduf;gXUNqkCCSFH#jpV%Tw@qd-5 zkhTkQsyS3gxg}yOq=)r?Ayi#!Eq&KoD+k6WoR*w1`;nOZjw!!m%8#*7evDNaq69v4 zji^%d@p|Y87?Ul*-an^9M2{_#>>PZPB^Hd??@REbJU=d|HVMBPuTWq5Reg+AIkGkv z2GejgeepiAv8?s(bGKdiQPZ!y-?{m;;+K>Nr3XB9+lyux#4?y`AkY@|Tf1!ZA zuYmmB0 AkS9H+D==RZbfW>TSx8hDus;v|eEp|;bUwKV1cKdWpe+(Jqmf6#iZ#>W z?nqjE-aKdq%vdNHkAwoLa57>>yW+`o;LDQSOJpz_PlZ2@VZ19GLv)T7jkgE7l95;% zvQ*j(?hgbz_6OR`NK^#dI?eszr1>zYR5%?;b%nzri;i1#I@lggo9T2?q=T@KR5a3x zn4VNzfa+8@6jel!a3CBq(`82Lg%<$3l`;7>GhzHin-pSJOT1K()l-vi%jI*CpD9Tgu?|s5wqx6pD7}s&sf1JiW>qz`#0pd416HDON^P(dmmIAMKCSHc$ zq_)o6N8{B$TfhS9=ym!fQa=kf4y?lH}VjOr9@wbuwKe--^VXk!JG5zwHIW8H9#LcWqPXI@IbmDjLXX{88-axvYpUxG$l>EU2i)QGO>@qYqkRQ4N&;`GsQRutPLU|1rz|E%>3o$gjfvC(tbpv1wM#zHJ%m zkMuc7K2_e|zz%DvYYcv`fF?Yyt#ZF)qennnbyv8@(VsWK4?FW>_idB$elGng+!uha zYE?sWy}_DOtWS3hUJL9ToLb|X!n&2Ab&cwlHC{wK^jW{r zCwolttLQQ1j{R=G{!QOhmx{~GJ;VbnKy|1VL81M91EaQYh}Lu;v(r(;NeG?zEkgSj56 zMom-?#pQA47%F~^SL%&jSxH`P3o_oI||E(U#OkdErqGYzt@$k{#X9?|RN zz4(r{(!ER0)ucp>$3mMyt4I#0^jK$( zNbH&4XRDAq*cz2+t+4I$@Odj7YqYKO-4t^tPF~Aqw*c$cv)LA40{Tuz;CRF@97onU z)-1uQ1z3-Z{2qjl{O_D*t#SRoZQ0zdl1H}#$J5cOEu>-{p6g!aX0KV5scuisE|B%POoyT8RJe|`K z+^ih&j!6Qar{dj{1YO}zDa`Nd`TVk6$?-l(!W9*d-^~vz1;3N$^I1B#BiN?w>3oj> z@0%phxgWtXelKpZLRa?uJ(S<+^BHA_8i?h470-2We17N8JYzMC_$Zr=6Rn05_zEof zIu$RQr@x~3>#FdnJUz$#f8#Dy`2QNuoR_Ntns)5?oKb_5<62{r=d+$}!&|p;bKOSo z?M6*kGMo%Y!)7X6D;liBG$R-_@#5oPIGKvXW5#Aro#*zty1FfOhEdZB!;k^#o;~~S zv8if>@T59Y>15h$6&}1z347XO2Ry9@BGJ&Tk&y6on5hoo2_1^14s}`>2V~MljWdf0 zK!>zUa!^!PG%Y+h`NRKYTppEq!X1IOq}dq`bcA5fobb?#mVlW|numl3XNM7{5zOq2 z1Tj(^QLGp^VH2KUyt6Zm)4op%^jy%C()$>KLcc?>w6o93NVX0a-IDCj&nM#nG6L}P z#?J{q&+DP19N3?qU&b{`LG~1b{rP#iMakKp*8|4<{KHHFKX1%$0zuCj`}6a~*rNj`77lgDR&mVZ_GH>!ZVJ~8I?jQnX$ z%J;{ah|G)E&-~|_4$17m>oMaHlvEe{`_ur8Pq9J;p<3V)o~Clz)%Jjp4dEACCKD_)<RE37+#daJcpFal$$#{JJU5sw9$84P6zn7pUS>0?i!TxlA+JXJ; Tn8&u;MGcF4)h-0hek}ekGQn&c diff --git a/serialport_bin/src/main/jniLibs/armeabi-v7a/libserial_port.so b/serialport_bin/src/main/jniLibs/armeabi-v7a/libserial_port.so deleted file mode 100644 index 1b4efa09da3349308ccf471dd1ef3cb8a05885c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9632 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%0Dx(dgM;b^&d2;!>&Zj-B=&C0&B6TrhDJj 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 URK1M3ZK-rjA;K-urIgb9A1E3%tpET3 diff --git a/serialport_bin/src/main/jniLibs/mips/libserial_port.so b/serialport_bin/src/main/jniLibs/mips/libserial_port.so deleted file mode 100644 index 707a3219e59b4828583057f00e6a098c08aec653..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71224 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 H_Tv5x8m8YQ diff --git a/serialport_bin/src/main/jniLibs/mips64/libserial_port.so b/serialport_bin/src/main/jniLibs/mips64/libserial_port.so deleted file mode 100644 index 642367f3faf0193dcdedd1eba1950e7bac37eff4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10480 zcmeHNZERcB8Gi3|KAh49w}GY%MsJu+ozfUnTxg*Mhj#sd!osI2G;o~QaSVxV*-lB( zBn$%7KWJ{DU6B|~5p4Unl(7$Ku(gx6!Tzk%_9N3!oo+(o4^o&It+avny!X6s;#`ug z+K*{Ja-y5}`{TUl+;h+Mxles{?@rsYNSlxR#8iBl;lxESd5u9@n`k0Vo2iZBbOo&; zA5ozRqRqCEd*K?fSLhd-V>AoC5a_$ia21l9mHFQS(T8h|{KK^-cZEL@XA0Gh)8jm6 zBu_8w6TU*tlWq8VSL9w8gp8X)*5%gsK{>_vWQR+B0bXU;q)_edg&p_rVp~8I?~{0o z)kW*CaBjpeHj>fPx?qO1*tQG`MC#898@&S2n+tlLFq*1&-m3rYV)Pc&VW#-w`tg*( ze576XJV+0YJGVdc+$|rycJG-(AHRJd`1McnpFlL5=bxBB)4V@0hyGOPc7eBv z;T1yb{JTv;24FK zhNPJ`gRBxdDo~~;X+E&R(9P8aVO?6LKOrBN7IQ*AF0FYYo=a<85YMH%=Hj{Z3ZXS` z_4ki@J(2eon-<|OUxdGY5&oAY&r@7Lv<=YX7FtA~ z)p!i6I*_c4_B&k6s(AQu;TJsoUkktA!~d!9`#k)d@Z%o-i{SHI^R{QeVAZHc{|(_g z9{%@*AMo(G94^bl&kBFW8$6L198V^Ovbp3)_Q^CEGFeWKXUlYFa(^AONO_~H~&5a{U6#){hbWa+jX0+ z+S)Vyvd>RHub(>dN~T(Qxz={U@r5hT*1)Slr`AT(z5ucQT(hY%)$?uzj4P&y)=sg% zo-ot%eHP#|4xbME8Nbgj=(hm-gUF#mKdXfrY zbh5sgCXu(bwa34OqDQu-LRGRt2TxI$MXIRVrB9t*y7; z(G^?oUx&S$bD!*8N`NN>;s1w&fo^? zT$p|Ix19^$M$Xh^)46aNaD!z9zYUvxwiP@qHm}3RPo2SQ5$|}�$c9HR2`yV&d%t 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 diff --git a/serialport_bin/src/main/jniLibs/x86_64/libserial_port.so b/serialport_bin/src/main/jniLibs/x86_64/libserial_port.so deleted file mode 100644 index a9753d6c0a6d614d6613a28769afff9fe4cd052e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10176 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 pIiC4Tu=B0d>)NZi8t)%$E1y4(& diff --git a/serialport_bin/src/main/res/values/strings.xml b/serialport_bin/src/main/res/values/strings.xml deleted file mode 100644 index 0cd6c33..0000000 --- a/serialport_bin/src/main/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - SerialPort - From 0ba13aa64b23c26ea9215fb9923dda79a3ac1997 Mon Sep 17 00:00:00 2001 From: licheedev Date: Tue, 19 Nov 2019 15:39:04 +0800 Subject: [PATCH 09/18] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 82016c1..aa0afce 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ allprojects { ``` dependencies { - implementation 'com.github.licheedev.Android-SerialPort-API:serialport:2.0.0' + implementation 'com.github.licheedev:Android-SerialPort-API:2.0.0' } ``` From 6661aadcf8c5e97794490f0fcf313586f21f6999 Mon Sep 17 00:00:00 2001 From: licheedev Date: Wed, 26 Aug 2020 17:47:00 +0800 Subject: [PATCH 10/18] =?UTF-8?q?=E5=8F=91=E5=B8=83=E5=88=B0jcenter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 19 +--- build.gradle | 11 +-- gradle.properties | 2 + gradle/wrapper/gradle-wrapper.properties | 4 +- jitpack.gradle | 30 ------- sample/build.gradle | 11 +-- .../sample/ExampleInstrumentedTest.java | 4 +- serialport/.gitignore | 1 + serialport/bintray.gradle | 86 +++++++++++++++++++ serialport/build.gradle | 6 +- serialport/src/main/AndroidManifest.xml | 12 +-- .../java/android/serialport/SerialPort.java | 36 +++++++- 12 files changed, 146 insertions(+), 76 deletions(-) delete mode 100644 jitpack.gradle create mode 100644 serialport/bintray.gradle diff --git a/README.md b/README.md index aa0afce..96bb425 100644 --- a/README.md +++ b/README.md @@ -1,25 +1,12 @@ # Android-SerialPort-API -[![](https://jitpack.io/v/licheedev/Android-SerialPort-API.svg)](https://jitpack.io/#licheedev/Android-SerialPort-API) - **Gradle 引用** -1. 在根build.gradle中添加 - -``` -allprojects { - repositories { - ... - maven { url 'https://jitpack.io' } - } -} -``` - -2. 子module添加依赖 +添加依赖 ``` dependencies { - implementation 'com.github.licheedev:Android-SerialPort-API:2.0.0' + implementation 'com.licheedev:android-serialport:2.1.1' } ``` @@ -39,7 +26,7 @@ SerialPort.setSuPath("/system/xbin/su"); ```java // 默认8N1(8数据位、无校验位、1停止位) -SerialPort serialPort = SerialPort.newBuilder(path, baudrate).build(); +SerialPort serialPort = new SerialPort(path, baudrate); // 7E2(7数据位、偶校验、2停止位) SerialPort serialPort = SerialPort // diff --git a/build.gradle b/build.gradle index 4b0c6dd..f73582b 100644 --- a/build.gradle +++ b/build.gradle @@ -6,10 +6,11 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.2.1' - classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' + classpath 'com.android.tools.build:gradle:4.0.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files + classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4' + classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1' } } @@ -25,11 +26,11 @@ task clean(type: Delete) { } ext { - compileSdkVersion = 28 + compileSdkVersion = 29 minSdkVersion = 8 - targetSdkVersion = 28 + targetSdkVersion = 29 versionCode = 2 - versionName = "2.0.0" + versionName = "2.1.1" } \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index aa62a10..567806c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -13,4 +13,6 @@ # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true #Mon Sep 18 19:30:46 CST 2017 +android.enableJetifier=true +android.useAndroidX=true org.gradle.jvmargs=-Xmx1536m diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 8afa263..e95cacb 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Wed Jul 03 10:00:36 CST 2019 +#Wed Aug 26 17:00:59 CST 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip diff --git a/jitpack.gradle b/jitpack.gradle deleted file mode 100644 index 3e87c62..0000000 --- a/jitpack.gradle +++ /dev/null @@ -1,30 +0,0 @@ -apply plugin: 'com.github.dcendents.android-maven' - -group = 'com.github.licheedev' - -tasks.withType(JavaCompile) { - options.encoding = "UTF-8" -} - -task sourcesJar(type: Jar) { - from android.sourceSets.main.java.srcDirs - classifier = 'sources' -} - -task javadoc(type: Javadoc) { - failOnError false - source = android.sourceSets.main.java.sourceFiles - classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) - classpath += configurations.compile -} - - -task javadocJar(type: Jar, dependsOn: javadoc) { - classifier = 'javadoc' - from javadoc.destinationDir -} - -artifacts { - archives sourcesJar - archives javadocJar -} \ No newline at end of file diff --git a/sample/build.gradle b/sample/build.gradle index 85a2529..167098d 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -10,7 +10,7 @@ android { versionCode 1 versionName "1.0" - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' } buildTypes { release { @@ -22,10 +22,11 @@ android { dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') - androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', { + androidTestImplementation('androidx.test.espresso:espresso-core:3.1.0', { exclude group: 'com.android.support', module: 'support-annotations' }) - implementation 'com.android.support:appcompat-v7:27.1.1' - testImplementation 'junit:junit:4.12' - implementation project(':serialport') + implementation 'androidx.appcompat:appcompat:1.2.0' + testImplementation 'junit:junit:4.13' +// implementation project(':serialport') + implementation 'com.licheedev:android-serialport:2.1.1' } diff --git a/sample/src/androidTest/java/android/serialport/sample/ExampleInstrumentedTest.java b/sample/src/androidTest/java/android/serialport/sample/ExampleInstrumentedTest.java index b65e8d8..a7501ea 100644 --- a/sample/src/androidTest/java/android/serialport/sample/ExampleInstrumentedTest.java +++ b/sample/src/androidTest/java/android/serialport/sample/ExampleInstrumentedTest.java @@ -1,8 +1,8 @@ package android.serialport.sample; import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/serialport/.gitignore b/serialport/.gitignore index a222170..968c49e 100644 --- a/serialport/.gitignore +++ b/serialport/.gitignore @@ -1,2 +1,3 @@ /build .externalNativeBuild +.cxx diff --git a/serialport/bintray.gradle b/serialport/bintray.gradle new file mode 100644 index 0000000..fbb21ef --- /dev/null +++ b/serialport/bintray.gradle @@ -0,0 +1,86 @@ +//在根build.gradle中加入 +//classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4' +//classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1' + +//在module的build.gradle末位加入 +//apply from: './bintray.gradle' + +// 执行 ./gradlew clean bintrayUpload + +def toUpload = true // 配置是否上传 +if (toUpload) { + apply plugin: 'com.github.dcendents.android-maven' + apply plugin: 'com.jfrog.bintray' + + // 定义参数 + // 依赖信息 + def groupIdDefined = "com.licheedev" + def artifactIdDefined = "android-serialport" + def versionDefined = rootProject.ext.versionName + // 其他信息 + def siteUrl = "https://github.com/licheedev" + def gitUrl = "https://github.com/licheedev/Android-SerialPort-API.git" + def libName = "$artifactIdDefined" + + // 待发布项目的groupId和version。android-maven-gradle-plugin插件需要这么配置。 + group = "$groupIdDefined" + version = "$versionDefined" + + // bintray平台信息配置 + bintray { + user = BINTRAY_USER + key = BINTRAY_KEY + + println "user=${user},key=${key}" + + configurations = ['archives'] + publish = true + pkg { + repo = "maven" + name = libName + licenses = [" Apache-2.0"] + websiteUrl = siteUrl + vcsUrl = gitUrl + version { + name = "$versionDefined" + } + } + } + + // pom文件信息配置 + install { + repositories.mavenInstaller { + pom.project { + groupId "$groupIdDefined" + artifactId "$artifactIdDefined" + version "$versionDefined" + packaging 'aar' + } + } + } + + // 生成sourceJar和javaDocJar + task sourcesJar(type: Jar) { + from android.sourceSets.main.java.srcDirs + classifier = 'sources' + } + + task javadoc(type: Javadoc) { + failOnError false + source = android.sourceSets.main.java.sourceFiles + options { + encoding = "utf-8" + } + classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) + classpath += configurations.compile + } + task javadocJar(type: Jar, dependsOn: javadoc) { + classifier = 'javadoc' + from javadoc.destinationDir + } + + artifacts { + archives sourcesJar + archives javadocJar + } +} diff --git a/serialport/build.gradle b/serialport/build.gradle index 7f171a1..06aed47 100644 --- a/serialport/build.gradle +++ b/serialport/build.gradle @@ -7,10 +7,10 @@ android { defaultConfig { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode rootProject.ext.versionCode + versionCode 1 versionName rootProject.ext.versionName - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' } buildTypes { release { @@ -34,5 +34,5 @@ dependencies { // testCompile 'junit:junit:4.12' } -apply from: '../jitpack.gradle' +apply from: './bintray.gradle' diff --git a/serialport/src/main/AndroidManifest.xml b/serialport/src/main/AndroidManifest.xml index 808f2ee..6c1ed51 100644 --- a/serialport/src/main/AndroidManifest.xml +++ b/serialport/src/main/AndroidManifest.xml @@ -1,10 +1,4 @@ - - - - - - + + diff --git a/serialport/src/main/java/android/serialport/SerialPort.java b/serialport/src/main/java/android/serialport/SerialPort.java index 7633b3c..641e2bd 100644 --- a/serialport/src/main/java/android/serialport/SerialPort.java +++ b/serialport/src/main/java/android/serialport/SerialPort.java @@ -66,14 +66,14 @@ public static String getSuPath() { * * @param device 串口设备文件 * @param baudrate 波特率 - * @param dataBits 数据位,默认8 - * @param parity 奇偶校验位,默认0(无校验) - * @param stopBits 停止位,默认1 + * @param dataBits 数据位;默认8,可选值为5~8 + * @param parity 奇偶校验;0:无校验位(NONE,默认);1:奇校验位(ODD);2:偶校验位(EVEN) + * @param stopBits 停止位;默认1;1:1位停止位;2:2位停止位 * @param flags 默认0 * @throws SecurityException * @throws IOException */ - private SerialPort(File device, int baudrate, int dataBits, int parity, int stopBits, int flags) + public SerialPort(File device, int baudrate, int dataBits, int parity, int stopBits, int flags) throws SecurityException, IOException { /* Check access permission */ @@ -102,6 +102,34 @@ private SerialPort(File device, int baudrate, int dataBits, int parity, int stop mFileOutputStream = new FileOutputStream(mFd); } + /** + * 串口,默认的8n1 + * + * @param device 串口设备文件 + * @param baudrate 波特率 + * @throws SecurityException + * @throws IOException + */ + public SerialPort(File device, int baudrate) throws SecurityException, IOException { + this(device, baudrate, 8, 0, 1, 0); + } + + /** + * 串口 + * + * @param device 串口设备文件 + * @param baudrate 波特率 + * @param dataBits 数据位;默认8,可选值为5~8 + * @param parity 奇偶校验;0:无校验位(NONE,默认);1:奇校验位(ODD);2:偶校验位(EVEN) + * @param stopBits 停止位;默认1;1:1位停止位;2:2位停止位 + * @throws SecurityException + * @throws IOException + */ + public SerialPort(File device, int baudrate, int dataBits, int parity, int stopBits) + throws SecurityException, IOException { + this(device, baudrate, dataBits, parity, stopBits, 0); + } + // Getters and setters public InputStream getInputStream() { return mFileInputStream; From f66b63276f917fefd0c9e0756e7b6440e0a6b86e Mon Sep 17 00:00:00 2001 From: licheedev Date: Thu, 22 Oct 2020 11:44:13 +0800 Subject: [PATCH 11/18] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=8F=AF=E4=BB=A5?= =?UTF-8?q?=E8=8E=B7=E5=8F=96SerialPort=E7=9A=84=E5=B1=9E=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- build.gradle | 2 +- serialport/build.gradle | 3 + .../java/android/serialport/SerialPort.java | 79 +++++++++++++++++-- 4 files changed, 79 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 96bb425..5fb6410 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ ``` dependencies { - implementation 'com.licheedev:android-serialport:2.1.1' + implementation 'com.licheedev:android-serialport:2.1.2' } ``` diff --git a/build.gradle b/build.gradle index f73582b..fd36fc3 100644 --- a/build.gradle +++ b/build.gradle @@ -32,5 +32,5 @@ ext { targetSdkVersion = 29 versionCode = 2 - versionName = "2.1.1" + versionName = "2.1.2" } \ No newline at end of file diff --git a/serialport/build.gradle b/serialport/build.gradle index 06aed47..874cafa 100644 --- a/serialport/build.gradle +++ b/serialport/build.gradle @@ -32,6 +32,9 @@ dependencies { // }) // compile 'com.android.support:appcompat-v7:25.3.0' // testCompile 'junit:junit:4.12' + + + api "androidx.annotation:annotation:1.1.0" } apply from: './bintray.gradle' diff --git a/serialport/src/main/java/android/serialport/SerialPort.java b/serialport/src/main/java/android/serialport/SerialPort.java index 641e2bd..8d4b53d 100644 --- a/serialport/src/main/java/android/serialport/SerialPort.java +++ b/serialport/src/main/java/android/serialport/SerialPort.java @@ -17,6 +17,8 @@ package android.serialport; import android.util.Log; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import java.io.File; import java.io.FileDescriptor; import java.io.FileInputStream; @@ -32,13 +34,19 @@ public final class SerialPort { public static final String DEFAULT_SU_PATH = "/system/bin/su"; private static String sSuPath = DEFAULT_SU_PATH; + private File device; + private int baudrate; + private int dataBits; + private int parity; + private int stopBits; + private int flags; /** * Set the su binary path, the default su binary path is {@link #DEFAULT_SU_PATH} * * @param suPath su binary path */ - public static void setSuPath(String suPath) { + public static void setSuPath(@Nullable String suPath) { if (suPath == null) { return; } @@ -50,6 +58,7 @@ public static void setSuPath(String suPath) { * * @return */ + @NonNull public static String getSuPath() { return sSuPath; } @@ -73,8 +82,15 @@ public static String getSuPath() { * @throws SecurityException * @throws IOException */ - public SerialPort(File device, int baudrate, int dataBits, int parity, int stopBits, int flags) - throws SecurityException, IOException { + public SerialPort(@NonNull File device, int baudrate, int dataBits, int parity, int stopBits, + int flags) throws SecurityException, IOException { + + this.device = device; + this.baudrate = baudrate; + this.dataBits = dataBits; + this.parity = parity; + this.stopBits = stopBits; + this.flags = flags; /* Check access permission */ if (!device.canRead() || !device.canWrite()) { @@ -110,7 +126,7 @@ public SerialPort(File device, int baudrate, int dataBits, int parity, int stopB * @throws SecurityException * @throws IOException */ - public SerialPort(File device, int baudrate) throws SecurityException, IOException { + public SerialPort(@NonNull File device, int baudrate) throws SecurityException, IOException { this(device, baudrate, 8, 0, 1, 0); } @@ -125,26 +141,79 @@ public SerialPort(File device, int baudrate) throws SecurityException, IOExcepti * @throws SecurityException * @throws IOException */ - public SerialPort(File device, int baudrate, int dataBits, int parity, int stopBits) + public SerialPort(@NonNull File device, int baudrate, int dataBits, int parity, int stopBits) throws SecurityException, IOException { this(device, baudrate, dataBits, parity, stopBits, 0); } // Getters and setters + @NonNull public InputStream getInputStream() { return mFileInputStream; } + @NonNull public OutputStream getOutputStream() { return mFileOutputStream; } + /** 串口设备文件 */ + @NonNull + public File getDevice() { + return device; + } + + /** 波特率 */ + public int getBaudrate() { + return baudrate; + } + + /** 数据位;默认8,可选值为5~8 */ + public int getDataBits() { + return dataBits; + } + + /** 奇偶校验;0:无校验位(NONE,默认);1:奇校验位(ODD);2:偶校验位(EVEN) */ + public int getParity() { + return parity; + } + + /** 停止位;默认1;1:1位停止位;2:2位停止位 */ + public int getStopBits() { + return stopBits; + } + + public int getFlags() { + return flags; + } + // JNI private native FileDescriptor open(String absolutePath, int baudrate, int dataBits, int parity, int stopBits, int flags); public native void close(); + /** 关闭流和串口,已经try-catch */ + public void tryClose() { + try { + mFileInputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + + try { + mFileOutputStream.close(); + } catch (IOException e) { + //e.printStackTrace(); + } + + try { + close(); + } catch (Exception e) { + //e.printStackTrace(); + } + } + static { System.loadLibrary("serial_port"); } From 41363314102df54d67b3577e0cf7a32e45ba5e1a Mon Sep 17 00:00:00 2001 From: Eyal Yoli Abs Date: Wed, 21 Apr 2021 11:37:35 +0300 Subject: [PATCH 12/18] Update README.md + translate to english + add better usage code --- README.md | 57 +++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 43 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 5fb6410..653b98d 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,12 @@ # Android-SerialPort-API +Fork自Google开源的Android串口通信Demo,修改成Android Studio项目 +This lib is a fork of the Android serial port communication Demo open sourced by Google. -**Gradle 引用** +## Installation & Usage +**Gradle** -添加依赖 +添加依赖: +Add the dependency: ``` dependencies { @@ -10,29 +14,54 @@ dependencies { } ``` -**修改`su`路径** +**Import** +```java +import android.serialport.SerialPort; +``` + +**`su` path** + +In order to read/write to a serial port in Android you'll need `su` binary installed on device (this can be done by rooting the device). Usually Android devices that has the ability to communicate with serial ports have `su` installed on the default path `"/system/bin/su"`. To change this use: ```java // su默认路径为 "/system/bin/su" +// The default path of su is "/system/bin/su" // 可通过此方法修改 +// If the path is different then change it using this SerialPort.setSuPath("/system/xbin/su"); ``` -**可选配置数据位、校验位、停止位** - -实现方式参考 -> https://juejin.im/post/5c010a19e51d456ac27b40fc +**Usage** ```java - // 默认8N1(8数据位、无校验位、1停止位) +// Default 8N1 (8 data bits, no parity bit, 1 stop bit) SerialPort serialPort = new SerialPort(path, baudrate); -// 7E2(7数据位、偶校验、2停止位) -SerialPort serialPort = SerialPort // - .newBuilder(path, baudrate) // 串口地址地址,波特率 - .parity(2) // 校验位;0:无校验位(NONE,默认);1:奇校验位(ODD);2:偶校验位(EVEN) - .dataBits(7) // 数据位,默认8;可选值为5~8 - .stopBits(2) // 停止位,默认1;1:1位停止位;2:2位停止位 +// 可选配置数据位、校验位、停止位 - 7E2(7数据位、偶校验、2停止位) +// or with builder (with optional configurations) - 7E2 (7 data bits, even parity, 2 stop bits) +SerialPort serialPort = SerialPort + .newBuilder(path, baudrate) +// 校验位;0:无校验位(NONE,默认);1:奇校验位(ODD);2:偶校验位(EVEN) +// Check bit; 0: no check bit (NONE, default); 1: odd check bit (ODD); 2: even check bit (EVEN) +// .parity(2) +// 数据位,默认8;可选值为5~8 +// Data bit, default 8; optional value is 5~8 +// .dataBits(7) +// 停止位,默认1;1:1位停止位;2:2位停止位 +// Stop bit, default 1; 1:1 stop bit; 2: 2 stop bit +// .stopBits(2) .build(); + +// read/write to serial port - needs to be in different thread! +InputStream in = serialPort.getInputStream(); +OutputStream out = serialPort.getOutputStream(); + +// close +serialPort.tryClose(); ``` + +实现方式参考 +Implementation reference +> Check (sample project)[https://github.com/licheedev/Android-SerialPort-API/tree/master/sample] +> https://juejin.im/post/5c010a19e51d456ac27b40fc From acb2c63a9a263fa2fda4ad33220c1cd44afd62d6 Mon Sep 17 00:00:00 2001 From: Eyal Yoli Abs Date: Wed, 21 Apr 2021 11:39:24 +0300 Subject: [PATCH 13/18] Update README.md fix styles --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 653b98d..19e5d0f 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,13 @@ # Android-SerialPort-API Fork自Google开源的Android串口通信Demo,修改成Android Studio项目 + This lib is a fork of the Android serial port communication Demo open sourced by Google. ## Installation & Usage **Gradle** 添加依赖: + Add the dependency: ``` @@ -15,6 +17,7 @@ dependencies { ``` **Import** + ```java import android.serialport.SerialPort; ``` @@ -62,6 +65,7 @@ serialPort.tryClose(); ``` 实现方式参考 + Implementation reference -> Check (sample project)[https://github.com/licheedev/Android-SerialPort-API/tree/master/sample] -> https://juejin.im/post/5c010a19e51d456ac27b40fc +1. Check [sample project](https://github.com/licheedev/Android-SerialPort-API/tree/master/sample) +2. https://juejin.im/post/5c010a19e51d456ac27b40fc From 0bb2ea97793b06f424a10792e2690b7d9c1d7e86 Mon Sep 17 00:00:00 2001 From: Eyal Yoli Abs Date: Wed, 21 Apr 2021 11:40:37 +0300 Subject: [PATCH 14/18] Update README.md add fork links --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 19e5d0f..29769a0 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Android-SerialPort-API -Fork自Google开源的Android串口通信Demo,修改成Android Studio项目 +(Fork)[https://code.google.com/archive/p/android-serialport-api/]自Google开源的Android串口通信Demo,修改成Android Studio项目 -This lib is a fork of the Android serial port communication Demo open sourced by Google. +This lib is a (fork)[https://code.google.com/archive/p/android-serialport-api/] of the Android serial port communication Demo open sourced by Google. ## Installation & Usage **Gradle** From 1bf895044ba83b50b017bb695aafd6249b9e638b Mon Sep 17 00:00:00 2001 From: Eyal Yoli Abs Date: Wed, 21 Apr 2021 11:41:08 +0300 Subject: [PATCH 15/18] Update README.md fix urls --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 29769a0..83f21a5 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Android-SerialPort-API -(Fork)[https://code.google.com/archive/p/android-serialport-api/]自Google开源的Android串口通信Demo,修改成Android Studio项目 +[Fork](https://code.google.com/archive/p/android-serialport-api/)自Google开源的Android串口通信Demo,修改成Android Studio项目 -This lib is a (fork)[https://code.google.com/archive/p/android-serialport-api/] of the Android serial port communication Demo open sourced by Google. +This lib is a [fork](https://code.google.com/archive/p/android-serialport-api/) of the Android serial port communication Demo open sourced by Google. ## Installation & Usage **Gradle** From 0e329bec294043c8c47e0ba7a8a9c0e5f732ef2b Mon Sep 17 00:00:00 2001 From: licheedev Date: Tue, 1 Jun 2021 11:46:48 +0800 Subject: [PATCH 16/18] 2.1.3 migrate from Jcenter to MavenCentral --- README.md | 10 ++- build.gradle | 7 +- maven_publish.gradle | 130 ++++++++++++++++++++++++++++++++++++++ sample/build.gradle | 4 +- serialport/bintray.gradle | 86 ------------------------- serialport/build.gradle | 2 +- 6 files changed, 146 insertions(+), 93 deletions(-) create mode 100644 maven_publish.gradle delete mode 100644 serialport/bintray.gradle diff --git a/README.md b/README.md index 83f21a5..d05c6d4 100644 --- a/README.md +++ b/README.md @@ -11,8 +11,16 @@ This lib is a [fork](https://code.google.com/archive/p/android-serialport-api/) Add the dependency: ``` +allprojects { + repositories { + ... + jcenter() + mavenCentral() // since 2.1.3 + } +} + dependencies { - implementation 'com.licheedev:android-serialport:2.1.2' + implementation 'com.licheedev:android-serialport:2.1.3' } ``` diff --git a/build.gradle b/build.gradle index fd36fc3..68e717a 100644 --- a/build.gradle +++ b/build.gradle @@ -4,13 +4,13 @@ buildscript { repositories { google() jcenter() + mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:4.0.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files - classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4' - classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1' + classpath 'org.jetbrains.dokka:dokka-gradle-plugin:1.4.32' } } @@ -18,6 +18,7 @@ allprojects { repositories { google() jcenter() + mavenCentral() } } @@ -32,5 +33,5 @@ ext { targetSdkVersion = 29 versionCode = 2 - versionName = "2.1.2" + versionName = "2.1.3" } \ No newline at end of file diff --git a/maven_publish.gradle b/maven_publish.gradle new file mode 100644 index 0000000..e8a2281 --- /dev/null +++ b/maven_publish.gradle @@ -0,0 +1,130 @@ +// 依赖信息 +def groupIdDefined = "com.licheedev" +def artifactIdDefined = "android-serialport" +// 如果是测试版,版本号后面加上 -SNAPSHOT +def versionDefined = rootProject.ext.versionName +// 其他信息 +def gitUrl = "https://github.com/licheedev/Android-SerialPort-API" + +// 配置是否上传 +def toUpload = true + +//在根build.gradle中加入,最新版本号参考 https://github.com/Kotlin/dokka#using-dokka +//classpath 'org.jetbrains.dokka:dokka-gradle-plugin:1.4.32' + +//在module的build.gradle末位加入 +//apply from: '../maven_publish.gradle' + +if (toUpload) { + apply plugin: 'signing' + apply plugin: 'maven-publish' + apply plugin: 'org.jetbrains.dokka' + + // + // 打包源码 + task sourcesJar(type: Jar) { + from android.sourceSets.main.java.srcDirs + classifier = 'sources' + } + + task javadoc(type: Javadoc) { + failOnError false + source = android.sourceSets.main.java.sourceFiles + options { + encoding = "utf-8" + charSet 'UTF-8' + } + classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) + classpath += configurations.compile + } + + // 打包javadoc + task javadocJar(type: Jar, dependsOn: javadoc) { + classifier = 'javadoc' + from javadoc.destinationDir + } + + // 打包包含kotlin源码的javadoc + task kotlinDocJar(type: Jar, dependsOn: dokkaHtml) { + classifier = 'javadoc' + from dokkaHtml.outputDirectory + } + // + + afterEvaluate { + + publishing { + publications { + mavenAndroid(MavenPublication) { + from components.release + + groupId "$groupIdDefined" + artifactId "$artifactIdDefined" + version "$versionDefined" + // 上传source + artifact sourcesJar + // 上传javadoc + if (project.plugins.hasPlugin('kotlin-android')) { + artifact kotlinDocJar + } else { + artifact javadocJar + } + + pom { + name = 'Android-SerialPort-API' + description = 'Android-SerialPort-API' + url = "$gitUrl" + + //licenses { + // license { + // name = 'The MIT License' + // url = 'https://opensource.org/licenses/MIT' + // } + //} + + licenses { + license { + name = 'The Apache License, Version 2.0' + url = 'http://www.apache.org/licenses/LICENSE-2.0.txt' + } + } + + developers { + developer { + id = 'licheedev' + name = 'John Lee' + email = 'licheedev@foxmail.com' + } + } + scm { + connection = "$gitUrl" + developerConnection = "${gitUrl}.git" + url = "$gitUrl" + } + } + } + } + + repositories { + + maven { + // 依赖发布地址 + def releasesRepoUrl = "https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/" + def snapshotsRepoUrl = "https://s01.oss.sonatype.org/content/repositories/snapshots/" + url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl + + // 配置账号密码 + println "user=${ossrhUsername},key=${ossrhPassword}" + credentials { + username "${ossrhUsername}" + password "${ossrhPassword}" + } + } + } + } + + signing { + sign publishing.publications.mavenAndroid + } + } +} \ No newline at end of file diff --git a/sample/build.gradle b/sample/build.gradle index 167098d..f2834ca 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -27,6 +27,6 @@ dependencies { }) implementation 'androidx.appcompat:appcompat:1.2.0' testImplementation 'junit:junit:4.13' -// implementation project(':serialport') - implementation 'com.licheedev:android-serialport:2.1.1' + implementation project(':serialport') + //implementation 'com.licheedev:android-serialport:2.1.3' } diff --git a/serialport/bintray.gradle b/serialport/bintray.gradle deleted file mode 100644 index fbb21ef..0000000 --- a/serialport/bintray.gradle +++ /dev/null @@ -1,86 +0,0 @@ -//在根build.gradle中加入 -//classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4' -//classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1' - -//在module的build.gradle末位加入 -//apply from: './bintray.gradle' - -// 执行 ./gradlew clean bintrayUpload - -def toUpload = true // 配置是否上传 -if (toUpload) { - apply plugin: 'com.github.dcendents.android-maven' - apply plugin: 'com.jfrog.bintray' - - // 定义参数 - // 依赖信息 - def groupIdDefined = "com.licheedev" - def artifactIdDefined = "android-serialport" - def versionDefined = rootProject.ext.versionName - // 其他信息 - def siteUrl = "https://github.com/licheedev" - def gitUrl = "https://github.com/licheedev/Android-SerialPort-API.git" - def libName = "$artifactIdDefined" - - // 待发布项目的groupId和version。android-maven-gradle-plugin插件需要这么配置。 - group = "$groupIdDefined" - version = "$versionDefined" - - // bintray平台信息配置 - bintray { - user = BINTRAY_USER - key = BINTRAY_KEY - - println "user=${user},key=${key}" - - configurations = ['archives'] - publish = true - pkg { - repo = "maven" - name = libName - licenses = [" Apache-2.0"] - websiteUrl = siteUrl - vcsUrl = gitUrl - version { - name = "$versionDefined" - } - } - } - - // pom文件信息配置 - install { - repositories.mavenInstaller { - pom.project { - groupId "$groupIdDefined" - artifactId "$artifactIdDefined" - version "$versionDefined" - packaging 'aar' - } - } - } - - // 生成sourceJar和javaDocJar - task sourcesJar(type: Jar) { - from android.sourceSets.main.java.srcDirs - classifier = 'sources' - } - - task javadoc(type: Javadoc) { - failOnError false - source = android.sourceSets.main.java.sourceFiles - options { - encoding = "utf-8" - } - classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) - classpath += configurations.compile - } - task javadocJar(type: Jar, dependsOn: javadoc) { - classifier = 'javadoc' - from javadoc.destinationDir - } - - artifacts { - archives sourcesJar - archives javadocJar - } -} diff --git a/serialport/build.gradle b/serialport/build.gradle index 874cafa..f9f8f28 100644 --- a/serialport/build.gradle +++ b/serialport/build.gradle @@ -37,5 +37,5 @@ dependencies { api "androidx.annotation:annotation:1.1.0" } -apply from: './bintray.gradle' +apply from: '../maven_publish.gradle' From 92499e2500237b4a4c37cab2324d57c74777ccff Mon Sep 17 00:00:00 2001 From: licheedev Date: Mon, 17 Jun 2024 16:26:47 +0800 Subject: [PATCH 17/18] =?UTF-8?q?2.1.4=20=E4=BF=AE=E5=A4=8D=E5=9B=A0?= =?UTF-8?q?=E4=B8=BA=E4=B8=B2=E5=8F=A3=E4=B8=8D=E5=AD=98=E5=9C=A8=EF=BC=8C?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E5=BC=80=E5=90=AF=E4=B8=B2=E5=8F=A3=E6=97=B6?= =?UTF-8?q?=E4=B8=80=E7=9B=B4=E9=98=BB=E5=A1=9E=E7=BA=BF=E7=A8=8B=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E8=B7=B3=E5=87=BA=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=8C?= =?UTF-8?q?=E7=8E=B0=E5=9C=A8=E4=BC=9A=E5=85=88=E5=88=A4=E6=96=AD=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E8=B7=AF=E5=BE=84=E6=98=AF=E5=90=A6=E5=AD=98=E5=9C=A8?= =?UTF-8?q?=EF=BC=8C=E4=B8=8D=E5=AD=98=E5=9C=A8=E5=88=99=E7=9B=B4=E6=8E=A5?= =?UTF-8?q?=E6=8A=9B=E5=87=BA=E5=BC=82=E5=B8=B8=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- build.gradle | 2 +- .../java/android/serialport/SerialPort.java | 20 ++++++++++++++----- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index d05c6d4..23a96ba 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ allprojects { } dependencies { - implementation 'com.licheedev:android-serialport:2.1.3' + implementation 'com.licheedev:android-serialport:2.1.4' } ``` diff --git a/build.gradle b/build.gradle index 68e717a..3af971e 100644 --- a/build.gradle +++ b/build.gradle @@ -33,5 +33,5 @@ ext { targetSdkVersion = 29 versionCode = 2 - versionName = "2.1.3" + versionName = "2.1.4" } \ No newline at end of file diff --git a/serialport/src/main/java/android/serialport/SerialPort.java b/serialport/src/main/java/android/serialport/SerialPort.java index 8d4b53d..a07b705 100644 --- a/serialport/src/main/java/android/serialport/SerialPort.java +++ b/serialport/src/main/java/android/serialport/SerialPort.java @@ -82,8 +82,10 @@ public static String getSuPath() { * @throws SecurityException * @throws IOException */ - public SerialPort(@NonNull File device, int baudrate, int dataBits, int parity, int stopBits, - int flags) throws SecurityException, IOException { + public SerialPort( + @NonNull File device, int baudrate, int dataBits, int parity, int stopBits, + int flags + ) throws SecurityException, IOException { this.device = device; this.baudrate = baudrate; @@ -92,6 +94,10 @@ public SerialPort(@NonNull File device, int baudrate, int dataBits, int parity, this.stopBits = stopBits; this.flags = flags; + if (!device.exists()) { + throw new IOException("SerialPort(" + device.getAbsolutePath() + ") not exists"); + } + /* Check access permission */ if (!device.canRead() || !device.canWrite()) { try { @@ -112,7 +118,9 @@ public SerialPort(@NonNull File device, int baudrate, int dataBits, int parity, mFd = open(device.getAbsolutePath(), baudrate, dataBits, parity, stopBits, flags); if (mFd == null) { Log.e(TAG, "native open returns null"); - throw new IOException(); + throw new IOException("native open" + + "SerialPort(" + device.getAbsolutePath() + + ") returns null"); } mFileInputStream = new FileInputStream(mFd); mFileOutputStream = new FileOutputStream(mFd); @@ -188,8 +196,10 @@ public int getFlags() { } // JNI - private native FileDescriptor open(String absolutePath, int baudrate, int dataBits, int parity, - int stopBits, int flags); + private native FileDescriptor open( + String absolutePath, int baudrate, int dataBits, int parity, + int stopBits, int flags + ); public native void close(); From 0768a6bbb9bfb9cace71253a5b1a4b1c5e9f541b Mon Sep 17 00:00:00 2001 From: licheedev Date: Fri, 6 Sep 2024 11:26:40 +0800 Subject: [PATCH 18/18] =?UTF-8?q?=E9=80=82=E9=85=8D16KB=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +++ build.gradle | 6 +++--- gradle/wrapper/gradle-wrapper.properties | 4 ++-- sample/build.gradle | 4 ++-- serialport/CMakeLists.txt | 10 ++++++++-- serialport/build.gradle | 6 ++++++ 6 files changed, 24 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 23a96ba..f54c0ec 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,10 @@ allprojects { } dependencies { + // 传统4KB内存页面版本 implementation 'com.licheedev:android-serialport:2.1.4' + // 适配16KB页面版本,https://developer.android.google.cn/guide/practices/page-sizes?hl=zh-cn + implementation 'com.licheedev:android-serialport:2.1.5' } ``` diff --git a/build.gradle b/build.gradle index 3af971e..a47094e 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:4.0.1' + classpath 'com.android.tools.build:gradle:4.2.2' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files classpath 'org.jetbrains.dokka:dokka-gradle-plugin:1.4.32' @@ -32,6 +32,6 @@ ext { minSdkVersion = 8 targetSdkVersion = 29 - versionCode = 2 - versionName = "2.1.4" + versionCode = 3 + versionName = "2.1.5" } \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e95cacb..3ed5e54 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Wed Aug 26 17:00:59 CST 2020 +#Fri Sep 06 10:04:58 CST 2024 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip diff --git a/sample/build.gradle b/sample/build.gradle index f2834ca..00bc09a 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -27,6 +27,6 @@ dependencies { }) implementation 'androidx.appcompat:appcompat:1.2.0' testImplementation 'junit:junit:4.13' - implementation project(':serialport') - //implementation 'com.licheedev:android-serialport:2.1.3' + //implementation project(':serialport') + implementation 'com.licheedev:android-serialport:2.1.5' } diff --git a/serialport/CMakeLists.txt b/serialport/CMakeLists.txt index f16cb32..80def00 100644 --- a/serialport/CMakeLists.txt +++ b/serialport/CMakeLists.txt @@ -2,7 +2,7 @@ # This ensures that a certain set of CMake features is available to # your build. -cmake_minimum_required(VERSION 3.4.1) +cmake_minimum_required(VERSION 3.18.1) # Specifies a library name, specifies whether the library is STATIC or # SHARED, and provides relative paths to the source code. You can @@ -35,4 +35,10 @@ target_link_libraries( # Specifies the target library. # Links the target library to the log library # included in the NDK. - ${log-lib} ) \ No newline at end of file + ${log-lib} ) + +target_link_options( + serial_port + PRIVATE + "-Wl,-z,max-page-size=16384" +) \ No newline at end of file diff --git a/serialport/build.gradle b/serialport/build.gradle index f9f8f28..b5a36b4 100644 --- a/serialport/build.gradle +++ b/serialport/build.gradle @@ -21,6 +21,12 @@ android { externalNativeBuild { cmake { path 'CMakeLists.txt' + version "3.18.1" + } + } + packagingOptions { + jniLibs { + useLegacyPackaging true } } }