arduino串口(串口通讯简介)

串口是单片机中一种重要的数据通讯接口,本期我们就来学习一下Arduino的串口基础操作。首先我们来了解一下Arduino开发板的串口资源。在UNO及NANO板上,只有一组串口(Serial0),这个串口通过一个转换芯片(ATmega8、ATmega32、CH340、CP2102等)可以连接到电脑的USB口,也就是我们用来下载程序的接口,在板上引出的引脚中,也可以不通过转换芯片,这个主要用于与其他串口设备(电子模块或其它单片机)通讯。而在mega2560板上,则有4组串口:Serial0- Serial3,其中Serial0连接了转换芯片用于与电脑USB接口连接,其余三组则是直接从芯片引脚引出。

arduino串口(串口通讯简介) 

发送数据

下面来看看第一个例程:串口发送字符串”Hello world!”到电脑。

arduino串口(串口通讯简介) 

在初始化函数中,执行了启动串口的函数,并且设置了串口的波特率为115200(即每秒传输115200个二进制位,注意:进行串口通讯的设备波特率必须一致)。在主循环中,不断地发送字符串”Hello world!”,每发送一次等待1秒。下面是ArduinoIDE串口监视器接收到的内容:

arduino串口(串口通讯简介) 

如果将输出函数改为Serial.println(),则在串口监视器中看到:

arduino串口(串口通讯简介) 

第二个例程,串口输出数字0-9,每个数字之间显示一个空格,每次输出数字9之后则换行,重新输出0-9。

arduino串口(串口通讯简介) 

串口监视器显示内容:

arduino串口(串口通讯简介) 

现在我们来思考一个问题,在上面例程中串口输出引用了变量”i”的值,那么,电脑收到的是”i”的真实值吗?比如当i=8时,电脑收到的是”8″这个值吗?为了验证这个问题,我们将程序改一下,只输出0-2三个值,并且不加空格,不换行,然后换用串口调试助手来观察收到的数据。

arduino串口(串口通讯简介) 

先用ArduinoIDE的串口监视器查看:

arduino串口(串口通讯简介) 

从监视器中看到,按预订的显示了”012″,没有空格及换行,接着,看看串口调试助手”十六进制显示”得到的内容:

arduino串口(串口通讯简介) 

注意上图中”红框”位置,勾选了”十六进制显示”,如果不选这个选项则看到结果与ArduinoIDE串口监视器的一样。从串口调试助手中我们看到,实际收到的是十六进制的”0x30,0x31,0x32″,它们对应的十进制值应为”48,49,50″,并不是其本身的值(十进制”0,1,2″的十六进制值应为:0x00,0x01,0x02),这实际就是”0,1,2″三个字符对应的ASCII码,也就是说Serial.print()及Serial.println()实际是将放入的变量及字符串以ASCII码的形式发送,这是因为在屏幕上显示一个值,如”0″,需要提供的是”0″对应的ASCII码,而如果将”0″的值发过去,显示的将不是零。加下来,我们再改进一下程序,将Serial.print()换成Serial.write(),然后连续发送”0,1,2″的实际值及”0,1,2″对应的ASCII码”0x30,0x31,0x32″,然后看看串口调试助手的显示内容。

arduino串口(串口通讯简介) 

串口调试助手十六进制显示:

arduino串口(串口通讯简介) 

关闭十六进制显示:

arduino串口(串口通讯简介) 

从上面的试验,我们可以看到,Serial.print()、Serial.println()与Serial.write()的区别,前两个是发送的ASCII码,而后面这个才是发送变量的值本身。接下来,我们再改写程序,用Serial.write()实现输出”Hello world!”。

arduino串口(串口通讯简介) 

arduino串口(串口通讯简介) 

以上给出了两个例程,注意Serial.write()的两种用法,下面是串口调试助手在”十六进制显示”关闭和开启两种状态下的显示结果:

arduino串口(串口通讯简介) 

下面附上从”百度百科”下载的ASCII码对照表,以供大家参考:

arduino串口(串口通讯简介) 

通过上面例程的学习,我们应该能够灵活地掌握Serial.print()、Serial.println()与Serial.write()的特点及用法。Serial.println()输出时实际上是在Serial.print()的基础上增加了”0x0d,0x0a”的输出,或者也可以用Serial.print(“rn”)来实现回车换行,另外Serial.println()输出单变量时还可以用ArduinoIDE自带的”串口绘图仪”打印该变量的变化曲线。而Serial.write()常用于串口双机或多机通讯,传递变量实际值用于控制或计算时用,这一点是很重要的,比如某个传感器的实际测量值要通过串口传输,则一般直接传递器实测值,而不是ASCII码,这个将在进阶课程的”串口双机+多机通讯中”中详细讲解。

接收数据

上面我们学习了串口发送,现在来学习一下串口的接收。当串口发送数据时,数据是从TX引脚一位一位地发送出去的,而接收数据时则是从RX引脚一位一位的接收进来,每传输完成一个字节,就会做相应的处理,这个处理是在串口中断中进行,Arduino库的处理方法是在存储空间中分配了一个64字节的串口数据缓存空间(通过修改库文件可以修改缓存区大小),当接收一个字节的数据后,就会把它存放到该存储空间中,下一个到来的字节数据跟在上一个字节的后面,当存储空间”装满”后,则最先收到的字节数据会被”挤出”,即满足”先进先出”的顺序,当我们读取数据时,也是按照这个顺序。

当接收到数据后,我们可以通过函数Serial.available()查看缓存区内的字节数,然后用Serial.read()读取数据,要注意的是这个函数一次只能读取一个字节,当接收到多个字节数据时就要反复调用这个函数读取数据,另外:这个函数在读取一个字节后则该字节的数据便从缓存区中清除。如果只读取,而不清除可以用Serial.peek()。读取数据,我们可以用”主动查询”的方法,也可以使用”触发事件”的方法。主动查询即不管缓存区有没有数据,都在固定的时刻去查看缓存区;而触发事件方式则是当缓存区内有数据时,触发一个”事件”,这个可以粗略地理解为一个中断,然后在一个处理函数中去读取数据,这个处理函数的函数名是固定的即:serialEvent()。这个方法的优点在于我们不用每次都去查看缓存区,这样可以提高程序的效率。下面我们以”触发事件”的方式来做一个试验,当串口接收到到字符”k”时则打开板上13号引脚连接的LED,当收到字符”g”时则关闭该LED,如果收到其他字符则串口输出”Input error code!”。

arduino串口(串口通讯简介) 

将上述代码下载到开发板中,打开ArduinoIDE的串口监视器,在该界面的最上方输入字符k,点击”发送”,则板上由13号引脚控制的LED点亮;然后输入字符g并发送,则LED关闭;如果输入其他字符,则在监视器的接收区显示”Input error code!”。

上述代码在UNO、NANO、MEGA2560中都适用,而在MEGA2560板中,如果要使用其他串口,如串口1,则在基本的函名中”Serial”的后面加上串口编号即可,例如启动串口1:Serial1.begin(115200)(其编号为0-3,0省略不写),而相应的串口事件函数名为:serialEvent1()。

另外,当串口与一些设备通讯,需要特定的数据位、停止位、奇偶校验时,可以参考下表的值进行配置:

arduino串口(串口通讯简介) 

配置的方法如下,例如设置为数据位8,偶校验,两个停止位:

Serial.begin(115200 , SERIAL_8E2);

在默认情况下,即缺省第二个参数时,串口工作于”SERIAL_8N1″的模式下。

关于串口通讯的基础内容就讲到这里。

本文内容由互联网用户自发贡献,该文观点仅代表作者本人。号仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 3252784850@qq.com 举报,一经查实,本站将于三个工作日内删除本文链接:https://www.cawinemall.com/other/8904.html

(0)

相关推荐

  • EXCEL同一列数据同时加减乘除同一个数的实现方法

    在用EXCEL处理数据过程中,有时我们需要对同一列数据进行相同运算,比如同时加、减、乘、除同一个数,如何快速实现这一效果呢?今天小白跟大家分享可以实现这一目的的两种方法: 公式法 在下表的数据中,需将应交数除以10,填入实交列中,用公式法可以快速实现。 步骤:1、单击“实交”列的第一个单元格,输入“=”,然后单击“应交”列的对应单元格,此时该单元格被蚂蚁线环…

    2023年4月13日
    0
  • 龙猫一般多少钱一只(龙猫多少钱一只)

    朋友花大钱买了一只龙猫当宠物,说是很可爱,我兴冲冲的跑去一看,这小家伙明明就是一只大型老鼠,为啥子叫龙猫?和宫崎骏的动画片《龙猫》有什么关系? 宫崎骏的动漫《龙猫》中的“龙猫”本来是日本传说中的生物,谁也没见它长什么样,在该动漫中,宫崎骏塑造的龙猫特别可爱,因此风靡世界,但“龙猫”的叫法,源自香港。 片中龙猫to~to~ro~的声音,因此把它叫做トトロ,英文…

    2023年4月14日
    0
  • inventor教程(Inventor2018安装教程)

    安装步骤: 1.选中Inventor2018压缩包,鼠标右击选择解压到Inventor2018。   请输入图片描述 2.双击打开Inventor2018文件夹。   请输入图片描述 3.双击打开Inventor2018文件夹。   请输入图片描述 4.选中Setup可执行文件,鼠标右击选择以管理员身份运行。   请输…

    2023年4月11日
    0
  • powermill和ug谁更好(powermill和ug谁更好学)

    CNC操作员如何选择编程软件?   答:以前在操机的时候我也遇到这个问题,那时想学编程,不知道选择哪个编程软件,毕竟软件较多,主流软件有UG、Mastercam、Cimatron、Powermill、Hypermill、Worknc等等。 从我个人的经验来说, UG的优点:画图设计、分模功能强大,3轴刀路功能也强大,最关键的是加外挂的拆电极功能极其…

    2023年4月11日
    0
  • excel删除重复值(多列数据删除重复值教程)

    如果是单独的一列数据中去筛选不重复的值,我们只需要通过筛选删除重复值的方式就可以实现,但是在多列、多组组数字编号当中,提取不重复的值,如下面多组数据中提取唯一工号,这样的方法就解决不了。   如果所有的变化都是一列体现,这种情况下,我们使用下面的删除重复值的方式就可以实现。如下图所示。   所以为了解决多列、多组数据中去删除重复值,今天我…

    2023年4月13日
    0
  • 紫薯蒸多久能熟(紫薯蒸多久熟透能吃)

    紫薯富含丰富的花青素,可谓主食中的养颜一霸,平时一年四季都可以吃到,但是要说最为香甜的季节还得是现在的秋季。紫薯大多数都在秋季收获,此时稍微放地上晾上一周,之后拿来蒸着吃味道香甜可口,多吃不腻,用来做紫薯馒头紫薯面包都很不错。不过紫薯虽好,但蒸起来也有讲究,很多新人第一次做都不知道蒸多久能熟,冷水下锅好还是热水,蒸几分钟最好吃,那么下面麟大大就为大家一一解答…

    2023年4月14日
    0
  • AutoCAD2020安装失败显示1603错误和无法激活的解决办法

    今天带来的文章内容是:AutoCAD2020安装失败显示1603错误和无法激活的解决办法   AutoCAD 2020安装失败后,提示1603 错误该如何解决呢?一开始,我这边安装是没有问题的,卸载后再次安装就报错了.如下图   可能是由于之前卸载不干净的原因. 打开下边这个路径 C:ProgramFiles(x86)CommonFile…

    2023年4月11日
    0
  • 徐凤年最后什么境界(徐凤年最后的境界是什么)

    《雪中悍刀行》的境界对于没有看过原著的朋友来说有点复杂,我之前写过两篇关于雪中一品四境的文章。简单地说就是对于江湖武夫的话金刚境、指玄境、天象境、陆地神仙境和天人境是要逐级升级的,而对于三教中人来说的话,佛教的入一品是金刚境,再升级是佛陀;道教的入一品是指玄境,再升级是地仙;儒家的入一品是天象境,再升级是圣人。   但是各境界中又有大小真伪的说法,…

    2023年4月14日
    0
  • 电脑基础知识(电脑基础知识分享)

    当今时代每个家庭都会有一部或者几部电脑,娱乐工作上课必备。特别是疫情阶段用电脑的频次更多一些,学生老师要上网课,单位有的也要在家办公。 常见家庭用电脑无非两种,一种台式机,(台式机常见又分为组装机和品牌机)。 一种笔记本。其实它们的构造差不多,台式机有主板、CPU、内存、硬盘、电源、机箱、显示器、键盘鼠标组成。而笔记本无非集成化程度比较高些,也是由上述各硬件…

    2023年4月11日
    0
  • excel怎么移动一列到前一列(如何在Excel中移动列4种方法)

    通过正确排列电子表格中的列,您可以更轻松地阅读和查找特定数据。这里有一些简单的方法可以做到这一点。   Excel电子表格中列和行的排列是其可读性和便利性的重要因素。有时,您需要通过移动 Excel 电子表格中的列来改进电子表格。 如果一列包含的单元格很少,则手动将一列中的数据输入到另一列可能是首选的解决方案,但此方法在较大的列中会令人痛苦。幸运的…

    2023年4月13日
    0