SOCKET/串口通信粘包问题处理,附带详细代码_串口粘包处理-程序员宅基地

技术标签: Android开发  安卓基础  

UDP TCP或者串口通信中有可能会出现粘包问题。具体解决办法有以下几种
1.自定义包体格式包含包头+包体长度
2.加大读取缓冲区buffer

本文介绍第一种方法的
socket通信中我们一般开启一个线程然后死循环的读取其中的信息

我们定好协议格式如下十六进制表示
A3A4+长度两字节+json
其中A3A4为协议头 json是我们需要的具体数据

我们就可以固定的先读取4个字节获取完整包长度再继续读取

                   byte[] temBuffer = new byte[4];
                    if (mInputStream == null) {
    
                        continue;
                    }
                    int ret = mInputStream.read(temBuffer);
                    if (ret > 0) {
    
                        byte[] msg = null;
                        //收到一条新命令为0XA3 0XA4开头的
                        if (temBuffer[0] == (byte) 0xA3 && temBuffer[1] == (byte) 0xA4) {
    
                            //计算命令长度 即2 3字节组合成Int
                            int cmdSize = ConvertUtilsPlus.getIntFromBytes(temBuffer[2], temBuffer[3]);
                            int bodyLength = 4+ cmdSize;//计算出中长度
                            msg = new byte[bodyLength];//申明本次接收一个完整数据需要的容量
                            int recLength = ret;//记录当前已接收数据的长度
                            int errorCount = 0;//记录错误次数
                            System.arraycopy(temBuffer, 0, msg, 0, recLength);//第一包无脑丢进数组中
                            //如果本次读取到的数据小于总长度那么继续read
                            while (recLength < bodyLength && errorCount < 10) {
    
                                byte[] temp = new byte[bodyLength - recLength];
                                int rec = mInputStream.read(temp);
                                if (rec <= 0) {
    
                                    errorCount++;
                                    continue;
                                }
                                //复制读取的数据到数组中
                                System.arraycopy(temp, 0, msg, recLength, rec);
                                recLength += rec;
                            }
                        }
                        //没有新消息继续循环
                        if (msg == null) continue;

getIntFromBytes方法如下

  public static int getIntFromBytes(byte low_h, byte low_l) {
    
        return  (low_h & 0xff) << 8 | low_l & 0xff;
    }

以上方法各位多看看注释应该能理解透彻

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq910689331/article/details/107733632

智能推荐

kinect1.0实现的rgbd-slam_kinect 1.0-程序员宅基地

文章浏览阅读2.1k次,点赞3次,收藏28次。这个rgbd-slam代码是根据高翔的代码改编过来的,具体可以参考创客制造的以下教程https://www.ncnynl.com/category/rgbd-slam/下面我分为7步来介绍我的实现步骤以及中途可能遇到的bug和解决方案1.硬件这是淘宝上买的二手货,只要300多,用起来没什么问题,你可以先在windows下用它的sdk测试以下相机有没有什么问题左边的圆孔为红外..._kinect 1.0

ACM学习心得(1)_acm讲座心得体会-程序员宅基地

文章浏览阅读185次。二分 三分法虽然原理并不难 但是真正理解上确实还要点功夫特别是跟其他知识点结合起来lower_bound():查找(返回)有序区间中第一个大于或等于给定值的元素的位置upper_bound():查找(返回)有序区间中第一个大于给定值的元素的位置lower_bound(a,a+n,x);upper_bound(a,a+n,x);通往奥格瑞玛的道路https://www.luogu.org/problem/P1462这道题是最大值最小 所以是二分法二分最大值 看在此条件下 求最小扣血数(跑spf_acm讲座心得体会

Unity ShaderLab 中的内置变量_shaderlab 内置参数-程序员宅基地

文章浏览阅读1.5k次。点此获取官方文档地址所有的这些内置变量类型无需声明,直接使用,需要包含:UnityCG.cginc file.Transformationsfloat4x4 UNITYMATRIXMVP Current modelviewprojection matrixfloat4x4 UNITYMATRIXMV Current model*view matrixfloa_shaderlab 内置参数

MFC定义圆角矩形按钮_修改mfcgroupbox为圆角矩形-程序员宅基地

文章浏览阅读6.8k次。使用仅需两步!第一步:CButton替换为CBtnNoImg。第二步:设置各个状态的颜色,和字体(字体设置可选) { CFont *pFont = new CFont(); pFont->CreateFont(11, //以逻辑单位方式指定字体的高度 0, //以逻辑单位方式指定字体中字符的平均宽度 0, //指定偏离垂线和X轴在显示面上的夹角(单位:0.1_修改mfcgroupbox为圆角矩形

xml配置文件引用properties文件报错_xml文件找不到propertycommonconfigurer.class-程序员宅基地

文章浏览阅读1.6k次。一般是配置文件引用失败引起的正确的配置:<bean id="propertyConfigurer" class="com.jcl.common.spring.web.***PropertyPlaceholderConfigurer"> <property name="envPropFiles"> <lis..._xml文件找不到propertycommonconfigurer.class

Linux结构目录详解-程序员宅基地

文章浏览阅读1.1k次,点赞26次,收藏15次。Linux在Linux中,系统默认的用户是root,其实和 windows 的 administrator 类似,root 用户可以操作操作系统的任何文件和设备,所以在生产环境就不要乱用root了,权利越大,责任越大。学习Linux,就要习惯通过命令行的方式学习,。目前的Linux导图如下。

随便推点

汇编语言的简答入门--斐波那契数列(递归)_汇编语言递归求斐波那契-程序员宅基地

文章浏览阅读9k次。TITLE Save an array and dispalyINCLUDE Irvine32.inc.dataarray DWORD 12 DUP (?) ; define a array for saving Fibonacci numbersstep = type arraynum DWORD ?count DWORD ?prompt byte "The first_汇编语言递归求斐波那契

pip命令使用详解-程序员宅基地

文章浏览阅读10w+次,点赞29次,收藏188次。pip很像CentOS系统中的yum命令,用于安装及维护Python包。pip的安装windows其实在windows下是默认安装了pip工具的,只是没有将其所在目录加入Path,导致命令查找不到。 将python安装目录下的scripts目录加入环境变量Path中即可。Linux执行下面命令即可完成安装# wget https://bootstrap.pyp..._pip

2013.9.7 CISA pass的一点感想-程序员宅基地

文章浏览阅读68次。2013.9.7 CISA pass的一点感想 先说一个本人基本情况从事信息安全和BCM工作,考试前没有参加培训机构的培训,从6月中旬开始复习CISA,复习材料就是汇哲的教材书和2本红宝书。 看到论坛上各位大牛600+通过,我的通过分数4开头,就不拿出来show了,以免丢人现眼。在此就和大家分享几点个人复习和备考的感受。1、看到论坛上有大..._cisa 初步成绩报告 not pass

SpringSecurity的使用_spring security 3.7使用-程序员宅基地

文章浏览阅读3.9k次。Spring Security 是针对Spring项目的安全框架,也是Spring Boot底层安全模块默认的技术选型,他可以实现强大的Web安全控制,对于安全控制,我们仅需要引入 spring-boot-starter-security 模块,进行少量的配置,即可实现强大的安全管理!使用步骤:1:加入依赖 <dependency> <groupId>org.springframework.boot</groupId> _spring security 3.7使用

Linux 执行定时任务 shell脚本_linux定时任务shell脚本-程序员宅基地

文章浏览阅读540次。https://www.cnblogs.com/grimm/p/8794707.html Linux上面执行定时任务,我们可以利用crontab -e直接编辑定时任务 另外我们还可以写好shell脚本,定时去执行shell脚本,这两个方法都可以起到定时执行的作用下面我详细说一下入如何执行shell脚本1.声明一下我安装的lnmp环境,shell脚本存放的位置在 /usr/local..._linux定时任务shell脚本

给WordPress的文章插入数学公式_word公式在wordpress-程序员宅基地

文章浏览阅读5k次。这里是我的个人网站: https://endlesslethe.com/insert-math-formula-into-wordpress.html 有更多总结分享,最新更新也只会发布在我的个人网站上。排版也可能会更好看一点=v= 问题背景 我使用OneNote写总结。在总结数论相关的算法时,文章会包含数学公式。数学公式是MS特有的格式。直接将OneNote复制到WordPre_word公式在wordpress

推荐文章

热门文章

相关标签