android中串口转u口,阳光沙滩博客-Android——USB转COM口(CH340)与传感器进行通讯...
本人使用环境
CH340转接头
Android5.1,RK3188
Android6.0,RK3288
关于CH34官方的jar包与使用存在的问题(官方地址)
最大的问题是无法修改串口波特率,一直以19200运行,但我的传感器为9600,理论上应该可以修改,可是就连官方的APK都无法修改,我只好另寻他发
最终解决方案
初始化
在你的build.gradle(project)中添加
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
添加依赖
dependencies {
implementation 'com.github.mik3y:usb-serial-for-android:2.2.2'
}
添加权限
在res/xml/下添加 device_filter.xml,CH340官网的工程Demo内也有。并要在AndroidManifest中补全代码
android:name="..."
...>
android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
android:resource="@xml/device_filter" />
使用
创建单独的温度传感器类
class TemperMoudle {
private final static String TAG = "MainActivity";
private static final int TEMPERATURE_USB_VENDOR_ID = 6790; //供应商id
private static final int TEMPERATURE_USB_PRODUCT_ID = 29987; //产品id
private Context context;
private List usbSerialDrivers = null;
private List usbSerialPorts = new ArrayList<>();
private UsbSerialPort temperatureUsbPort = null;
private SerialInputOutputManager serialIoManager;
private SerialInputOutputManager.Listener serialListener;
private ExecutorService executor = Executors.newSingleThreadExecutor();
TemperMoudle(Context context) {
this.context = context;
}
/**
* 初始化,获取目标端口
*/
UsbSerialPort init(SerialInputOutputManager.Listener listener) {
this.serialListener = listener;
//获取全部设备
UsbManager usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
if (usbManager != null) {
usbSerialDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(usbManager);
}
//获取全部端口
if (usbSerialDrivers != null) {
for (UsbSerialDriver driver : usbSerialDrivers) {
usbSerialPorts.addAll(driver.getPorts());
}
}
//校验端口设备,获得目标端口
for (UsbSerialPort port : usbSerialPorts) {
UsbDevice device = port.getDriver().getDevice();
if (device.getVendorId() == TEMPERATURE_USB_VENDOR_ID && device.getProductId() == TEMPERATURE_USB_PRODUCT_ID) {
UsbDeviceConnection connection = usbManager.openDevice(device);
try {
temperatureUsbPort = port;
temperatureUsbPort.open(connection);
temperatureUsbPort.setParameters(9600, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE);
//我这里需要开启RTS,否则无法读取数据,但务必记得在temperatureUsbPort.close之前置位false,否则再次启动程序无法读取端口!
temperatureUsbPort.setRTS(true);
} catch (IOException e) {
Log.e(TAG, "打开端口失败");
try {
temperatureUsbPort.setRTS(false);
temperatureUsbPort.close();
} catch (IOException e2) {
e.printStackTrace();
}
}
}
}
return temperatureUsbPort;
}
/**
* 设置数据监听器
*
* @param listener 监听器
*/
void setSerialListener(SerialInputOutputManager.Listener listener) {
this.serialListener = listener;
}
private void startIoManager() {
if (temperatureUsbPort != null) {
serialIoManager = new SerialInputOutputManager(temperatureUsbPort, serialListener);
executor.submit(serialIoManager);
}
}
private void stopIoManager() {
if (serialIoManager != null) {
serialIoManager.stop();
serialIoManager = null;
}
}
/**
* 重新开启USB管理器
*/
void onDeviceStateChange() {
stopIoManager();
startIoManager();
}
void onPause() {
stopIoManager();
if (temperatureUsbPort != null) {
try {
temperatureUsbPort.setRTS(false);
temperatureUsbPort.close();
temperatureUsbPort = null;
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
主函数使用
TemperMoudle temperMoudle;
UsbSerialPort temperUsbPort;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取温度传感器数据端口
temperMoudle = new TemperMoudle(this);
temperUsbPort = temperMoudle.init(temperListener);
//发送查询温度的指令
if (temperUsbPort != null) {
try {
temperUsbPort.write(Str16ToBytes("01 03 00 00 00 01 84 0A", " "), 200);
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 监听USB端口数据
*/
SerialInputOutputManager.Listener temperListener = new SerialInputOutputManager.Listener() {
@Override
public void onNewData(byte[] data) {
String[] dataStrings = BytesToStrs16(data);
for (String dataString : dataStrings) {
Log.d(TAG, "dataString: " + dataString);
}
}
@Override
public void onRunError(Exception e) {
e.printStackTrace();
}
};
/**
* 用于检测usb插入状态的BroadcasReceiver
*/
private final BroadcastReceiver usbReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(intent.getAction())) {
Log.e(TAG, "设备移除");
temperMoudle.onPause();
finish();
}
}
};
@Override
protected void onResume() {
super.onResume();
IntentFilter usbFilter = new IntentFilter();
usbFilter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
registerReceiver(usbReceiver, usbFilter);
temperMoudle.onDeviceStateChange();
}
@Override
protected void onPause() {
super.onPause();
temperMoudle.onPause();
unregisterReceiver(usbReceiver);
}
/**
* 16进制字符串转byte数组
*
* @param str 需要转换的字符串
* @param splitChare 中断间隔符
* @return 转换好的byte[]数组
*/
public byte[] Str16ToBytes(String str, String splitChare) {
String[] string = str.trim().split(splitChare);
byte[] bytes = new byte[string.length];
for (int i = 0; i < string.length; i++) {
bytes[i] = (byte) (Integer.parseInt(string[i], 16) & 0xff);
}
return bytes;
}
/**
* 十进制bytes转16进制strings
*
* @param bytes 十进制bytes
* @return 16进制strings
*/
public String[] BytesToStrs16(byte[] bytes) {
String[] strs = new String[bytes.length];
for (int i = 0; i < bytes.length; i++) {
strs[i] = Integer.toHexString(bytes[i] & 0xff);
}
return strs;
}
android中串口转u口,阳光沙滩博客-Android——USB转COM口(CH340)与传感器进行通讯...相关推荐
- android 采集cpu温度,阳光沙滩博客-Android开发如何读取到CPU,内存等硬件温度信息?...
Android开发如何读取到CPU,内存,温度等硬件信息? 最近在玩跑跑卡丁车,有一个面板显示着电呀,CPU使用,内存等情况 于是就来写这篇文章啦 以前我也做过CPU温度,频率之类的数据读取,那时我做 ...
- android java代码加密,Android中AES256加密的实现 – Leo Chin – 博客园
AES加密是我们在工作中常用到一种加密方式,并且在java中也已经实现好了其相应的接口. 但是Java自带的JDK默认最多实现128位及其以下的加密.如果使用java自带的api实现aes256将会报 ...
- linux用vim修改字符串,阳光沙滩博客-Linux下 vi/vim的使用
概述 vi编辑器是所有Unix及Linux系统下标准的编辑器,功能强大.这里只是简单地介绍一下它的用法和一小部分命令. vi基本可以分为三种状态,分别是命令模式(command mode).插入模式( ...
- java final成员变量吗_阳光沙滩博客-为什么Java匿名内部内使用局部变量需要加final?而访问成员变量却不用加final呢?...
前置知识 内存数据区域(Java内存结构) 在解析这个问题之前,得先有一些前置知识. 比如说,要知道什么是堆,什么是栈,什么是方法区,这数据区域存放什么内容? 可以参考这篇文章: 栈里面存放方法内容 ...
- 求android 中串口的发送接收数据代码
RT,求高手帮忙! 就是 /dev/ttyS0 和/dev/ttyS1 两个设备的通信问题.. 同求~ 这个是不是需要串口驱动啊?最近正在搞这个串口通信的案子,头疼 同样也没有搞出来,老是报:不能扫描 ...
- android 多行 输入框,EditTextView Android中的多行字符串(Multiline String in EditTextView Android)...
EditTextView Android中的多行字符串(Multiline String in EditTextView Android) 我用这段代码创建了我的EditTextView: mEdit ...
- android sqlite 创建空表,sqlite3在android中创建表错误(sqlite3 create table error in android)...
sqlite3在android中创建表错误(sqlite3 create table error in android) 我试图在android中使用sqlite3创建表我的开放助手是这样的: pub ...
- 我的Android进阶之旅:经典的大牛博客推荐
Android中文Wiki AndroidStudio-NDK开发-移动开发团队 谦虚的天下 - 博客园 gundumw100博客 - android进阶分类文章列表 - ITeye技术网站 CSDN ...
- Android进阶之旅:经典的大牛博客推荐
Android中文Wiki AndroidStudio-NDK开发-移动开发团队 谦虚的天下 - 博客园 gundumw100博客 - android进阶分类文章列表 - ITeye技术网站 CSDN ...
最新文章
- OX Pattern
- 【数字信号处理】相关函数 ( 能量信号 | 能量信号的互相关函数 | 能量信号的自相关函数 )
- 漫谈C++重载运算符
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之一 - 初识gtest
- less学习三---父选择器
- 在写新邮件时,在地址栏中敲入前几个字母,对于已熟悉的收件人,outlook会弹出列表...
- http://blog.sina.com.cn/s/blog_4aae007d0100inxi.html
- iOS应用开发最佳实践
- 微软 CEO 纳德拉痛失爱子
- 利用分类模型学习特征权重
- 生产环境apache2整合tomcat动静分离
- C语言-简谱转换成哨笛指谱
- Photoshop cc 2019 破解教程
- java deprecated 注释_@Deprecated注解的使用
- 【论文笔记】Weakly Supervised Discriminative Feature Learning with State Information for Person ...
- js获取并设置lt;pgt;lt;/pgt;的显示的值。
- turtlebot运动控制问题(不用键盘控制,自己写控制节点控制地盘)
- 商汤提出手机端实时单目三维重建系统,实现逼真AR效果和交互
- @Slf4j注解实现日志输出
- hadoop之hdfs搭建
热门文章
- 「数据管理系统」顶级数据库管理系统供应商
- Three.js基础光源和特殊光源的用法
- Mysql Join-连接查询(上)
- Pillar-based Object Detection for Autonomous Driving(基于柱体的自动驾驶目标检测)论文笔记
- Mac显示和关闭隐藏文件
- hackbar2.1.3 安装教程(附下载地址 )Firefox Chrome
- PRML翻译 Chap1 Introduction
- echarts绘制广东省地图
- 使用静默方式安装Oracle数据库软件
- 野火STM32资源免费下载(视频,资料、手册、书籍等免费下载),知识传递