Android 串口底层基础:USB 串口、RS485/232 驱动识别、串口通信框架入门
Android 串口底层基础USB 串口、RS485/232 驱动识别、串口通信框架入门工控板子要跟传感器、继电器、PLC 对话串口就是那根嗓子。搞不定串口工控项目等于哑巴。一、串口通信基础串口通信是最经典的设备间通信方式核心是UART通用异步收发传输器协议。数据按位bit逐个传输不需要时钟线双方靠约定的波特率同步。1.1 UART 协议帧结构一个完整的 UART 数据帧[空闲] [起始位] [D0 D1 D2 D3 D4 D5 D6 D7] [校验位] [停止位] 高电平 1bit 5~9bit数据 0/1bit 1/1.5/2bit起始位1 个低电平标志数据帧开始数据位5/6/7/8/9 位常用 8 位校验位奇校验Odd、偶校验Even、无校验None停止位1/1.5/2 位高电平标志帧结束1.2 RS232 vs RS485 区别这是工控领域最常被问的问题直接上对比表特性RS232RS485传输方式全双工半双工电平标准±3V~±15V负逻辑差分信号 ±2V~±6V通信距离约 15 米约 1200 米节点数1 对 11 对多最多 32/128/256 节点抗干扰较弱强差分传输典型接口DB99 针两根线 A/B工控用途近距离调试长距离组网、Modbus 总线一句话记RS232 适合桌面调试RS485 才是工控现场的硬骨头。RS485 两根线走差分信号抗干扰能力碾压 232车间里几十个传感器挂一根线没问题。1.3 串口核心参数参数说明常见值波特率每秒传输的 bit 数9600 / 19200 / 38400 / 115200数据位每帧数据位数8停止位帧结束标志1校验位数据校验方式None流控流量控制None / RTS/CTS工控设备最经典的配置9600, 8N1波特率 96008 数据位无校验1 停止位。碰到不确定的设备先试这个。二、Android 串口两种方案Android 平台操作串口主要有两条路线2.1 方案对比方案原理适用场景优缺点USB Host 模式通过 USB OTG 连接 USB 转串口模块平板/手机无原生串口通用性强但需 USB 权限延迟略高ttyS 设备节点直接读写 /dev/ttySx 节点工控板自带 UART 引脚延迟低、性能好需 root 或系统权限简单说用商用平板做项目选 USB Host 方案用定制工控主板如 RK3568、全志 A40i选 ttyS 方案性能更高。三、USB 串口方案USB Host API 与 usb-serial-for-android3.1 USB Host API 基础Android 3.1 引入 USB Host 支持通过UsbManager管理连接的 USB 设备。流程如下获取UsbManager实例枚举已连接的 USB 设备申请 USB 权限打开设备获取UsbDeviceConnection找到正确的UsbEndpoint输入/输出端点通过bulkTransfer()收发数据3.2 usb-serial-for-android 开源库自己裸写 USB 协议太痛苦社区有成熟的开源库usb-serial-for-androidGitHub: mik3y/usb-serial-for-android支持主流 USB 转串口芯片芯片厂商常见模块CH340沁恒CH340G、CH340CCP210xSilicon LabsCP2102、CP2104FTDIFTDIFT232RLPL2303ProlificPL2303HXCH9102沁恒CH9102F引入依赖dependencies { implementation com.github.mik3y:usb-serial-for-android:3.4.6 }3.3 完整代码示例publicclassUsbSerialHelper{privatefinalContextmContext;privatefinalUsbManagermUsbManager;privateUsbSerialPortmSerialPort;privateSerialInputOutputManagermSerialIoManager;publicinterfaceSerialDataCallback{voidonDataReceived(byte[]data);voidonError(Exceptione);}privateSerialDataCallbackmCallback;publicUsbSerialHelper(Contextcontext,SerialDataCallbackcallback){this.mContextcontext;this.mCallbackcallback;this.mUsbManager(UsbManager)context.getSystemService(Context.USB_SERVICE);}/** * 查找并打开第一个可用的USB串口设备 */publicbooleanopen(intbaudRate){// 1. 查找所有USB设备ListUsbSerialDriverdriversUsbSerialProber.getDefaultProber().findAllDrivers(mUsbManager);if(drivers.isEmpty()){Log.e(UsbSerial,未找到USB串口设备);returnfalse;}// 2. 取第一个驱动UsbSerialDriverdriverdrivers.get(0);UsbDevicedevicedriver.getDevice();// 3. 申请权限if(!mUsbManager.hasPermission(device)){PendingIntentpiPendingIntent.getBroadcast(mContext,0,newIntent(com.android.example.USB_PERMISSION),PendingIntent.FLAG_IMMUTABLE);mUsbManager.requestPermission(device,pi);returnfalse;}// 4. 打开连接UsbDeviceConnectionconnectionmUsbManager.openDevice(device);if(connectionnull)returnfalse;mSerialPortdriver.getPorts().get(0);try{mSerialPort.open(connection);// 配置串口参数9600, 8N1, 无流控mSerialPort.setParameters(baudRate,8,UsbSerialPort.STOPBITS_1,UsbSerialPort.PARITY_NONE);mSerialPort.setDTR(true);// 某些设备需要mSerialPort.setRTS(true);// 5. 启动收发管理器mSerialIoManagernewSerialInputOutputManager(mSerialPort,newSerialInputOutputManager.Listener(){OverridepublicvoidonNewData(byte[]data){if(mCallback!null){mCallback.onDataReceived(data);}}OverridepublicvoidonRunError(Exceptione){if(mCallback!null){mCallback.onError(e);}}});// 在独立线程中运行newThread(mSerialIoManager).start();returntrue;}catch(IOExceptione){mCallback.onError(e);returnfalse;}}/** * 发送数据 */publicvoidsend(byte[]data){if(mSerialPort!null){try{mSerialPort.write(data,1000);// 超时1000ms}catch(IOExceptione){mCallback.onError(e);}}}/** * 关闭串口 */publicvoidclose(){if(mSerialIoManager!null){mSerialIoManager.stop();mSerialIoManagernull;}try{if(mSerialPort!null){mSerialPort.close();}}catch(IOExceptione){// ignore}mSerialPortnull;}}四、ttyS 节点方案JNI/Native 层直接操作工控主板通常在/dev/下暴露串口设备节点如/dev/ttyS1、/dev/ttyS3、/dev/ttyMT0等。这种方案需要通过JNI调用 C/C 层的open()/read()/write()系统调用。4.1 C 层串口操作核心#includefcntl.h#includetermios.h#includeunistd.hintopen_serial(constchar*device,intbaudrate){intfdopen(device,O_RDWR|O_NOCTTY|O_NDELAY);if(fd0)return-1;structtermiosoptions;tcgetattr(fd,options);// 设置波特率speed_tspeed;switch(baudrate){case9600:speedB9600;break;case19200:speedB19200;break;case115200:speedB115200;break;default:speedB9600;break;}cfsetispeed(options,speed);cfsetospeed(options,speed);// 8N1配置options.c_cflag~PARENB;// 无校验options.c_cflag~CSTOPB;// 1停止位options.c_cflag~CSIZE;options.c_cflag|CS8;// 8数据位options.c_cflag|(CLOCAL|CREAD);// 启用接收tcsetattr(fd,TCSANOW,options);returnfd;}4.2 权限处理访问/dev/ttySx需要 root 或将 app 加入对应权限组。工控固件通常在init.rc中配置chmod666/dev/ttyS1或在 SELinux 策略中放行。没有 root 的设备USB Host 方案是唯一选择。五、串口数据收发流程与协议帧解析5.1 串口数据的粘包问题串口是字节流没有消息边界概念。一次read()可能收到半条数据也可能收到两条半数据。必须靠自定义协议帧来解析。5.2 典型协议帧结构[帧头][设备地址][功能码][数据长度][数据][校验][帧尾] 0xAA 0x01 0x03 0x04 .... CRC 0x55解析代码示例privatefinalByteArrayOutputStreammRecvBuffernewByteArrayOutputStream();publicvoidhandleData(byte[]newData){mRecvBuffer.write(newData,0,newData.length);byte[]bufmRecvBuffer.toByteArray();while(buf.length8){// 最小帧长8字节// 找帧头intstartindexOf(buf,(byte)0xAA);if(start0){mRecvBuffer.reset();return;}if(start0){// 丢弃帧头前的脏数据mRecvBuffer.reset();mRecvBuffer.write(buf,start,buf.length-start);bufmRecvBuffer.toByteArray();}// 读取数据长度intdataLenbuf[3]0xFF;intframeLen2111dataLen11;// 头地址功能长度数据校验尾if(buf.lengthframeLen){return;// 数据不够等下一次}// 校验CRCbyte[]framenewbyte[frameLen];System.arraycopy(buf,0,frame,0,frameLen);if(frame[frameLen-1](byte)0x55){// 完整帧回调onFrameReceived(frame);}// 移除已解析的数据mRecvBuffer.reset();if(buf.lengthframeLen){mRecvBuffer.write(buf,frameLen,buf.length-frameLen);}bufmRecvBuffer.toByteArray();}}协议帧解析是串口编程最容易出 bug 的地方。核心思路缓冲区 找帧头 长度校验 CRC 校验四个步骤缺一不可。六、工控场景常见串口设备设备类型典型协议接口波特率温湿度传感器Modbus RTURS4859600继电器模块自定义 ASCII/HEXRS4859600PLC西门子/三菱Modbus RTU / 自有协议RS4859600~19200条码扫描枪串口透传RS232115200RFID 读卡器Wiegand / 串口协议RS232/4859600电磁流量计Modbus RTURS4859600变频器Modbus RTURS48519200串口通信是工控 Android 开发的基石。无论是 USB 方案还是 ttyS 方案核心都是正确配置参数 稳定收发数据 可靠解析协议帧。把这三个环节吃透对接任何串口设备都不慌。

相关新闻

TMS320C54x DSP内存映射与I/O模拟配置实战指南

TMS320C54x DSP内存映射与I/O模拟配置实战指南

1. 项目概述与核心价值在嵌入式系统开发,尤其是DSP这类资源受限、架构独特的处理器上,内存映射配置和I/O模拟是每个开发者都必须跨越的一道坎。这不仅仅是调试器里的几个菜单选项或命令行参数,它直接关系到你的程序能否在目标板上正确运行、能…

2026/7/27 0:01:55 阅读更多 →
xcku5p-ffvb676-2-i 设计 RoCEv2 时 constraints.xdc 配置依据核查记录

xcku5p-ffvb676-2-i 设计 RoCEv2 时 constraints.xdc 配置依据核查记录

constraints.xdc 配置依据核查记录 被核查文件:fpga/vitis/xcku5p/build/constraints/constraints.xdc 目标板卡:RK-XCKU5P-F V1.2(搭载 xcku5p-ffvb676-2-i) 移植母本:fpga/pynq/rfsoc-pynq/build/constraints/constraints.xdc(NVIDIA Holoscan Sensor Bridge 参考工程)…

2026/7/27 0:01:55 阅读更多 →
C54x DSP流水线机制深度解析:RET、XC、CC指令周期与中断响应

C54x DSP流水线机制深度解析:RET、XC、CC指令周期与中断响应

1. 项目概述:C54x DSP流水线机制深度剖析在嵌入式DSP开发领域,尤其是面对德州仪器(TI)的C54x系列数字信号处理器时,我们常常会听到一个词:“流水线”。很多工程师在编写汇编代码时,只是模糊地知…

2026/7/27 0:01:55 阅读更多 →

最新新闻

GetQzonehistory:一键备份QQ空间青春记忆的终极指南

GetQzonehistory:一键备份QQ空间青春记忆的终极指南

GetQzonehistory:一键备份QQ空间青春记忆的终极指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾在深夜翻看QQ空间,试图找回那些被岁月尘封的青春印记…

2026/7/27 0:21:07 阅读更多 →
如何通过WechatDecrypt解密微信数据库:技术原理与实用指南

如何通过WechatDecrypt解密微信数据库:技术原理与实用指南

如何通过WechatDecrypt解密微信数据库:技术原理与实用指南 【免费下载链接】WechatDecrypt 微信消息解密工具 项目地址: https://gitcode.com/gh_mirrors/we/WechatDecrypt 微信数据库加密机制是保护用户隐私的重要技术手段,但这也给合法的数据备…

2026/7/27 0:21:07 阅读更多 →
2026零基础转行网安真心话:没基础、非科班,普通人到底能不能弯道超车?

2026零基础转行网安真心话:没基础、非科班,普通人到底能不能弯道超车?

引言:别再被焦虑收割,讲点转行圈的大实话每天都能收到几十条私信,全是打工人最真实的迷茫:“文职、运营、测试太内卷了,薪资天花板太低,想跳槽不知道去哪?” “零基础、非科班、不会代码&#x…

2026/7/27 0:21:07 阅读更多 →
零门槛入门网络安全|不用编程不用基础,普通人也能轻松学、高薪上岸

零门槛入门网络安全|不用编程不用基础,普通人也能轻松学、高薪上岸

前言:90%的人,都被“假象”劝退了想转行、想学一门硬核副业、想找稳定高薪技术岗的人,大多都听过网络安全。但绝大多数人,还没开始就直接放弃了:“我零基础,不会代码肯定学不会。” “英语不好、不是计算机…

2026/7/27 0:21:07 阅读更多 →
数据分析工具链整合复盘:一个账号打通所有系统的单点登录

数据分析工具链整合复盘:一个账号打通所有系统的单点登录

数据分析工具链整合复盘:一个账号打通所有系统的单点登录朱大喜的数据日记 | 第 9 篇 登录10个系统要输10次密码,这不叫效率,叫折磨。上周数据组来了个新同事,入职第一天光是注册账号就花了两小时——Hive集群、ClickHouse、Airfl…

2026/7/27 0:20:06 阅读更多 →
如何快速掌握TotalSegmentator:从零开始的医学影像分割完整指南

如何快速掌握TotalSegmentator:从零开始的医学影像分割完整指南

如何快速掌握TotalSegmentator:从零开始的医学影像分割完整指南 【免费下载链接】TotalSegmentator Tool for robust segmentation of >100 important anatomical structures in CT and MR images 项目地址: https://gitcode.com/gh_mirrors/to/TotalSegmentat…

2026/7/27 0:20:06 阅读更多 →

日新闻

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →
SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

1. 项目概述:从寄存器手册到实战指南 如果你手头有一份类似德州仪器(TI)TMS320x240xA系列DSP的SPI模块技术手册,看着里面密密麻麻的寄存器位定义、时序图和公式,是不是感觉头大?这份资料虽然权威&#xff0…

2026/7/27 0:00:54 阅读更多 →
【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/26 0:00:31 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/26 0:00:31 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/26 0:00:31 阅读更多 →

月新闻