作品介绍:
本项目是一款基于Android的串口通信自动化工具,专为嵌入式通信模组(如4G/5G模组)的调试与产测场景设计。应用通过JNI底层驱动同时管理三路串口(CTL控制通道、STREAM数据通道、LOG日志通道),支持AT指令集交互与PDU格式短信收发。
主要功能:
三路串口实时日志监控,支持分页显示、自动滚动、清空与导出
设备控制:开关机、重启、版本查询、回环/PLOG/码流控制
电话拨测:支持通话模式与话音速率选择
手动AT指令注入,支持自定义间隔的重复连续发送
PDU格式短信发送,同样支持循环发送
ETH0有线网络TCP客户端通信
PING网络连通性测试
智能断连检测与自动重连:当底层服务异常重启导致串口FD失效时,自动关闭失效通道并以指数退避策略重建连接,确保通信不间断
服务能力: 后台串口读写线程持续运行,主线程通过Handler机制异步处理UI更新与指令分发,确保长时间高强度测试下的稳定性与实时性。日志系统支持持久化存储与一键导出,便于问题回溯与分析。
设计思路
三层解耦:UI层(MainActivity)→ 服务层(SerialPortManager单例)→ JNI层(串口C驱动)。读写分离(HandlerThread串行化写操作),回调解耦(SerialPortCallback接口),日志统一(LogFileManager + LogAdapter)。
负责模块与结果
模块 改动文件 结果
重复发送 activity_main.xml、MainActivity.java CheckBox+间隔输入框(默认1000ms),勾选后点击按钮循环发送,取消勾选停止
自动重连 SerialPortManager.java、MainActivity.java 读/写IOException触发,指数退避重连(2s→30s上限),自动恢复三路串口
难点
FD失效检测:旧FD无法直接判断有效性,只能靠读写异常感知
并发状态管理:三路串口独立重连,读失败/写失败/手动重连三种路径可能同时触发同一端口
ReadThread自清理:读线程失败后调用清理逻辑,操作的是自己正在使用的资源
坑与解决
坑 原因 解决
removeCallbacks 失效 每次 () -> {} 是新lambda对象,无法匹配已提交的旧对象 构造函数预创建 Runnable[3] 数组,全局复用同一引用
ReadThread NPE 竞态 closeStalePort 将 mInputStreams[port] 置null时,while条件检查通过但read()读到null 局部变量持有InputStream引用,检查和读取使用同一引用
SMS循环发送覆盖 sendSms() 用全局标志实现两阶段发送,循环调用会覆盖上次未完成的流程 接受覆盖策略(间隔1000ms足够单次完成),生产环境应加排队机制