Android串口通信

2023-05-16

编前记

今天在刷博客(郭老师)的时候评论区看见有人在聊单片机的串口通信,刚好之前做过一个项目通过NFC读取IC门禁卡片的项目所以拿出来分享(复习)一下,先讲了解一下什么是串口通信:串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节的通信方式。以上来自百度百科的介绍。

详细介绍猛戳链接:https://baike.baidu.com/item/%E4%B8%B2%E5%8F%A3%E9%80%9A%E4%BF%A1/3775296?fr=aladdin

在Android系统上是如何进行串口通信的呢?需要先了解以下几个概念

  • 波特率

这是一个衡量符号传输速率的参数。指的是信号被调制以后在单位时间内的变化,即单位时间内载波参数变化的次数,如每秒钟传送240个字符,而每个字符格式包含10位(1个起始位,1个停止位,8个数据位),这时的波特率为240Bd,比特率为10位*240个/秒=2400bps。一般调制速率大于波特率,比如曼彻斯特编码)。

  • 数据位

这是衡量通信中实际数据位的参数。当计算机发送一个信息包,实际的数据往往不会是8位的,标准的值是6、7和8位。如何设置取决于你想传送的信息。比如,标准的ASCII码是0~127(7位)。扩展的ASCII码是0~255(8位)。如果数据使用简单的文本(标准 ASCII码),那么每个数据包使用7位数据。每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。

  • 停止位

用于表示单个包的最后一位。典型的值为1,1.5和2位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。

  • 奇偶校验位

在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。如果是奇校验,校验位为1,这样就有3个逻辑高位。高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。

以下是基于NFC感应(非接触式)卡片的实战

"NFC卡模拟"能添加和模拟4字节、7字节和10字节的卡id,目前市面上主流4字节和7字节10字节暂时还未面世,一个字节用两位十六进制数表示。

工欲善其事,必先利其器,既然要进行通信那就得读写操作,下面提供一个封装好的库:https://pan.baidu.com/s/1JAdtghGxFh-wO5Ga1_4gQA 提取码:exks

// 创建一个SerialPort对象
// 第一个参数File传入要读取的串口路径例如:/dev/ttyS0 具体看开发版定义
// 第二个参数波特率例如:115200 具体看开发版定义
// 第三个参数flags 传入0即可
SerialPort mSerialPort = new SerialPort(new File(serialPath), baudrate, 0);

// 创建完对象就直接获取输入输出流开启读取数据线程
mOutputStream = mSerialPort.getOutputStream();
mInputStream = mSerialPort.getInputStream();
mReadThread = new ReadThread();
mReadThread.start();

private class ReadThread extends Thread {
        @Override
        public void run() {
            super.run();
            while (!isInterrupted()) {
                int size;
                try {
                    if (mInputStream == null)
                        return;
                    byte[] buffer = new byte[512];
                    size = mInputStream.read(buffer);
                    if (size > 0) {
                         // 把读取到的字节数组转换成字符串
                         String str = byteArrToHex(buffer, 0, size);
                        // 这里转换后str就是读取到的数据,根据NFC卡片类型自行进行数据的效验,
                        // 比如有效位与无效位
                        
                        // do something
                          
                    }
                    Thread.sleep(10); // 休眠一下优化效率
                } catch (Exception e) {
                    e.printStackTrace();
                    return;
                }
            }
        }
    }

public static String byteArrToHex(byte[] inBytArr, int offset, int byteCount) {
        StringBuilder strBuilder = new StringBuilder();
        for(int i = offset; i < byteCount; ++i) {
            strBuilder.append(byte2Hex(inBytArr[i]));
        }
        return strBuilder.toString();
    }

public static String byte2Hex(Byte inByte) {
    return String.format("%02x", inByte).toUpperCase();
}

核心代码就只有这么几行,具体业务逻辑自行封装即可,这里只完成读取设备传递过来的数据。

下面提供一个串口测试工具:https://pan.baidu.com/s/1SJjWl8JLnoEFvKrGcUU2zQ 提取码:8f1z

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android串口通信 的相关文章

  • startActivity overridePendingTransition 只显示进入动画

    基本上 我遇到的问题是只显示输入幻灯片动画 调用 Activity 不会产生动画 startActivity intent overridePendingTransition R anim right in partly R anim le
  • 如何从一个活动中完成一系列开放的子活动?

    我正在尝试为我的应用程序制作一个退出按钮 无论如何 我能够跟踪我的应用程序中的所有活动实例 然后完成它们 但在某些情况下 仍有一些活动仍然存在 不知道怎么办 有没有什么方法可以杀死android中的特定应用程序 或者我可以通过任何其他方式退
  • Android Manifest 自动生成无效权限

    我不小心在 Android 清单中输入了无效的权限名称 并且无法将其删除 这是我的清单代码
  • OPENGL ES 不工作:无当前上下文

    我尝试了 OpenGL ES2 for Android 一书中所示的程序 但它不起作用 我已经在Odroid E 三星s3 三星y 三星star上进行了测试 the gl version suported returns 2 but i g
  • 毕加索磁盘缓存

    我正在使用 Picasso 从 URL 加载图像 Picasso with getApplicationContext load product getImageUrl into imageView 据我所知 每次都会访问该网址 而不是缓存
  • Android Facebook sdk 3.5 分享对话框

    您好 我正在为 android sdk 3 5 实现 facebook 共享对话框 但是我按照指南没有取得任何成功 FacebookDialog shareDialog new FacebookDialog ShareDialogBuild
  • 从 BroadcastReceiver 获取方法来更新 UI

    我正在尝试根据变量的变化更新用户界面BroadcastReceiver 因此 我需要调用一个扩展类的方法 以获取我提到的变量 BroadcastReceiver in MainActivity取决于但我无法以任何方式获得真正的返回值 扩展的
  • ListView:防止视图回收

    我有一个使用回收视图的 ListView 我试图阻止视图被回收 所以我使用 setHasTransientState android support v4 view ViewCompatJB setHasTransientState Vie
  • 如何在 Android 应用程序中单击按钮时打开 Gmail Compose?

    当我的 Android 应用程序中单击按钮时 我尝试打开 Gmail 撰写屏幕 我需要 Google 提供的 API 密钥吗 或者我需要在按钮 onClickListener 中做什么 任何形式的见解都非常值得赞赏 正如 JeffC 指出的
  • Android 中有没有办法获取 SD 卡大小?

    欢迎大家 我已经在 Stackoverflow 和 google 上尝试过与此相关的每个问题 但没有一个有效 我已经尝试过类似下一个链接的操作 但它返回的内容与内部存储相同 如何获取外部存储 SD 卡的大小 带安装的 SD 卡 https
  • Android 8.1 中 Activity 自行旋转并恢复正常

    我的应用程序在所有 Android 版本上运行良好 但我注意到在 Android 8 1 0 Oreo 中 当我将屏幕从纵向活动转到横向活动时 以及当我按后退按钮时 它会显示异常行为 屏幕自动从横向旋转并恢复正常 看起来 Activity
  • 多语言 Android 应用程序:在电子邮件和密码字段中显示英文键盘

    我们正在开发一款多语言 Android 应用程序 针对英语和阿拉伯语 面临的问题是在登录和注册屏幕中 我们希望仅以英文文本输入用户名和密码字段 从而显示英文键盘 无论设备区域设置语言如何 已尝试在 edittext 中设置 inputtyp
  • 在后台服务中持续获取位置更新

    我正在开发需要在后台服务中持续获取位置更新的应用程序 我已经使用了它正在使用的后台粘性服务 但是 即使我添加了启动广播并在那里启动了服务 启动完成后服务也没有启动 服务启动并立即被杀死 另外 这不适用于奥利奥 服务在应用程序关闭几分钟后停止
  • 在 Android 中始终以横向模式打开相机

    在我的 Android 应用程序中 单击按钮后我希望相机以横向模式打开 即使我将手机旋转为纵向模式 相机也应始终处于横向模式或纵向模式 使用此代码在横向模式下打开相机 Intent cameraIntent new Intent Media
  • Android:BATTERY_STATUS_DISCHARGING 和 BATTERY_STATUS_NOT_CHARGING 之间的区别

    我想知道这两个标志之间的区别 BatteryManager BATTERY STATUS DISCHARGING And BatteryManager BATTERY STATUS NOT CHARGING 我开发了一个使用这两个标志的应用
  • 截图显示黑色

    我正在拍摄快照并创建缩略图 然后共享此图像 但缩略图显示全黑 我使用了以下代码 Bitmap bitmap View v1 v getRootView v1 setDrawingCacheEnabled true bitmap Bitmap
  • 使用 UPI url 调用 PSP 应用程序

    我正在尝试创建一个商家应用程序 它将根据 NPCI 的指南生成一个 url 此 url 将作为意图共享 并且 PSP 应用程序 任何注册的银行应用程序 应该能够侦听该 url 并被调用 我已经形成了这样的网址 upi pay pa icic
  • 如何更改 Android 12 启动屏幕中的图标形状?

    我想要矩形形状的启动屏幕图标 而不是 android 12 中的圆形形状 我不相信你可以 如果你看这里的第 3 点 https developer android com about versions 12 features splash
  • 无法登录 Google Play 游戏服务

    我在开发者控制台上使用包名称和正确的签名证书设置了我的游戏 并为其创建了排行榜 但没有创建任何成就 然后 我从以下位置下载了示例 Type A Number Challenge 和 BaseGameUtils https developer
  • 如何在 onDraw() 方法中定义与像素无关的高度

    我扩展了 View 来构建自定义小部件 我想用独立的像素单位定义小部件的高度 我认为可以通过将像素密度乘以所需的高度来完成 但我不知道该怎么做 到目前为止我所拥有的 最小化 public class Timeline extends Vie

随机推荐

  • 深入详细理解矩阵 (矩阵的加减乘、转置、共轭、共轭转置)

    简介 矩阵 英文名Matrix 在数学名词中 xff0c 矩阵用来表示统计数据等方面的各种有关联的数据 这个定义很好地解释了Matrix代码制造世界的数学逻辑基础 矩阵是数学中最重要的基本概念之一 xff0c 是代数学的一个主要研究对象 x
  • 无线模块的参数介绍和选型要点

    01 通信频点 通信频点 xff1a 无线模块在工作的时候向外辐射出去的电波频率 xff1b 无线串口模块常用的频点大致可以分为170MHz 230MHz 315MHz 433MHz 490MHz 780MHz 868MHz 915MHz
  • 使用freertos如何确定分配堆栈空间大小

    前言 运行freertos系统的大部分都是资源有限的MCU xff0c 所以对于ram我们都要考虑尽量的节省 xff0c 避免资源浪费 xff0c 从而也可以针对项目选择性价比更好的mcu 关系分析 首先要配置freertos的堆 heap
  • windows从零搭建googletest之c++测试工程

    简介 googletest xff08 也称gtest xff09 是由Google测试技术团队开发的测试框架 为c c 43 43 代码提供了一套优秀的单元测试解决方案 本文介绍使用googletest在windows下从零搭建自己的单元
  • c++ 常用转换vector<uint8_t> 转string

    std span class token double colon punctuation span vector span class token operator lt span span class token keyword uin
  • c语言解析协议常用套路

    简介 协议定义username len value while 读取 2个switch case解析 读取value 代码示例 span class token keyword struct span span class token cl
  • c++模板 --- 模板的嵌套

    简介 明白类型是什么即可 xff0c 可以适当运用using语法起别名 简化代码 一 函数模板嵌套 span class token keyword template span span class token operator lt sp
  • DWA算法详解

    首先在V m V d的范围内采样速度 xff1a allowable v 61 generateWindow robotV robotModel
  • C++OpenCV实现YOLO算法对目标进行检测实战

    基本概念 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp 加载darknet框架的YoloV4模型做目标检测 OpenCV DNN模块支持常见深度学习框架如TensorFlowCaffe Darknet等 对
  • 使用GooSeeker软件进行爬虫

    一 使用GooSeeker软件进行爬虫 xff0c 它是进行读取大量数据的 xff0c 都出来的数据是xml格式的 xff0c 可以通过office excel将xml格式转化成表格形式 1 爬虫取数据 xff1a 1 xff09 先要在网
  • 51单片机--堆栈

    堆栈的作用是用在调用子程序或中断程序时保护现场 xff0c 因为51单片机的寄存器是十分有限的 xff0c 而相对来说普通数据存储器更充足 xff0c 通过入栈将寄存器中的内容临时保存到堆栈中 xff08 普通数据存储器 xff09 xff
  • Git-命令行-使用 Tag 标记你的代码

    前言 正文开始之前 xff0c 我想我们需要弄明白几个问题 xff1a tag 是什么 xff1f 使用tag 的好处 xff1f tag 和 branch 的区别以及使用场景 xff1f tag 是什么 xff1f tag 翻译过来是标签
  • 光流Zoom In and Out开发记录

    简介 2018年7月 xff0c 合作伙伴提出了一个想法 使用光流算法估计相机前后移动 经典的光流算法 xff08 Lukas Kanade算法 xff09 适用于相机左右和上下移动 xff0c 但是在相机前后移动时 xff0c 虽然各个像
  • 关于电子设计大赛无人机题的学习笔记(2)飞控代码分析和高精度IMU传感器的使用

    飞控代码分析和高精度IMU传感器的使用 最近着急备赛很多文档只是处于零零散散状态没办法细节的整理出来专门放一份 xff0c 等比赛结束会统一整理 xff0c 现在只能先放一些研发过程中的技术文档上来了 目前我们的调试进度是 xff0c 稳定
  • 关于电子设计大赛无人机题的学习笔记(3)常用设备总线的使用方法(IIC)

    关于电子设计大赛无人机题的学习笔记 3 常用设备设备总线的使用方法 IIC xff09 1 吐槽及日志 首先 电赛因为疫情原因推迟了 xff0c emmm在我看来跟取消了差不了太多 xff0c 这一波小系列的学习记录暂时只能在第三篇就停止更
  • undefined reference to `pthread_create‘问题的解决 cmake新方法解决

    最近在写相机SDK xff0c 测试中出现了一个小问题undefined reference to 96 pthread create 39 其实是缺少库文件 网上大部分介绍使用 lpthread xff0c 但是这个是老版本了 xff0c
  • POST请求返回:401 Unauthorized

    Postman 做接口测试 xff0c 提交请求后 xff0c 模拟获取数据 xff0c 输入入参正确时 xff0c 却返回status 401 Unauthorized 原因 xff1a 是我的token有误 xff0c token是一串
  • Django从header请求头中的Authorization获取token验证数据

    前言 之前使用django开发api接口时 xff0c 约定是要每次请求都要带token这个参数 xff0c 这样很不方便 xff0c 最近学了vue xff0c 也使用了axios xff0c 发现在axios拦截器中可以设置每次请求头中
  • char类型的数字转int

    char的本质 xff1a char The char data type is a single 16 bit Unicode character It has a minimum value of 39 u0000 39 or 0 an
  • Android串口通信

    编前记 今天在刷博客 郭老师 的时候评论区看见有人在聊单片机的串口通信 xff0c 刚好之前做过一个项目通过NFC读取IC门禁卡片的项目所以拿出来分享 复习 一下 xff0c 先讲了解一下什么是串口通信 xff1a 串口通信 xff08 S