本人使用环境

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)与传感器进行通讯...相关推荐

  1. android 采集cpu温度,阳光沙滩博客-Android开发如何读取到CPU,内存等硬件温度信息?...

    Android开发如何读取到CPU,内存,温度等硬件信息? 最近在玩跑跑卡丁车,有一个面板显示着电呀,CPU使用,内存等情况 于是就来写这篇文章啦 以前我也做过CPU温度,频率之类的数据读取,那时我做 ...

  2. android java代码加密,Android中AES256加密的实现 – Leo Chin – 博客园

    AES加密是我们在工作中常用到一种加密方式,并且在java中也已经实现好了其相应的接口. 但是Java自带的JDK默认最多实现128位及其以下的加密.如果使用java自带的api实现aes256将会报 ...

  3. linux用vim修改字符串,阳光沙滩博客-Linux下 vi/vim的使用

    概述 vi编辑器是所有Unix及Linux系统下标准的编辑器,功能强大.这里只是简单地介绍一下它的用法和一小部分命令. vi基本可以分为三种状态,分别是命令模式(command mode).插入模式( ...

  4. java final成员变量吗_阳光沙滩博客-为什么Java匿名内部内使用局部变量需要加final?而访问成员变量却不用加final呢?...

    前置知识 内存数据区域(Java内存结构) 在解析这个问题之前,得先有一些前置知识. 比如说,要知道什么是堆,什么是栈,什么是方法区,这数据区域存放什么内容? 可以参考这篇文章: 栈里面存放方法内容 ...

  5. 求android 中串口的发送接收数据代码

    RT,求高手帮忙! 就是 /dev/ttyS0 和/dev/ttyS1 两个设备的通信问题.. 同求~ 这个是不是需要串口驱动啊?最近正在搞这个串口通信的案子,头疼 同样也没有搞出来,老是报:不能扫描 ...

  6. android 多行 输入框,EditTextView Android中的多行字符串(Multiline String in EditTextView Android)...

    EditTextView Android中的多行字符串(Multiline String in EditTextView Android) 我用这段代码创建了我的EditTextView: mEdit ...

  7. android sqlite 创建空表,sqlite3在android中创建表错误(sqlite3 create table error in android)...

    sqlite3在android中创建表错误(sqlite3 create table error in android) 我试图在android中使用sqlite3创建表我的开放助手是这样的: pub ...

  8. 我的Android进阶之旅:经典的大牛博客推荐

    Android中文Wiki AndroidStudio-NDK开发-移动开发团队 谦虚的天下 - 博客园 gundumw100博客 - android进阶分类文章列表 - ITeye技术网站 CSDN ...

  9. Android进阶之旅:经典的大牛博客推荐

    Android中文Wiki AndroidStudio-NDK开发-移动开发团队 谦虚的天下 - 博客园 gundumw100博客 - android进阶分类文章列表 - ITeye技术网站 CSDN ...

最新文章

  1. OX Pattern
  2. 【数字信号处理】相关函数 ( 能量信号 | 能量信号的互相关函数 | 能量信号的自相关函数 )
  3. 漫谈C++重载运算符
  4. 玩转Google开源C++单元测试框架Google Test系列(gtest)之一 - 初识gtest
  5. less学习三---父选择器
  6. 在写新邮件时,在地址栏中敲入前几个字母,对于已熟悉的收件人,outlook会弹出列表...
  7. http://blog.sina.com.cn/s/blog_4aae007d0100inxi.html
  8. iOS应用开发最佳实践
  9. 微软 CEO 纳德拉痛失爱子
  10. 利用分类模型学习特征权重
  11. 生产环境apache2整合tomcat动静分离
  12. C语言-简谱转换成哨笛指谱
  13. Photoshop cc 2019 破解教程
  14. java deprecated 注释_@Deprecated注解的使用
  15. 【论文笔记】Weakly Supervised Discriminative Feature Learning with State Information for Person ...
  16. js获取并设置lt;pgt;lt;/pgt;的显示的值。
  17. turtlebot运动控制问题(不用键盘控制,自己写控制节点控制地盘)
  18. 商汤提出手机端实时单目三维重建系统,实现逼真AR效果和交互
  19. @Slf4j注解实现日志输出
  20. hadoop之hdfs搭建

热门文章

  1. 「数据管理系统」顶级数据库管理系统供应商
  2. Three.js基础光源和特殊光源的用法
  3. Mysql Join-连接查询(上)
  4. Pillar-based Object Detection for Autonomous Driving(基于柱体的自动驾驶目标检测)论文笔记
  5. Mac显示和关闭隐藏文件
  6. hackbar2.1.3 安装教程(附下载地址 )Firefox Chrome
  7. PRML翻译 Chap1 Introduction
  8. echarts绘制广东省地图
  9. 使用静默方式安装Oracle数据库软件
  10. 野火STM32资源免费下载(视频,资料、手册、书籍等免费下载),知识传递