安卓串口调试记录(包括串口通信底层知识点)

2023-05-16

一、有关串口通信基本知识

  • 有关波特率计算(参考链接

第一个字节的10位(1位起始位-0,8位数据位和1位停止位-1)共占约1.05ms,这样可计算出其波特率约为:10bit / 1.05ms X 1000 ≈ 9600 bit/s;

  • 有关数据的传输顺序 是LSB先出的;(参考链接

第一个数据 01010101 反过来就是10101010 =0xAA

第二个10101010 反过来01010101 0x55;

案例:

11 23 ---2020-6-25 10:55 byte发送;

int command[]=new int[]{0x01,0x03,0x00,0x01,0x00,0x04,0x15,0xC9}; 

0 1000 0000 1 * 0 1100 0000 1 * 0 0000 0000 1 *   

01               03              00

0 100 0000 1 * 0 0000 0000  1* 0 0010 0000  1*

01                00         04

0 1010 1000 1* 0 1001 0011 1*

    15         C9

示波器波形
标题

二、代码讲解

    对于倾角模块Bwh527,每发送一次查询数据,串口才能接收到一次数据;

 

 

//在js中代码
        this.printLog('开发串口发送数据');
        Utils.sendAngleCommandProductBwh527Data();
        Utils.sendAngleCommandProductListener();

        //倾角
        setTimeout(()=>{
        Utils.sendAngleCommandProductBwh527Data();

        },100);

//在RCTUtilsModule文件中代码;
    @ReactMethod
    public void sendAngleCommandProductBwh527Data(){  //发送数据

        byte command[]=new byte[]{0x77,0x04,0x00,0x04,0x08}; 

        serialPortUtils.sendSerialPortByte(command);

    }
    final int  adressAngleRs485=0x00;  //本地485地址;
    @ReactMethod
    public void sendAngleCommandProductListener(){  //开监听器;

        serialPortUtils.setOnDataReceiveListener(new             
   SerialPortUtils.OnDataReceiveListener() {
            @Override
            public void onDataReceive(byte[] buffer, int size) {
                Log.d(TAG, "进入数据监听事件中" + changeTool.ByteArrToHex(buffer));
                StringBuffer sBuffer = new StringBuffer();

                //适用于BWH526--圆形串口TTL输出
                if((buffer[2]==adressAngleRs485)){
                    if((buffer[0]==0x77)&&(buffer[1]==0x10)){
                        switch (buffer[3]){
                            case (byte)0x84:  {
                                //x轴角度
                                sBuffer.append(changeTool.Byte2Hex(buffer[4]));
                                sBuffer.append(changeTool.Byte2Hex(buffer[5]));
                                sBuffer.append(changeTool.Byte2Hex(buffer[6]));
                                sBuffer.append(changeTool.Byte2Hex(buffer[7]));
                                if((buffer[4]&0x10)==0x10){
                                    sBuffer.setCharAt(0,'-');
                                }else{
                                    sBuffer.setCharAt(0,' ');
                                }
                                sBuffer.insert(4,'.');
                                Log.d(TAG, "倾角:x轴角度:" + sBuffer);
                                //y轴角度
                                sBuffer.delete(0,sBuffer.length());
                                sBuffer.append(changeTool.Byte2Hex(buffer[8]));
                                sBuffer.append(changeTool.Byte2Hex(buffer[9]));
                                sBuffer.append(changeTool.Byte2Hex(buffer[10]));
                                sBuffer.append(changeTool.Byte2Hex(buffer[11]));
                                if((buffer[8]&0x10)==0x10){
                                    sBuffer.setCharAt(0,'-');
                                }else{
                                    sBuffer.setCharAt(0,' ');
                                }
                                sBuffer.insert(4,'.');
                                Log.d(TAG, "倾角:y轴角度:" + sBuffer);
                                sBuffer.delete(0,sBuffer.length());

                                break;
                            }
                            default: ;
                        }

                    }
                }
                //适用于BWM427--RS485输出
                if((buffer[0]==adressAngleRs485)&&(buffer[1]==0x03)){

                    if((buffer[2]==0x04)){
                        int temp =(buffer[3]<<8)|buffer[4];
                        float tempx=(temp-10000)/100;
                        sBuffer.append(tempx);
                        Log.d(TAG, "倾角:x轴角度:" +sBuffer);
                        sBuffer.delete(0,sBuffer.length());

                        temp =(buffer[5]<<8)|buffer[6];
                        float tempy=(temp-10000)/100;
                        sBuffer.append(tempy);
                        Log.d(TAG, "倾角:x轴角度:" + sBuffer);
                        sBuffer.delete(0,sBuffer.length());
                        
                    }

                }




            }
        });
    }

    //字节数组转转hex字符串
    //-------------------------------------------------------
    //1字节转2个Hex字符
    public static String Byte2Hex(Byte inByte) {
        return String.format("%02x", new Object[]{inByte}).toUpperCase();
    }

    //-------------------------------------------------------
    //字节数组转转hex字符串
    public static String ByteArrToHex(byte[] inBytArr) {
        StringBuilder strBuilder = new StringBuilder();
        for (byte valueOf : inBytArr) {
            strBuilder.append(Byte2Hex(Byte.valueOf(valueOf)));
            strBuilder.append(" ");
        }
        return strBuilder.toString();
    }

 

 

 

 

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

安卓串口调试记录(包括串口通信底层知识点) 的相关文章

  • 用户态协议栈学习,DKDK基本用法介绍

    网络数据流 xff0c 先了解一下用户态协议栈在什么位置 这里以DPDK为例 xff1a xff08 目的是为了获得原始的网络数据 xff0c 除了DPDK xff0c socket raw xff0c netmap也能获取获取以太网数据
  • 多旋翼基本组成

    一 总体认识 多旋翼三大系统 机身 动力系统 控制系统 xff08 导航模块 控制模块 决策模块 xff09 二 机身主体 xff1a 机架 xff08 1 xff09 作用 多旋翼的承载平台 xff0c 所有设备都是用机架承载 因此 xf
  • 数据处理(伪)代码:卡尔曼滤波 vs. 卡尔曼平滑

    步骤一 导入csv或txt格式的试验数据 最简洁也是据说读取速度最快的方法是 xff1a pPath span class token operator 61 span span class token string 39 C data o
  • 四旋翼初次组装

    一 四旋翼配置清单 初次尝试组装四旋翼 xff0c 在淘宝上买相关配件 xff0c 进行组装 初次组装 xff0c 比较乱 二 装机步骤 1 xff1a 机臂与上层中心板安装 xff0c 2 5mm螺丝 2 xff1a 香蕉头灌锡 xff0
  • 四轴飞行前检查及解锁

    一 飞行前的检查及注意事项 1 飞控的校正遥控器中 xff0c 每个通道与MP中显示的通道校正条是否一致 xff0c 遥控器控制杆摇动的方向是否正确 2 飞控的校正是否已经完成了全部校正 3 电机的的安装序号是否与飞控OUTPUT的通道数一
  • pixhawk之NSH调试

    一 ardupilot固件 windows环境 前期准备 1 xff1a pix烧录程序 xff0c Arducopter或者library中的example都可以实现 2 xff1a 拔掉SD卡 xff08 脚本中提到的没有SD卡进入ns
  • 目标检测(yolov3)实现---darknet的C语言版本

    环境安装 ubuntu opencv cuda cudnn gt920m 参考 https blog csdn net qq 36362060 article details 80739573 darknet github地址 https
  • C++PrimerPlus学习笔记——第9章内存模型和名称空间(最全最详细)

    注 xff1a 这一章都是理解记忆性的内容 xff0c 因此笔者在某些知识点会将自己的理解话语写上 xff0c 便于可读性和方便理解 本章内容包括 xff1a 单独编译 xff1b 存储持续性 作用域和链接性 xff1b 定位 xff08
  • 图论——拓扑排序及最短路径算法模板

    一 拓扑排序 span class token comment 将入度为0的点写入myQueue span vector span class token operator lt span span class token keyword
  • 2022 PAT 甲级秋 100分

    PAT2022秋 有一题是卡着时间复杂度去做的结果AC了 希望大家也能来一起交流下最优解 踩气球 AC 这道题调试了很久 才开始用的哈希表内存太大了 span class token macro property span class to
  • 十大排序 C++代码

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • 位运算实现加减乘除、交换

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • 智能指针模拟实现C++

    span class token keyword template span span class token operator lt span span class token keyword typename span span cla
  • 转:卷积神经网络的卷积核大小、个数,卷积层数如何确定呢?

    卷积神经网络的卷积核大小 卷积层数 每层map个数都是如何确定下来的呢 xff1f 看到有些答案是刚开始随机初始化卷积核大小 xff0c 卷积层数和map个数是根据经验来设定的 xff0c 但这个里面应该是有深层次原因吧 xff0c 比如下
  • 生产者消费者模型c++

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • 关于vscode断点调试

    很多人习惯在 Chrome 的调试窗口中调试 Vue 代码 xff0c 或者直接使用 console log 来观察变量值 xff0c 这是非常痛苦的一件事 xff0c 需要同时打开至少 3 个窗体 个人还是更加习惯于断点调试 这篇文章将介
  • 斐讯T1电视盒子刷机指南,已排大坑

    斐讯T1刷机详细指南 xff0c 老手直接看小标题的括号 1 准备好一些文件 xff08 中心思想就是刷写工具 降级img 新系统img xff09 1 0 你需要准备一条双usb头的线 1 1 新系统固件 1 2 斐讯T1官方系统降级文件
  • 关于在conda环境下,pip已安装好包,但是python import错误的解决方法

    1 pip uninstall 那个包 2 conda install 那个包 或者 复制系统python目录下的Lib gt site packages文件夹覆盖conda虚拟环境下的对应文件夹 原因 xff1a pip为系统的pip x
  • win10 系统 U盘无法删除卷

    我的一个U盘折腾来折腾去 xff0c 现在用win10 自带分区磁盘管理的时候 xff0c 右键U盘 删除卷 xff0c 显示不支持该请求 解决办法 xff1a 1 cmd中运行diskpart 2 lisk disk 3 sel disk
  • termux 修改自定义字体

    需要先安装termux styling termux 运行chfont可修改预设的二十几种字体 xff0c 接下来的操作可以添加自己的字体 将字体文件复制到 termux fonts 里 xff0c 再运行chfont就能看到自己的字体了

随机推荐