讲到USB转串口,大都是用的USB->ttl模块,我手里这个是USB CH340的一个usb转串口模块,具体长什么样子可以百度搜一下,这种串口的实现方式和谷歌提供的那种串口解决方式不通,这种是通过USB传输数据的,实现起来比较简单一些,下面来看一下方法:

1、需要用到的jar包  CH34xUARTDriver.jar

链接:https://pan.baidu.com/s/14QHOf_-4jK03u687lCRWIw 
        提取码:yjhk 
2、AndroidManifest.xml配置USB权限

<uses-feature android:name="android.hardware.usb.host" />

3、在当前的activity下添加

            <intent-filter><action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /></intent-filter><intent-filter><action android:name="android.media.action.IMAGE_CAPTURE"/><category android:name="android.intent.category.DEFAULT"/></intent-filter><meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"android:resource="@xml/device_filter" />

4、在Application 里实现一个静态的CH34xUARTDriver  对象

public class MyApp extends Application {public static CH34xUARTDriver driver;
}

5、在activity内实现串口读写开关

public class MainActivity extends Activity {private static final String ACTION_USB_PERMISSION = "cn.wch.wchusbdriver.USB_PERMISSION";private EditText readText;private boolean isOpen;private Handler handler;private int retval;private MainActivity activity;public byte[] writeBuffer;public byte[] readBuffer;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);MyApp.driver = new CH34xUARTDriver((UsbManager) getSystemService(Context.USB_SERVICE), this,ACTION_USB_PERMISSION);initUI();//判断系统是否支持USB HOSTif (!MyApp.driver.UsbFeatureSupported()) {Dialog dialog = new AlertDialog.Builder(MainActivity.this).setTitle("提示").setMessage("您的设备不支持USBhost").setPositiveButton("确认",new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface arg0,int arg1) {System.exit(0);}}).create();dialog.setCanceledOnTouchOutside(false);dialog.show();}getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);//保持屏幕常亮状态writeBuffer = new byte[512];readBuffer = new byte[512];isOpen = false;activity = this;//打开流程主要步骤为ResumeUsbList,UartInitopenButton.setOnClickListener(new openButton());openButton.post(new Runnable() {@Overridepublic void run() {openButton.performClick();}});handler = new Handler() {public void handleMessage(Message msg) {String str = msg.obj.toString();//设备回来的数据String s0 = str.substring(0, 8);if(s0.equals("01 03 09")){//String s1 = str.substring(9,23); /**卡号*/String s2 = str.substring(24,35);/**余额*/int i = Integer.valueOf(s2.replaceAll(" ",""),16);//转换成分String s = String.valueOf(i/100);                 //转换成元synthesizer.showVideo("您的卡上余额为:"+s+"元");}readText.append((String) msg.obj);}};}class WriteButton implements View.OnClickListener{@Overridepublic void onClick(View v) {byte[] to_send = toByteArray(writeText.getText().toString());int retval = MyApp.driver.WriteData(to_send, to_send.length);//写数据,第一个参数为需要发送的字节数组,第二个参数为需要发送的字节长度,返回实际发送的字节长度if (retval < 0){Toast.makeText(MainActivity.this, "写失败",Toast.LENGTH_SHORT).show();}else {writeBtn.setOnClickListener(new WriteBtn());writeBtn.post(new Runnable() {@Overridepublic void run() {writeBtn.performClick();}});}}}class WriteBtn implements View.OnClickListener{@Overridepublic void onClick(View v) {byte[] to_send = toByteArray(write.getText().toString());int retval = MyApp.driver.WriteData(to_send, to_send.length);//写数据,第一个参数为需要发送的字节数组,第二个参数为需要发送的字节长度,返回实际发送的字节长度if (retval < 0) {Toast.makeText(MainActivity.this, "写失败",Toast.LENGTH_SHORT).show();}}}class setButton implements View.OnClickListener{@Overridepublic void onClick(View v) {if (MyApp.driver.SetConfig((byte)9600, (byte)8, (byte)1, (byte)0,(byte)0)) {//配置串口波特率,函数说明可参照编程手册Toast.makeText(MainActivity.this, "串口设置成功",Toast.LENGTH_SHORT).show();//01      05     00  00       FF  00        8c  3a//01      06     00  00       00  64             88  21/*byte[] send = toByteArray(write.getText().toString());MyApp.driver.WriteData(send, send.length);*/writeButton.setOnClickListener(new WriteButton());writeButton.post(new Runnable() {@Overridepublic void run() {writeButton.performClick();}});} else {Toast.makeText(MainActivity.this, "串口设置失败",Toast.LENGTH_SHORT).show();}}}class openButton implements View.OnClickListener{@Overridepublic void onClick(View v) {if (!isOpen) {retval = MyApp.driver.ResumeUsbList();if (retval == -1) {// ResumeUsbList方法用于枚举CH34X设备以及打开相关设备Toast.makeText(MainActivity.this, "打开设备失败",Toast.LENGTH_SHORT).show();MyApp.driver.CloseDevice();} else if (retval == 0){if (!MyApp.driver.UartInit()) {//对串口设备进行初始化操作Toast.makeText(MainActivity.this, "设备初始化失败",Toast.LENGTH_SHORT).show();Toast.makeText(MainActivity.this, "打开" +"设备失败",Toast.LENGTH_SHORT).show();return;}Toast.makeText(MainActivity.this, "打开设备成功",Toast.LENGTH_SHORT).show();isOpen = true;openButton.setText("关闭");configButton.setEnabled(true);writeButton.setEnabled(true);new readThread().start();//开启读线程读取串口接收的数据configButton.setOnClickListener(new setButton());configButton.post(new Runnable() {@Overridepublic void run() {configButton.performClick();}});} else {AlertDialog.Builder builder = new AlertDialog.Builder(activity);builder.setIcon(R.drawable.icon);builder.setTitle("未授权限");builder.setMessage("确认退出吗?");builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {System.exit(0);}});builder.setNegativeButton("返回", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {}});builder.show();}} else {MyApp.driver.CloseDevice();openButton.setText("打开");configButton.setEnabled(false);writeButton.setEnabled(false);isOpen = false;}}}/** 读取设备数据* */private class readThread extends Thread {public void run() {byte[] buffer = new byte[4096];while (true) {Message msg = Message.obtain();if (!isOpen) {break;}int length = MyApp.driver.ReadData(buffer, 4096);if (length > 0) {String recv = toHexString(buffer, length);msg.obj = recv;handler.sendMessage(msg);}}}}/*** 将byte[]数组转化为String类型* @param arg*            需要转换的byte[]数组* @param length*            需要转换的数组长度* @return 转换后的String队形*/private String toHexString(byte[] arg, int length) {String result = new String();if (arg != null) {for (int i = 0; i < length; i++) {result = result+ (Integer.toHexString(arg[i] < 0 ? arg[i] + 256 : arg[i]).length() == 1 ? "0"+ Integer.toHexString(arg[i] < 0 ? arg[i] + 256: arg[i]): Integer.toHexString(arg[i] < 0 ? arg[i] + 256: arg[i])) + " ";}return result;}return "";}/*** 将String转化为byte[]数组* @param arg*            需要转换的String对象* @return 转换后的byte[]数组*/private byte[] toByteArray(String arg) {if (arg != null) {char[] NewArray = new char[1000];char[] array = arg.toCharArray();int length = 0;for (int i = 0; i < array.length; i++) {if (array[i] != ' ') {NewArray[length] = array[i];length++;}}int EvenLength = (length % 2 == 0) ? length : length + 1;if (EvenLength != 0) {int[] data = new int[EvenLength];data[EvenLength - 1] = 0;for (int i = 0; i < length; i++) {if (NewArray[i] >= '0' && NewArray[i] <= '9') {data[i] = NewArray[i] - '0';} else if (NewArray[i] >= 'a' && NewArray[i] <= 'f') {data[i] = NewArray[i] - 'a' + 10;} else if (NewArray[i] >= 'A' && NewArray[i] <= 'F') {data[i] = NewArray[i] - 'A' + 10;}}byte[] byteArray = new byte[EvenLength / 2];for (int i = 0; i < EvenLength / 2; i++) {byteArray[i] = (byte) (data[i * 2] * 16 + data[i * 2 + 1]);}return byteArray;}}return new byte[] {};}/*** 将String转化为byte[]数组* @param arg*            需要转换的String对象* @return 转换后的byte[]数组*/private byte[] toByteArray2(String arg) {if (arg != null) {char[] NewArray = new char[1000];char[] array = arg.toCharArray();int length = 0;for (int i = 0; i < array.length; i++) {if (array[i] != ' ') {NewArray[length] = array[i];length++;}}NewArray[length] = 0x0D;NewArray[length + 1] = 0x0A;length += 2;byte[] byteArray = new byte[length];for (int i = 0; i < length; i++) {byteArray[i] = (byte)NewArray[i];}return byteArray;}return new byte[] {};}
}
<?xml version="1.0" encoding="UTF-8"?>
<resource><usb-device product-id="29987" vendor-id="6790" /><usb-device product-id="21795" vendor-id="6790" /><usb-device product-id="21778" vendor-id="6790" />
</resource>

另外再提供一个github上面开源的一个开源库:

https://github.com/mik3y/usb-serial-for-android

Android USB转ttl串口相关推荐

  1. DIY一款4路USB转TTL串口调试模块

    目录 1.电源设计 2.USB集线器设计 3.USB转TTL设计 4.模块效果 最近调测程序经常用到单片机的三个串口同时交互通信,我使用1路USB转TTL串口调试模块不断切换,不仅影响观察效果,更是劳 ...

  2. 使用USB转TTL串口板和ST-LINK调试下载器给STM32单片机下载程序

    使用USB转TTL串口板和ST-LINK调试下载器给STM32单片机下载程序 简介 STM32的启动模式 JTAG和SWD接口引脚对比 驱动安装 使用官方STM32 ST-LINK Utility软件 ...

  3. 通过USB转TTL串口下载stm32程序

    文章目录 前言 一.硬件及其接线 二.使用步骤 1.主芯片STM32F103C8T6开发板 2.转串口模块接线 3.CH340驱动及安装方法 4.CH340驱动及安装方法 4.下载测试 5.0.91寸 ...

  4. 用USB转TTL串口测试ESP8266-01 WIFI 模块

    ESP8266-01 WiFi模块. 通过AT指令在局域网下与 TCP 服务器进行简单通信. ESP8266 通过 USB 转 TTL 与电脑相互连接.需要连接的引脚有:URXD,UTXD,GND,V ...

  5. USB转TTL串口板使用问题

    PC端与下位机无法通信 常见的硬件问题: 0. TX.RX接反了. 1. 如果串口板直接插pc的usb口,那极大可能是串口板挂了,需要把串口板断电后,重新上电.如果使用SecureCRT与下位机通信, ...

  6. 【MSP430】如何用USB转TTL 串口下载

    最近要用MSP430. 以前也就学校课程学过一点,实验室有配套的开发板和下载调试器. 这次是在家里,去淘宝找了一圈,最便宜的MSP430F149核心板都要30元,调试器也挺贵的,比核心板还贵. 查了一 ...

  7. ft232电路ttl_基于Arduino使用FT232 USB转TTL串口模块

    产品介绍 1.采用原装FT232BL工业级芯片,外置EEPRON(93C46)更稳定 2.支持Windows 10 3.支持3种供电模式:5V对外供电.3.3V对外供电.由外部供电(要求3.3V-5V ...

  8. usb转ttl_[开源]双TYPEC转TTL串口模块

    在工作中经常会用到USB转TTL串口调试工具.网上买的用的不顺手,所以做了一个.最终效果: 渲染图 实物图 学习目的 做一个USB转串口模块,使用 学习渲染软件keyshot 使用到的工具: 立创ED ...

  9. ch340电路 usb转串口电路 usb转ttl usb连接单片机串口 ch340全自动下载电路

    CH340手册官网下载链接:USB转串口芯片:CH340 - 南京沁恒微电子股份有限公司 概述 CH340是一款 USB 总线的转接芯片,实现 USB 转TTL串口或者 USB 转打印口. 成本便宜, ...

最新文章

  1. 手把手教你洞悉 PyTorch 模型训练过程,彻底掌握 PyTorch 项目实战!(文末重金招聘导师)...
  2. 通过VB结构数组输入数据VC编写DLL
  3. 精通GridView(C#) (二)
  4. PMP中关于配置管理系统和配置管理项
  5. ACM基础题 - 求矩形个数
  6. mysql sqlexception_c-很奇怪-mysql的sql :: SQLException未被其类型捕...
  7. 4G + 1G = 5G?
  8. SqlAlchemy ORM
  9. php 日期和时间 (转)
  10. router单页面多个标签tags的用法router-view/router-view
  11. 将本地的代码提交到github仓库
  12. Google可能退出中国市场
  13. 有什么好用的电脑录音软件?
  14. Python中numpy库的linspace函数
  15. 远程控制-Sality(需专杀工具请三连并私信)
  16. npm启动报错Eorror:ENOENT no such file or directory ‘/node-sass/vender‘
  17. JVM垃圾回收(二) 垃圾回收算法
  18. CoreAudioApi-音频端点设备-检测耳机插拔
  19. #pragma用法详解
  20. 图解卡尔曼滤波(Kalman Filter)

热门文章

  1. 防止360浏览器小窗下载视频
  2. 完全背包(背包问题)
  3. vue3查看当前路由
  4. Excel数据导入Matlab绘图
  5. kafka是什么,怎么用?
  6. error link1158 无法运行rc.exe
  7. 米家扫地机器人扫到一半停了_MIJIA 米家 扫地机器人一年使用体验
  8. 分布式事务 (含面试题)- 图解 - 秒懂 - 史上最全
  9. php新闻删除功能设计,PHP开发 新闻发布系统之新闻删除页面
  10. nginx配置tcp转发