技术标签: 学习 笔记 android studio Android
几个工程参考学习使用
Google开源的Android串口通信Demo android-serialport-api
cepr/android-serialport-api
SerialPort获取串口输入输出流
SerialPortFinder获取硬件地址
可以推荐看android串口通信——android-serialport-api 源
licheedev/Android-SerialPort-API
添加依赖:implementation ‘com.licheedev:android-serialport:2.1.3’
allprojects {
repositories {
...
jcenter()
mavenCentral() // since 2.1.3
}
}
dependencies {
implementation 'com.licheedev:android-serialport:2.1.3'
}
除了选择2.1.3版本,还可以看 releases 选择其他版本。
licheedev/Android-SerialPort-Tool
Android移植谷歌官方串口库支持校验位、数据位、停止位、流控配置
1. 检验参数合法性
/* Check arguments */
{
speed = getBaudrate(baudrate);
if (speed == -1) {
/* TODO: throw an exception */
LOGE("Invalid baudrate");
return NULL;
}
}
2. 打开串口
/* 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;
}
}
3.配置波特率
/* 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);
4.配置数据位
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;
}
5.配置校验位
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;
}
6.配置停止位
switch (stopBits) {
case 1:
cfg.c_cflag &= ~CSTOPB; //1位停止位
break;
case 2:
cfg.c_cflag |= CSTOPB; //2位停止位
break;
default:
break;
}
7.配置流控
switch (flowCon) {
case 0:
cfg.c_cflag &= ~CRTSCTS; //不使用流控
break;
case 1:
cfg.c_cflag |= CRTSCTS; //硬件流控
break;
case 2:
cfg.c_cflag |= IXON | IXOFF | IXANY; //软件流控
break;
default:
cfg.c_cflag &= ~CRTSCTS;
break;
}
import android.serialport.SerialPort;
在gradle/build.gradle中添加
maven {
url "https://jitpack.io" }
在app/build.gradle文件配置中的dependencies,加上
implementation 'com.github.licheedev.Android-SerialPort-API:serialport:1.0.1'
1、将android-serialport-api中的libs的so库资源放到项目libs中
2、将Android-SerialPort-API中的java下的文件复制到项目中java
3、修改app的build.gradle文件,在android {}里添加支持的cpu架构
defaultConfig {
ndk {
abiFilters "armeabi","armeabi-v7a" // "x86", "arm64-v8a"
}
}
1、将Android-SerialPort-API中的serialport模块复制到工程中,目录与app文件同级
2、修改settings.gradle,将改成如下,即增加serialport模块
rootProject.name = "SerialPort"
include ':app',':serialport'
3、修改app的build.gradle文件,在dependencies{}中添加project
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation project(':serialport')
}
待续
好的文章推荐参考
Android串口通讯SerialPort(使用篇)
与君共勉!待续
欢迎指错,一起学习
文章浏览阅读4k次。Swiper基本使用方法:一、加载插件,需要用到的文件有swiper.min.js和swiper.min.css文件。二、HTML内容。(我是基于angular1.x)<div class="swiper-container jb_carousel" id="jb_carousel"> <div class="swiper-wrapper" > ..._swiper上下滑动动画重置
文章浏览阅读293次。ansible的playbook的介绍-yamlansible的playbook是使用yaml语言写的YAML标记语言介绍YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言包括XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在首次发表了这种语言另外Ingy dtNet与Oren Ben-Kiki也是这语言的共..._192.168.16.139:5000
文章浏览阅读5.4w次,点赞30次,收藏370次。一个目标:容器操作;两地三中心;四层服务发现;五种Pod共享资源;六个CNI常用插件;七层负载均衡;八种隔离维度;九个网络模型原则;十类IP地址;百级产品线;千级物理机;万级容器;相如无亿..._k 8 s
文章浏览阅读1.1k次,点赞2次,收藏2次。linphone-desktop是一款基于SIP的标准开源网络电话系统,它使用了Qt和mediastreamer2开源多媒体库,支持大部分音视频格式,包括H263和H264等。linphone-desktop允许用户通过互联网与他人进行语音、视频和即时文本消息的沟通。它能够通过查询朋友的IP地址并进行拨号,功能强大且支持多种平台,既可以在桌面系统上使用,也可以在移动设备上使用,甚至支持WEB浏览器。linphone-desktop遵循GPL开放源代码协议,可以自由下载和二次开发。_windows编译 linphone
文章浏览阅读1.7k次。Spring Cloud Alibaba 是阿里巴巴开源的基于 Spring Cloud 的微服务框架。该项目从最初孵化到现在已经历经十多年的发展,得到了广泛的应用。其中主要集成了阿里巴巴中间件生态中的组件,比如 Nacos、Sentinel、RocketMQ 和 Dubbo。这些组件在 Spring Cloud 中进行了整合,让 Spring Cloud 用户能够更加简单方便地使用这些组件。因此,Spring Cloud Alibaba 如今已成为众多 Java 开发者的最爱。_spring cloud alibaba微服务最佳实践
文章浏览阅读710次。映射基本概念给定两个集合X,YX,YX,Y,若对于任意的元素x∈Xx\in Xx∈X,都存在唯一的y∈Yy\in Yy∈Y与之对应,就称定义了一个从XXX到YYY的映射,记作f:X→Yf:X\to Yf:X→Y其中yyy称为xxx在映射fff下的象,记作f(x)f(x)f(x);XXX称为映射fff的定义域。设A⊂X,B⊂YA\subset X,B\subset YA⊂X,B⊂Y,定义象集f(A)f(A)f(A)和原象集f−1(B)f^{-1}(B)f−1(B):f(A)={f(x)∈Y∣x∈A_可列集的映射
文章浏览阅读8.1k次,点赞2次,收藏7次。java.util.concurrent.CompletionException: java.lang.ArrayIndexOutOfBoundsException异常的原因分析及解决方案1.错误日志java.util.concurrent.CompletionException: java.lang.ArrayIndexOutOfBoundsException at java.util.concurrent.CompletableFuture.encodeThrowable(Compl.
文章浏览阅读45次。virtualenv简介:virtualenv 是一个创建独立python环境的工具。其要解决的最基本问题就是库的依赖和版本,以及间接权限。比如一个ubuntu环境默认安装了python2.7.11的版本,想要使用python3.5,如果再安装3.5,就会比较乱,再如pip安装的软件包,有..._django 重新搭建env
文章浏览阅读3.2k次,点赞14次,收藏41次。深入序列化和反序列化原理一个问题引发的思考什么是序列化和反序列化序列化一个问题引发的思考下面是一个简单的socket通信demo。通信数据类:package com.zwx.serialize.demo;public class SocketUser { public SocketUser(String id, String name) { this.id = id; this.name = name; } private String _private static final long serialversionuid 和实现序列化有什么区别
文章浏览阅读1.3w次,点赞41次,收藏350次。一、Django是什么?Django 是用 Python 开发的一个免费开源的 Web 框架,可以用于快速搭建高性能、优雅的网站,Django 提供了许多网站后台开发经常用到的模块,使开发者能够专注于业务部分。二、MVC设计模式在Web开发领域有一个著名的设计模式 ---- MVC,而Django的设计模式是MTVM:Model模型,和数据库进行交互V:View视图,产生html页面C:Controller,控制器接收请求,进行处理,与M和V进行交互,返回应答三、MTV设计模式M:M_django教程
文章浏览阅读177次。用C++做后台开发有哪些需要注意的问题说起后台开发,严格地说和用什么语言开发没有必然的关系。比如说网络游戏的后台,用C++开发的有很多,但用Java开发的也不少,而且在某些情况下,用Java做服务器效果还较好。其实,如果说用C++开发后台,可能更多的是从项目需要的角度考虑。毕竟现在能够找到一个好的C++程序员也不是一件容易的事,所以首先肯定的一点是用C++开发后台可能面临较大的人力成本。用C+..._boost如何理解
文章浏览阅读80次。安装配置:yum -y install rubygem-rake ruby-mysqlyum localinstall puppet-dashboardgem install rakemysql授权create database dashboard character set utf8;grant all on dashboard.* TO 'dashboard'@'%' i..._dashboard 自动化的应用