关于串口数据的发送和接收(调试必备)

关于串口数据的发送和接收(调试必备)前言对于串口的数据发送和接收,大多是都是利用串口中断来进行的,但是这样对于编程方面有一定要求,并且程序也不太好写,比如说,如果让你随意接收一段数据,然后利用串口将它发送出来,第一个需要考虑的问题就是接收数据的长度,怎么才知道一段数据是否结束?或者说如果串口助手上面没有可以在数据末尾加上结束标志的时候,你如何知道数据的结束?,这必然牵涉到一定的编程技巧。但是,之前在接触C语言的时候,我们就利用过…

大家好,又见面了,我是你们的朋友全栈君。

前言

对于串口的数据发送和接收,大多是都是利用串口中断来进行的,但是这样对于编程方面有一定要求,并且程序也不太好写,比如说,如果让你随意接收一段数据,然后利用串口将它发送出来,第一个需要考虑的问题就是接收数据的长度,怎么才知道一段数据是否结束?或者说如果串口助手上面没有可以在数据末尾加上结束标志的时候,你如何知道数据的结束?,这必然牵涉到一定的编程技巧。但是,之前在接触C语言的时候,我们就利用过printf和Scanf,那么我们能否利用它们?如果能够利用的话,那么就很方便了。

串口接收和发送机理

首先我们要知道的是串口的工作机理,串口是通过数据帧的发送,这里我就不多去牵扯那些基础的知识,假定我们使用的如下设置,波特率为9600,8位数据。其它的什么奇偶校验都不用。那么它与PC机之间的通信流程是怎么样的呢?第一,数据帧的大小是10位,包含起始位和结束位,起始位固定为0,结束位固定为1。比如现在PC机要向单片机传递数据,首先单片机检测到数据开始位0,那么单片机开始接受后面的数据,通过移位寄存器,一位一位将数据送入,当8位后,接收到结束标志,这个时候RI置位,单片机进入中断程序,软件置零RI,在最快的时间将SBUF中的值读取了,然后退出中断,等待下一个数据接收完毕,就这样将数据一个一个的传送进来。那么发送又是怎么样的呢?首先单片机将数据发送,然后在最后一位发送完毕后,TI置位,进入中断服务程序,将TI清零,接着发送下一个字节的数据,并且退出中断,等待发送完毕,就这样将数据一位一位发送出去。

printf函数的使用

了解的串口的收发机理后,就可以思考编程的思路了,首先我们可以利用数组元素来一个字节一个字节的发送和接收,当然程序上的功夫是一定要的,既要保证数据完全发送出去,也要保证数据完整的被接受。这样是最复杂,但是却符合中断的机理,在字符间能够去做主程序得到事情。完全不浪费时间。但是,为了我们数据的收发简便,便于调试,我们需要这样的机理,比如需要发送数据的时候,那么一次性发送完,需要接收数据的时候,一次性接收完,在对于时间要求不高的情况下,这样是可行的!那么我们来看一下keil中STDIO.h的头文件里面自带的函数printf是如何工作的。首先printf中的函数是看不到的,其中的源码也没办法知道,但是我知道的是,它调用了一下库中的PUTCHAR的文件,大家可以点击进去看一下。

关于串口数据的发送和接收(调试必备)

它最简单的版本就是一下显示的函数

关于串口数据的发送和接收(调试必备)

那么,它采用了一种什么思想呢?就是查询发,也就是如果要发送的话,那么这段时间就只做发送这一件事。它在TI为1后,就将TI = 0 , 然后将数据放在SBUF中,然后在函数while( !TI )中等待数据发送完毕( TI就会置位 ),然后利用这个基本的函数,将数据全部发送出去,当然,这个只是它调用的一个函数,那么大部分还有看不到的,我们不用理会,只用知道一件事情就可以了,就是在调用printf这个函数的时候,我们一定要先将TI置位,那么printf才会正常运行,并且在\0的时候结束。所以,要想使用printf的话,就先设置好串口的波特率,不用开启中断,因为用的是查询法。

下面就用程序来说明一下printf的使用方法!

首先设置好一切需要的必须寄存器

关于串口数据的发送和接收(调试必备)

 设置好寄存器后,就可以包含头文件进来STDIO.h,调用函数printf就可以了,下面是效果图

关于串口数据的发送和接收(调试必备)

掌握了这个技巧,就可以随时通过printf的方便性,将程序的寄存值,或者内存变量的值输出出来,人机交互非常方便。今天就暂时写在这里,后面会更新关于数据的接收的程序思路。

————————————-续更2020/2/18

串口数据接收的程序设计

  在学习串口数据的接收之前,首先我们总结一下之前的printf的发送程序。

 1、需要包含STDIO.h库文件

 2、需要配置串口波特率等基本设置,并且只是输出的话就将ES置为0

 3、在使用printf之前一定要将TI置为1

好了,现在来学习串口数据的接收,串口数据的接收一定会需要串口中断,因为串口数据的发送可以根据意愿去调用,可以不用中断,但是串口数据的接收就非常需要串口中断了,因为你不知道什么时候数据发送过来,如果用查询法的话,每次都要去轮训,并且在没有操作系统的时候,轮训带来的时间延迟是接收数据所不能接受的。因此我们必须将ES置为1

我们来看一下串口中断的向量表

关于串口数据的发送和接收(调试必备)

       由此可以看见当ES置为1的时候,即ES开关闭合,则RI和TI(接收完成标志和发送完成标志) 都能够触发串口中断,它们都共用串口中断4.但是根据我们之前的发送程序描述,我们的发送是根据printf查询发送的,是根据查询TI是否为1来查询发送。但是如果ES也开启了,TI为1就会造成串口中断的发生,这样对发送的程序会有所影响,因此需要在串口中断中用程序加以避免。具体方法后面介绍。这样接收所需要的第一个步骤就清楚了,即ES = 1.接下来谈一下后面的思路。在打开串口中断允许后,数据来的时候,就会触发接收串口中断,RI会置为1。数据开始接收,但是由于我们不知道数据到底接收到好久才截止,因此不知道什么时候才可以拿完整的数据来用。这个时候,我们可以采用一种定时的思路,比如当接收开始后,即开启一个200ms或者100ms的定时(如果波特率是9600的话,在1s最多可以接收到960个字节(起始位+数据位+停止位 = 10bit),而100ms可以传输96个字节)

       在定时结束后就可以给一个标志位,表示接收完成,这个时候就可以拿数据用了。不过仔细想想的话,如果数据只有2个字,但是定时为100ms,那么就有大量的时间被延迟,不能保证数据快速就可以使用,并且如果发送端数据间隔短的话,就会导致数据重叠,让数据失效!所以这种方法是用在安全性和响应要求不严的场合,不建议使用。那么我们就另外想一个办法,因为串口中断接收的时候都会触发中断,那么如果在接收到第一个字节进入中断的时候就清除RI并且开启一个时间更小的定时,然后在里面查询RI是否被置为1(因为一个字节接收完成后RI就会置1,注意从这里开始已经用查询法了)如果在这个小的定时器间隔内再次来数据了,就将重置定时,并且处理数据,清除RI位,重复上面的步骤,直到接收到一个字节后,启动定时后,没有数据来了,这个时候就会超时,超时后就可以置位接收完成标志并推出中断!这样就解决了上一个方法,定时时间过长,延迟过长的问题。我画一个简单的图来说明

关于串口数据的发送和接收(调试必备)

我们来总结一下法二 

1、ES = 1开启串口中断

2、第一个字节是以中断形式产生,后面的字节都是在中断中通过查询RI来接收

3、需要在接收每个字节后设置小定时,来判断是否接收结束,如果在小定时时间内RI = 1则继续接收重复上面的步骤,如果超时,则表示接收结束!

接下来是程序设计部分

全局变量
bit RxOK = 0; //接收完成标志
uchar Rx[RX_MAX];


//发送程序printf的调用,还要加限制
ES = 0;//首先清零ES,不要一开始就置位TI,否则进入中断就有问题了!
TI = 1;//然后置位TI,开始发送数据
printf( " Test is OK! " );
ES = 1;//发送完成后,要开启ES,让程序能够通过终端接收数据

void UartHandle()  interrput 4
{
    if( RI )
    {
     //只要是进入RI说明一次数据的接收开始了(注意是一次性全部接收完)
     //首先初始化要用到的变量
     //数组索引i、一个字节之前用到的定时UartCnt,以及超时标志UartCntOK
     uchar i;uint UartCnt = 0;bit UartCntOK = 0;
     //首先进入for循环来接收数据
     for( i = 0; i < R_MAX; i++ ) //R_MAX是接收数组的最大值.
     {  
        //将RI置零,以告诉串口发送端,我即将接收你发来的一个字节!
        RI = 0;
        Rx[i] = SBUF;//将数据接收
        while( !RI ) //当RI为零的时候,表示没有数据发来,在while循环中等待数据发来,并开始计时
        {
            UartCnt++; //在里面等待的时候一直计时
            //如果计时等于3000(注:这里的3000可以灵活更改)
            //计算3000表示的计时时间大致为:3000*( 1(自加程序需要一个周期) + 2(判断程序需要两个周期) )*( 1/11.0592M )
            //大概为:3000*3*1/(11.0592*1000000)秒 ------- 换算为us为813us
            //(这个时间根据波特率更改,如果波特率高,则时间可以减少,如果波特率低,则时间可以增加)
            if( UartCnt == 3000 ) 
            {
                UartCntOK = 1; //如果超时,则置位超时标志,退出while循环
                break;
            }
        }
        if( UartCntOK )
        {
            RxOK= 1;//如果是超时的话,则退出For循环,并置位接收完成标志
            break;
        }
     }
        
    }
    if( TI )
    {
        TI = 0;//尽管在发送数据前,就关闭了中断,但是还是要注意的是在开启中断时有不可预料的情况,所以开始清零一下
    }
}

这里只是提供一种思路,大家知道这样一种过程就可以了,但是我分析之前写这文章的时候的思路,这个是不建议在项目或者比赛中使用的,最多就拿来调试程序那种,因为在使用中,对于波特率而设置时间的把控还是很难的。具体还是看使用的具体情况,具体情况具体分析吧。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/157669.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 跨境电商ERP店群管理系统源码支持二开,企业数据私有化部署

    跨境电商ERP店群管理系统源码支持二开,企业数据私有化部署标签:erp软件亚马逊跨境电商ERP跨境电商ERP,跨境电商erp系统:亚马逊erp,对接亚马逊、wish、ebay、速卖通、shopify、shopee虾皮、lazada等跨境电商平台。跨境电商ERP源码,跨境电商erp系统源码:亚马逊erp源码、wisherp源码、ebayerp源码、速卖通erp源码、shopifyerp源码、shopee虾皮erp源码、lazada来赞达erp源码。对接亚马逊、wish、ebay、速卖通、shopify、shopee虾皮、lazada等跨境电商平台源码,

    2022年9月20日
    3
  • javascript nextSibling属性「建议收藏」

    javascript nextSibling属性「建议收藏」对于nextSibling属性,在W3school中的定义为:nextSibling属性返回指定节点之后紧跟的节点,在相同的树层级中。注意所返回的节点必须是与上一个节点是同级关系,且彼此之间不能有空格,否则将会返回:undefinedTitl</p> </div> <div class="item-meta"> <div class="item-meta-li author"> <a data-user="1" target="_blank" href="https://javaforall.net/user-2/1" class="avatar j-user-card"> <img alt='全栈程序员-站长的头像' src='https://javaforall.net/wp-content/uploads/2025/04/2025042212521933-300x300.jpg' class='avatar avatar-60 photo' height='60' width='60' /> <span>全栈程序员-站长</span> </a> </div> <span class="item-meta-li date">2022年7月13日</span> <div class="item-meta-right"> <span class="item-meta-li views" title="阅读数"><i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-eye"></use></svg></i>344</span> </div> </div> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="https://javaforall.net/129163.html" title="push master was rejected by remote(airpush)" target="_blank" rel="bookmark"> <img class="j-lazy" src="https://javaforall.net/wp-content/uploads/2020/11/2020110817443450-480x300.jpg" data-original="https://javaforall.net/wp-content/uploads/2020/11/2020110817443450-480x300.jpg" width="480" height="300" alt="push master was rejected by remote(airpush)"> </a> </div> <div class="item-content"> <h3 class="item-title"> <a href="https://javaforall.net/129163.html" target="_blank" rel="bookmark"> push master was rejected by remote(airpush) </a> </h3> <div class="item-excerpt"> <p>idea中,发布项目到OSChina的Git中,当时按照这样的流程添加Git,然后push,提示:pushtoorigin/masterwarrejected”。大概原因是:初始化项目时,远程仓库我建了README.md文件,而本地仓库与远程仓库尚未进行文件关联,因此需要将两个仓库的文件进行关联后提交。解决方案如下:1.切换到自己项目所在的目录,右键选择GITB…</p> </div> <div class="item-meta"> <div class="item-meta-li author"> <a data-user="1" target="_blank" href="https://javaforall.net/user-2/1" class="avatar j-user-card"> <img alt='全栈程序员-站长的头像' src='https://javaforall.net/wp-content/uploads/2025/04/2025042212521933-300x300.jpg' class='avatar avatar-60 photo' height='60' width='60' /> <span>全栈程序员-站长</span> </a> </div> <span class="item-meta-li date">2022年4月13日</span> <div class="item-meta-right"> <span class="item-meta-li views" title="阅读数"><i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-eye"></use></svg></i>209</span> </div> </div> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="https://javaforall.net/180961.html" title="SQL语句嵌套最好用quotedstr函数替换" target="_blank" rel="bookmark"> <img class="j-lazy" src="https://javaforall.net/wp-content/uploads/2020/11/2020110817443450-480x300.jpg" data-original="https://javaforall.net/wp-content/uploads/2020/11/2020110817443450-480x300.jpg" width="480" height="300" alt="SQL语句嵌套最好用quotedstr函数替换"> </a> </div> <div class="item-content"> <h3 class="item-title"> <a href="https://javaforall.net/180961.html" target="_blank" rel="bookmark"> SQL语句嵌套最好用quotedstr函数替换 </a> </h3> <div class="item-excerpt"> <p>SQL语句嵌套最好用quotedstr函数替换<br />dmcc.delete_rm_zjfhsj.add(‘select数量fromrm_zjfhsjwhere类型=’CTO”);dmcc.delete_rm_zjfhsj.SQL.add(‘select数量fromrm_zjfhsjwhere类型=’+quotedstr(‘CTO’));凡是内引号对,最好用quotedstr函数替换</p> </div> <div class="item-meta"> <div class="item-meta-li author"> <a data-user="1" target="_blank" href="https://javaforall.net/user-2/1" class="avatar j-user-card"> <img alt='全栈程序员-站长的头像' src='https://javaforall.net/wp-content/uploads/2025/04/2025042212521933-300x300.jpg' class='avatar avatar-60 photo' height='60' width='60' /> <span>全栈程序员-站长</span> </a> </div> <span class="item-meta-li date">2022年10月17日</span> <div class="item-meta-right"> <span class="item-meta-li views" title="阅读数"><i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-eye"></use></svg></i>4</span> </div> </div> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="https://javaforall.net/162732.html" title="targetSdk27 FileProvider 摄像和照相[通俗易懂]" target="_blank" rel="bookmark"> <img class="j-lazy" src="https://javaforall.net/wp-content/uploads/2020/11/2020110817443450-480x300.jpg" data-original="https://javaforall.net/wp-content/uploads/2020/11/2020110817443450-480x300.jpg" width="480" height="300" alt="targetSdk27 FileProvider 摄像和照相[通俗易懂]"> </a> </div> <div class="item-content"> <h3 class="item-title"> <a href="https://javaforall.net/162732.html" target="_blank" rel="bookmark"> targetSdk27 FileProvider 摄像和照相[通俗易懂] </a> </h3> <div class="item-excerpt"> <p>targetSdk27 FileProvider 摄像和照相[通俗易懂]推荐Github开源项目SelectImgAsWechath:https://github.com/SCCXYS/SelectImgAsWechat参考地址:AndroidFileProvider详细解析和踩坑指南开始以下,调用相机的代码出自开源项目SelectImgAsWechath。权限<!–拍照–><uses-permissionandroid:name=”android.permission.CAMERA”/><!</p> </div> <div class="item-meta"> <div class="item-meta-li author"> <a data-user="1" target="_blank" href="https://javaforall.net/user-2/1" class="avatar j-user-card"> <img alt='全栈程序员-站长的头像' src='https://javaforall.net/wp-content/uploads/2025/04/2025042212521933-300x300.jpg' class='avatar avatar-60 photo' height='60' width='60' /> <span>全栈程序员-站长</span> </a> </div> <span class="item-meta-li date">2022年7月21日</span> <div class="item-meta-right"> <span class="item-meta-li views" title="阅读数"><i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-eye"></use></svg></i>16</span> </div> </div> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="https://javaforall.net/122664.html" title="pycharm最新激活码(注册激活)「建议收藏」" target="_blank" rel="bookmark"> <img class="j-lazy" src="https://javaforall.net/wp-content/uploads/2020/11/2020110817443450-480x300.jpg" data-original="https://javaforall.net/wp-content/uploads/2020/11/2020110817443450-480x300.jpg" width="480" height="300" alt="pycharm最新激活码(注册激活)「建议收藏」"> </a> <a class="item-category" href="https://javaforall.net/category/%e5%bc%80%e5%8f%91%e5%b7%a5%e5%85%b7/idea" target="_blank">idea</a> </div> <div class="item-content"> <h3 class="item-title"> <a href="https://javaforall.net/122664.html" target="_blank" rel="bookmark"> pycharm最新激活码(注册激活)「建议收藏」 </a> </h3> <div class="item-excerpt"> <p>(pycharm最新激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~S…</p> </div> <div class="item-meta"> <div class="item-meta-li author"> <a data-user="1" target="_blank" href="https://javaforall.net/user-2/1" class="avatar j-user-card"> <img alt='全栈程序员-站长的头像' src='https://javaforall.net/wp-content/uploads/2025/04/2025042212521933-300x300.jpg' class='avatar avatar-60 photo' height='60' width='60' /> <span>全栈程序员-站长</span> </a> </div> <span class="item-meta-li date">2022年3月26日</span> <div class="item-meta-right"> <span class="item-meta-li views" title="阅读数"><i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-eye"></use></svg></i>135</span> </div> </div> </div> </li> </ul> </div> <div id="comments" class="entry-comments"> <div id="respond" class="comment-respond"> <h3 id="reply-title" class="comment-reply-title">发表回复</h3><form action="https://javaforall.net/wp-comments-post.php" method="post" id="commentform" class="comment-form"><p class="comment-notes"><span id="email-notes">您的邮箱地址不会被公开。</span> <span class="required-field-message">必填项已用 <span class="required">*</span> 标注</span></p><div class="comment-form-comment"><textarea autocomplete="new-password" id="j265fd99e5" name="j265fd99e5" class="required" rows="4" placeholder="写下你的评论…"></textarea><textarea id="comment" aria-label="hp-comment" aria-hidden="true" name="comment" autocomplete="new-password" style="padding:0 !important;clip:rect(1px, 1px, 1px, 1px) !important;position:absolute !important;white-space:nowrap !important;height:1px !important;width:1px !important;overflow:hidden !important;" tabindex="-1"></textarea><script data-noptimize>document.getElementById("comment").setAttribute( "id", "a5614a3e7503ccca2db83fa0760249d5" );document.getElementById("j265fd99e5").setAttribute( "id", "comment" );</script><div class="comment-form-smile j-smilies" data-target="#comment"><i class="wpcom-icon wi smile-icon"><svg aria-hidden="true"><use xlink:href="#wi-emotion"></use></svg></i></div></div><div class="comment-form-author"><label for="author">昵称:</label><input id="author" name="author" type="text" value="" size="30"></div> <div class="comment-form-email"><label for="email">邮箱:</label><input id="email" name="email" type="text" value=""></div> <div class="comment-form-url"><label for="url">网址:</label><input id="url" name="url" type="text" value="" size="30"></div> <label class="comment-form-cookies-consent"><input id="wp-comment-cookies-consent" name="wp-comment-cookies-consent" type="checkbox" value="yes"> 记住昵称、邮箱和网址,下次评论免输入</label> <div class="form-submit"><button name="submit" type="submit" id="submit" class="wpcom-btn btn-primary btn-xs submit">提交</button> <input type='hidden' name='comment_post_ID' value='157669' id='comment_post_ID' /> <input type='hidden' name='comment_parent' id='comment_parent' value='0' /> </div></form> </div><!-- #respond --> </div><!-- .comments-area --> </article> </main> <aside class="sidebar"> <div class="widget widget_profile"><div class="profile-cover"><img class="j-lazy" src="https://javaforall.net/wp-content/uploads/2020/11/2020110817443450.jpg" data-original="//javaforall.net/wp-content/uploads/2025/04/anthony-delanoix-urUdKCxsTUI-unsplash-1.webp" alt="全栈程序员-站长"></div> <div class="avatar-wrap"> <a target="_blank" href="https://javaforall.net/user-2/1" class="avatar-link"><img alt='全栈程序员-站长的头像' src='https://javaforall.net/wp-content/uploads/2025/04/2025042212521933-300x300.jpg' class='avatar avatar-120 photo' height='120' width='120' /></a></div> <div class="profile-info"> <a target="_blank" href="https://javaforall.net/user-2/1" class="profile-name"><span class="author-name">全栈程序员-站长</span></a> <p class="author-description">本网站汇聚当前互联网主流语音,持续更新,欢迎关注公众号“全栈程序员社区”</p> <div class="profile-stats"> <div class="profile-stats-inner"> <div class="user-stats-item"> <b>95.5K</b> <span>文章</span> </div> <div class="user-stats-item"> <b>2</b> <span>粉丝</span> </div> </div> </div> <button type="button" class="wpcom-btn btn-xs btn-follow j-follow btn-primary" data-user="1"><i class="wpcom-icon wi"><svg aria-hidden="true"><use xlink:href="#wi-add"></use></svg></i>关注</button> </div> <div class="profile-posts"> <h3 class="widget-title"><span>最近文章</span></h3> <ul> <li><a href="https://javaforall.net/192368.html" title="缺陷报告-模板_质量缺陷报告">缺陷报告-模板_质量缺陷报告</a></li> <li><a href="https://javaforall.net/192369.html" title="Ubuntu如何安装vscode_ubuntu20.0.4 vscode配置c++环境">Ubuntu如何安装vscode_ubuntu20.0.4 vscode配置c++环境</a></li> <li><a href="https://javaforall.net/192370.html" title="C++之vector 初始化指定大小容量[通俗易懂]">C++之vector 初始化指定大小容量[通俗易懂]</a></li> <li><a href="https://javaforall.net/192371.html" title="linux命令行修改用户名_linux 更改用户密码">linux命令行修改用户名_linux 更改用户密码</a></li> <li><a href="https://javaforall.net/192372.html" title="CountDownTimer_final countdown">CountDownTimer_final countdown</a></li> <li><a href="https://javaforall.net/192373.html" title="mysql 练习题及答案 50道">mysql 练习题及答案 50道</a></li> <li><a href="https://javaforall.net/192374.html" title="京东云服务器_docker 京东自动签到">京东云服务器_docker 京东自动签到</a></li> <li><a href="https://javaforall.net/192375.html" title="U盘中毒了?教你如何删除System Volume Information这个顽固文件夹「建议收藏」">U盘中毒了?教你如何删除System Volume Information这个顽固文件夹「建议收藏」</a></li> <li><a href="https://javaforall.net/231391.html" title="Web Services 教程">Web Services 教程</a></li> <li><a href="https://javaforall.net/192376.html" title="从0到1搭建一款数据平台产品_全国大数据采集软件免费">从0到1搭建一款数据平台产品_全国大数据采集软件免费</a></li> </ul> </div> </div><div class="widget widget_post_thumb"><h3 class="widget-title"><span>最新发布</span></h3> <ul> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="https://javaforall.net/192442.html" title="idea如何配置数据库连接_idea配置数据库驱动"> <img class="j-lazy" src="https://javaforall.net/wp-content/uploads/2020/11/2020110817443450-480x300.jpg" data-original="https://javaforall.net/wp-content/uploads/2020/11/2020110817443450-480x300.jpg" width="480" height="300" alt="idea如何配置数据库连接_idea配置数据库驱动"> </a> </div> <div class="item-content"> <p class="item-title"><a href="https://javaforall.net/192442.html" title="idea如何配置数据库连接_idea配置数据库驱动">idea如何配置数据库连接_idea配置数据库驱动</a></p> <p class="item-date">2025年12月15日</p> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="https://javaforall.net/192457.html" title="idea配置Tomcat_tomcat docbase"> <img class="j-lazy" src="https://javaforall.net/wp-content/uploads/2020/11/2020110817443450-480x300.jpg" data-original="https://javaforall.net/wp-content/uploads/2020/11/2020110817443450-480x300.jpg" width="480" height="300" alt="idea配置Tomcat_tomcat docbase"> </a> </div> <div class="item-content"> <p class="item-title"><a href="https://javaforall.net/192457.html" title="idea配置Tomcat_tomcat docbase">idea配置Tomcat_tomcat docbase</a></p> <p class="item-date">2025年12月14日</p> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="https://javaforall.net/192733.html" title="idea创建一个javaweb项目"> <img class="j-lazy" src="https://javaforall.net/wp-content/uploads/2020/11/2020110817443450-480x300.jpg" data-original="https://javaforall.net/wp-content/uploads/2020/11/2020110817443450-480x300.jpg" width="480" height="300" alt="idea创建一个javaweb项目"> </a> </div> <div class="item-content"> <p class="item-title"><a href="https://javaforall.net/192733.html" title="idea创建一个javaweb项目">idea创建一个javaweb项目</a></p> <p class="item-date">2025年12月9日</p> </div> </li> <li class="item"> <div class="item-img"> <a class="item-img-inner" href="https://javaforall.net/192761.html" title="idea社区版免费吗_intellij idea community edition"> <img class="j-lazy" src="https://javaforall.net/wp-content/uploads/2020/11/2020110817443450-480x300.jpg" data-original="https://javaforall.net/wp-content/uploads/2020/11/2020110817443450-480x300.jpg" width="480" height="300" alt="idea社区版免费吗_intellij idea community edition"> </a> </div> <div class="item-content"> <p class="item-title"><a href="https://javaforall.net/192761.html" title="idea社区版免费吗_intellij idea community edition">idea社区版免费吗_intellij idea community edition</a></p> <p class="item-date">2025年12月8日</p> </div> </li> </ul> </div> </aside> </div> </div> <footer class="footer"> <div class="container"> <div class="footer-col-wrap footer-with-logo-icon"> <div class="footer-col footer-col-logo"> <img src="http://javaforall.net/wp-content/uploads/2020/10/4545-头像.jpg" alt="全栈程序员必看"> </div> <div class="footer-col footer-col-copy"> <ul class="footer-nav hidden-xs"><li id="menu-item-152" class="menu-item menu-item-152"><a href="https://javaforall.net/contact">联系我们</a></li> </ul> <div class="copyright"> <p>Copyright ©2018-2025 版权所有 <a href="http://beian.miit.gov.cn" target="_blank" rel="nofollow noopener noreferrer">晋ICP备19011774号</a> Powered by 全栈程序员必看 <a href="/sitemap.xml" target="_blank" rel="noopener">网站地图</a></p> </div> </div> <div class="footer-col footer-col-sns"> <div class="footer-sns"> <a class="sns-wx" href="javascript:;" aria-label="icon"> <i class="wpcom-icon fa fa-wechat sns-icon"></i> <span style="background-image:url('//javaforall.net/wp-content/uploads/2020/11/2020110814274114.jpg');"></span> </a> </div> </div> </div> </div> </footer> <div class="action action-style-0 action-color-1 action-pos-0" style="bottom:15%;"> <div class="action-item"> <i class="wpcom-icon fa fa-wechat action-item-icon"></i> <div class="action-item-inner action-item-type-1"> <img class="action-item-img" src="http://javaforall.net/wp-content/uploads/2020/11/2020110814274114.jpg" alt="关注全栈程序员社区公众号"> </div> </div> <div class="action-item gotop j-top"> <i class="wpcom-icon wi action-item-icon"><svg aria-hidden="true"><use xlink:href="#wi-arrow-up-2"></use></svg></i> </div> </div> <script type="speculationrules"> {"prefetch":[{"source":"document","where":{"and":[{"href_matches":"\/*"},{"not":{"href_matches":["\/wp-*.php","\/wp-admin\/*","\/wp-content\/uploads\/*","\/wp-content\/*","\/wp-content\/plugins\/*","\/wp-content\/themes\/justnews\/*","\/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]} </script> <script type="text/javascript" id="main-js-extra"> /* <![CDATA[ */ var _wpcom_js = {"webp":"","ajaxurl":"https:\/\/javaforall.net\/wp-admin\/admin-ajax.php","theme_url":"https:\/\/javaforall.net\/wp-content\/themes\/justnews","slide_speed":"5000","is_admin":"0","lang":"zh_CN","js_lang":{"share_to":"\u5206\u4eab\u5230:","copy_done":"\u590d\u5236\u6210\u529f\uff01","copy_fail":"\u6d4f\u89c8\u5668\u6682\u4e0d\u652f\u6301\u62f7\u8d1d\u529f\u80fd","confirm":"\u786e\u5b9a","qrcode":"\u4e8c\u7ef4\u7801","page_loaded":"\u5df2\u7ecf\u5230\u5e95\u4e86","no_content":"\u6682\u65e0\u5185\u5bb9","load_failed":"\u52a0\u8f7d\u5931\u8d25\uff0c\u8bf7\u7a0d\u540e\u518d\u8bd5\uff01","expand_more":"\u9605\u8bfb\u5269\u4f59 %s"},"lightbox":"1","post_id":"157669","user_card_height":"356","poster":{"notice":"\u8bf7\u300c\u70b9\u51fb\u4e0b\u8f7d\u300d\u6216\u300c\u957f\u6309\u4fdd\u5b58\u56fe\u7247\u300d\u540e\u5206\u4eab\u7ed9\u66f4\u591a\u597d\u53cb","generating":"\u6b63\u5728\u751f\u6210\u6d77\u62a5\u56fe\u7247...","failed":"\u6d77\u62a5\u56fe\u7247\u751f\u6210\u5931\u8d25"},"video_height":"482","fixed_sidebar":"1","dark_style":"0","font_url":"\/\/fonts.proxy.ustclug.org\/css2?family=Noto+Sans+SC:wght@400;500&display=swap","follow_btn":"<i class=\"wpcom-icon wi\"><svg aria-hidden=\"true\"><use xlink:href=\"#wi-add\"><\/use><\/svg><\/i>\u5173\u6ce8","followed_btn":"\u5df2\u5173\u6ce8","user_card":"1"}; /* ]]> */ </script> <script type="text/javascript" src="https://javaforall.net/wp-content/themes/justnews/js/main.js?ver=6.20.0" id="main-js"></script> <script type="text/javascript" src="https://javaforall.net/wp-content/themes/justnews/themer/assets/js/icons-2.8.9.js?ver=2.8.9" id="wpcom-icons-js"></script> <script type="text/javascript" id="wp-postviews-cache-js-extra"> /* <![CDATA[ */ var viewsCacheL10n = {"admin_ajax_url":"https:\/\/javaforall.net\/wp-admin\/admin-ajax.php","nonce":"a38b215da6","post_id":"157669"}; /* ]]> */ </script> <script type="text/javascript" src="https://javaforall.net/wp-content/plugins/wp-postviews/postviews-cache.js?ver=1.77" id="wp-postviews-cache-js"></script> <script type="text/javascript" id="wpcom-member-js-extra"> /* <![CDATA[ */ var _wpmx_js = {"ajaxurl":"https:\/\/javaforall.net\/wp-admin\/admin-ajax.php","plugin_url":"https:\/\/javaforall.net\/wp-content\/plugins\/wpcom-member\/","post_id":"157669","js_lang":{"login_desc":"\u60a8\u8fd8\u672a\u767b\u5f55\uff0c\u8bf7\u767b\u5f55\u540e\u518d\u8fdb\u884c\u76f8\u5173\u64cd\u4f5c\uff01","login_title":"\u8bf7\u767b\u5f55","login_btn":"\u767b\u5f55","reg_btn":"\u6ce8\u518c"},"login_url":"https:\/\/javaforall.net\/login?modal-type=login","register_url":"https:\/\/javaforall.net\/register?modal-type=register","errors":{"require":"\u4e0d\u80fd\u4e3a\u7a7a","email":"\u8bf7\u8f93\u5165\u6b63\u786e\u7684\u7535\u5b50\u90ae\u7bb1","pls_enter":"\u8bf7\u8f93\u5165","password":"\u5bc6\u7801\u5fc5\u987b\u4e3a6~32\u4e2a\u5b57\u7b26","passcheck":"\u4e24\u6b21\u5bc6\u7801\u8f93\u5165\u4e0d\u4e00\u81f4","phone":"\u8bf7\u8f93\u5165\u6b63\u786e\u7684\u624b\u673a\u53f7\u7801","terms":"\u8bf7\u9605\u8bfb\u5e76\u540c\u610f\u6761\u6b3e","sms_code":"\u9a8c\u8bc1\u7801\u9519\u8bef","captcha_verify":"\u8bf7\u70b9\u51fb\u6309\u94ae\u8fdb\u884c\u9a8c\u8bc1","captcha_fail":"\u4eba\u673a\u9a8c\u8bc1\u5931\u8d25\uff0c\u8bf7\u91cd\u8bd5","nonce":"\u968f\u673a\u6570\u6821\u9a8c\u5931\u8d25","req_error":"\u8bf7\u6c42\u5931\u8d25"}}; /* ]]> */ </script> <script type="text/javascript" src="https://javaforall.net/wp-content/plugins/wpcom-member/js/index.js?ver=1.7.10" id="wpcom-member-js"></script> <script type="text/javascript" id="QAPress-js-js-extra"> /* <![CDATA[ */ var QAPress_js = {"ajaxurl":"https:\/\/javaforall.net\/wp-admin\/admin-ajax.php","ajaxloading":"https:\/\/javaforall.net\/wp-content\/plugins\/qapress\/images\/loading.gif","max_upload_size":"2097152","compress_img_size":"0","lang":{"delete":"\u5220\u9664","nocomment":"\u6682\u65e0\u56de\u590d","nocomment2":"\u6682\u65e0\u8bc4\u8bba","addcomment":"\u6211\u6765\u56de\u590d","submit":"\u53d1\u5e03","loading":"\u6b63\u5728\u52a0\u8f7d...","error1":"\u53c2\u6570\u9519\u8bef\uff0c\u8bf7\u91cd\u8bd5","error2":"\u8bf7\u6c42\u5931\u8d25\uff0c\u8bf7\u7a0d\u540e\u518d\u8bd5\uff01","confirm":"\u5220\u9664\u64cd\u4f5c\u65e0\u6cd5\u6062\u590d\uff0c\u5e76\u5c06\u540c\u65f6\u5220\u9664\u5f53\u524d\u56de\u590d\u7684\u8bc4\u8bba\u4fe1\u606f\uff0c\u60a8\u786e\u5b9a\u8981\u5220\u9664\u5417\uff1f","confirm2":"\u5220\u9664\u64cd\u4f5c\u65e0\u6cd5\u6062\u590d\uff0c\u60a8\u786e\u5b9a\u8981\u5220\u9664\u5417\uff1f","confirm3":"\u5220\u9664\u64cd\u4f5c\u65e0\u6cd5\u6062\u590d\uff0c\u5e76\u5c06\u540c\u65f6\u5220\u9664\u5f53\u524d\u95ee\u9898\u7684\u56de\u590d\u8bc4\u8bba\u4fe1\u606f\uff0c\u60a8\u786e\u5b9a\u8981\u5220\u9664\u5417\uff1f","deleting":"\u6b63\u5728\u5220\u9664...","success":"\u64cd\u4f5c\u6210\u529f\uff01","denied":"\u65e0\u64cd\u4f5c\u6743\u9650\uff01","error3":"\u64cd\u4f5c\u5f02\u5e38\uff0c\u8bf7\u7a0d\u540e\u518d\u8bd5\uff01","empty":"\u5185\u5bb9\u4e0d\u80fd\u4e3a\u7a7a","submitting":"\u6b63\u5728\u63d0\u4ea4...","success2":"\u63d0\u4ea4\u6210\u529f\uff01","ncomment":"0\u6761\u8bc4\u8bba","login":"\u62b1\u6b49\uff0c\u60a8\u9700\u8981\u767b\u5f55\u624d\u80fd\u8fdb\u884c\u56de\u590d","error4":"\u63d0\u4ea4\u5931\u8d25\uff0c\u8bf7\u7a0d\u540e\u518d\u8bd5\uff01","need_title":"\u8bf7\u8f93\u5165\u6807\u9898","need_cat":"\u8bf7\u9009\u62e9\u5206\u7c7b","need_content":"\u8bf7\u8f93\u5165\u5185\u5bb9","success3":"\u66f4\u65b0\u6210\u529f\uff01","success4":"\u53d1\u5e03\u6210\u529f\uff01","need_all":"\u6807\u9898\u3001\u5206\u7c7b\u548c\u5185\u5bb9\u4e0d\u80fd\u4e3a\u7a7a","length":"\u5185\u5bb9\u957f\u5ea6\u4e0d\u80fd\u5c11\u4e8e10\u4e2a\u5b57\u7b26","load_done":"\u56de\u590d\u5df2\u7ecf\u5168\u90e8\u52a0\u8f7d","load_fail":"\u52a0\u8f7d\u5931\u8d25\uff0c\u8bf7\u7a0d\u540e\u518d\u8bd5\uff01","load_more":"\u70b9\u51fb\u52a0\u8f7d\u66f4\u591a","approve":"\u786e\u5b9a\u8981\u5c06\u5f53\u524d\u95ee\u9898\u8bbe\u7f6e\u4e3a\u5ba1\u6838\u901a\u8fc7\u5417\uff1f","end":"\u5df2\u7ecf\u5230\u5e95\u4e86","upload_fail":"\u56fe\u7247\u4e0a\u4f20\u51fa\u9519\uff0c\u8bf7\u7a0d\u540e\u518d\u8bd5\uff01","file_types":"\u4ec5\u652f\u6301\u4e0a\u4f20jpg\u3001png\u3001gif\u683c\u5f0f\u7684\u56fe\u7247\u6587\u4ef6","file_size":"\u56fe\u7247\u5927\u5c0f\u4e0d\u80fd\u8d85\u8fc72M","uploading":"\u6b63\u5728\u4e0a\u4f20...","upload":"\u63d2\u5165\u56fe\u7247"}}; /* ]]> */ </script> <script type="text/javascript" src="https://javaforall.net/wp-content/plugins/qapress/js/qa.js?ver=4.10.2" id="QAPress-js-js"></script> <script type="text/javascript" src="https://javaforall.net/wp-content/themes/justnews/js/wp-embed.js?ver=6.20.0" id="wp-embed-js"></script> <script type="text/javascript" src="https://javaforall.net/wp-content/plugins/baidu-submit/assets/baidu_push.js" id="wb-baidu-push-js"></script> <script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?2f4d2b9bcf94270f8bf99ccde97cb4b9"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script> <script type="application/ld+json"> { "@context": "https://schema.org", "@type": "Article", "@id": "https://javaforall.net/157669.html", "url": "https://javaforall.net/157669.html", "headline": "关于串口数据的发送和接收(调试必备)", "image": ["http://qn.javajgs.com/20220711/d11ba4cd-914b-4d52-b997-b67f7a45a24420220711e8dee49c-7117-4236-9f1e-9a3497f55ae51.jpg","http://qn.javajgs.com/20220711/393c326e-52cf-442a-ad2c-81e656603d522022071194c6072f-c2ae-4414-9f80-bfa5f25eedb21.jpg","http://qn.javajgs.com/20220711/367d9485-7a43-4306-ba74-669c175188a620220711032ae9fa-b559-4e6f-8479-f38fe65099221.jpg"], "description": "关于串口数据的发送和接收(调试必备)前言对于串口的数据发送和接收,大多是都是利用串口中断来进行的,但是这样对于编程方面有一定要求,并且程序也不太好写,比如说,如果让你随意接收一段数据,然后利用串口将它发送出来,第一个需要考虑的问题就是接收数据的长度,怎么才知道一段数据是否结束?或者说如果串口助手上面没有可以在数据末尾加…", "datePublished": "2022-07-11T22:46:00+08:00", "dateModified": "2022-07-11T22:46:00+08:00", "author": {"@type":"Person","name":"全栈程序员-站长","url":"https://javaforall.net/user-2/1","image":"//javaforall.net/wp-content/uploads/2025/04/2025042212371781.jpeg"} } </script> </body> </html>