1.前言

    Ardunio与计算机通信最常用的方式就是串口通信。在Arduino控制器上,串口都是位于Rx和Tx两个引脚,Arduino的USB口通过一个转换芯片与这两个串口引脚连接。该转换芯片会通过USB接口在计算机上虚拟出一个用于Arduino通信的串口。当你使用串口功能的时候,就意味着你不能引用串口引脚作为输入或者输出。
    要想使串口与计算机通信,首先需要先启用串口功能,初始化Arduino的串口通信功能,也就是:

  • Serial.begin(speed)

    其中参数speed指串口通信波特率,用于设定串口通信速率的参数。串口通信双方必须使用相同的波特率才可以正确通信。
    波特率是一个衡量通信速度的参数,表示每秒传送的bit的个数。如9600波特表示每秒发送9600bit的数据,常用以下波特率:300,600,1200,2400,4800,9600,14400,19200,28800,38400,57600,115200。波特率高表示串口通信速率越快。
    你可以使用Arduino IDE内置的串口监视器与Arduino板子通信。点击工具栏上的串口监视器按钮(注意设置相同波特率),我们接下来的实验就是用到它。
    Arduino Mega上有三个额外的串口:Serial1,Serial2,Serial3。若有使用这三对引脚与您的个人电脑通信,你需要一个额外的USB转串口适配器;若要用它们来与外部的TTL串口设备进行通信,将Tx引脚连接到设备Rx引脚,将Rx引脚连接到设备的Tx引脚,将GND连接到设备的GND。

2.常用串口函数

    接下来介绍一下串口常用函数。

2.1 begin —— 启用串口

  • 打开串口,设置波特率。
  • 对于Arduino Mega:Serial1.begin(speed) Serial2.begin(speed) Serial3.begin(speed)

2.2 end —— 停用串口

  • 停用串口通信,使Rx和Tx引脚用于一般输入输出;
  • 要重新使用串口通信,需要Serial.begin()语句;
  • 对于Mega:Serial1.end() Serial2.end() Serial3.end();

2.3 print、println、printF —— 打印输出数据

  • 打印输出数据 Serial.println 函数会在输出完指定数据后,再输出一组回车换行符。

2.4 read —— 读取传入的串口的数据

  • 读取传入的串口的数据,每次都会返回1字节的数据。
  • 在使用串口时,Arduino会在SRAM中开辟一段大小为64B的空间,串口接收到的数据都会被暂时存放在该空间中,称这个存储空间为缓冲区。
  • 当调用read()函数时,就会从缓冲区中取出1B的数据。

2.5 available —— 当前缓冲区中接收到的数据字节数

  • 当前缓冲区中接收到的数据字节数。通常我们都要判断缓存区中是否有数据,然后才调用read方法。

3.实验

那么,问题来了,串口到底有什么用?根据我自己的经验:

  • 对于习惯于希望可以看到调试过程的我来说,我喜欢用串口打印调试信息,那么可能就有人问,一般情况下只有在需要调试的时候才显示调试结果,那么正式环境我又不想有调试信息,应该怎么办?其实,可以像下面这样:
#define BTSerial Serial1
#define MyDebugSerial Serial

//该条语句用于使能DEBUG输出信息,屏蔽掉就不会输出debug调试信息
#define DEBUG

#ifdef DEBUG
#define DBGLN(message)    MyDebugSerial.println(message)
#else
#define DBGLN(message)
#endif

当不需要调试信息时就注释掉 #define DEBUG。

  • 串口当然可以用来和符合串口通信协议的模块进行通信,比如 蓝牙模块HC06 Wifi模块ESP系列等等。这就意味着我们可以基于硬件串口功能区开发我们所需功能。

3.1 与电脑串口通信,读取数据并原样返回数据

/**
* @Desc  读取数据并原样返回数据
* @author 单片机菜鸟
* @Date  2016/12/10
*/

void setup() {
  // 初始化串口
  Serial.begin(9600);
  //等待串口准备好
  while(!Serial);
}

void loop() {
  //如果缓冲区中有数据,则读取并输出
  if(Serial.available()>0){
    char ch = Serial.read();
    Serial.print(ch);
  }
}

打开Arduino IDE自带的串口监视器进行调试(要设置相同波特率),当进行串口通信时,Arduino控制器上就会看到标有RX TX的2个LED灯闪烁提示,如没有意外,应该显示如下(我自己随便写的):

3.2 串口控制开关灯

/**
* @Desc  串口控制开关灯
* @author 单片机菜鸟
* @Date  2016/12/10
* 注意:LED的一端接到5V,另外一端接到输出引脚,低电平亮
*/

#define LED_START 2
#define LED_END  9

void setup() {
  // 初始化串口
  Serial.begin(9600);
  //等待串口准备好
  while(!Serial);
  led_Init();
}

void loop() {
  //如果缓冲区中有数据,则读取并输出
  if(Serial.available() > 0){
    char ch = Serial.read();
    Serial.print(ch);

    //开灯
    if(ch == 'a'){
      led_On();
    }else if(ch == 'b'){
      led_Off();
    }
  }
}

/**
* @Desc 初始化LED
*/
void led_Init(){
  // 将2-9号引脚设置为输出状态
  for(int i=LED_START;i<=LED_END;i++){
    pinMode(i,OUTPUT);
    digitalWrite(i,HIGH);//灭掉LED
  }
}

/**
* @Desc 打开LED
*/
void led_On(){
  //从引脚2到9引脚,点亮LED
  for(int i=LED_START;i<=LED_END;i++){
    digitalWrite(i,LOW);//LED亮
  }
}

/**
* @Desc 关闭LED
*/
void led_Off(){
  //从引脚2到9引脚,关闭LED
  for(int i=LED_START;i<=LED_END;i++){
    digitalWrite(i,HIGH);//LED灭
  }
}

我的实验结果就是灯根据我的指令亮灭.

4.总结

总体来说,这节课不难,在理解串口基础上运用串口提供的一些函数就能进行基本的串口通信开发。

Arduino学习笔记⑥ 硬件串口通信的更多相关文章

  1. ARM学习笔记15——串口通信基本原理【转】

    计算机串口基本理论 1.什么是串口? 2,什么是RS-232? 3,什么是RS-422? 4,什么是RS-485? 5,什么是握手? 1,什么是串口? 串口是计算机上一种非常通用的设备通信的协议(不要 ...

  2. stm32学习笔记之串口通信

    在基础实验成功的基础上,对串口的调试方法进行实践.硬件代码顺利完成之后,对日后调试需要用到的printf重定义进行调试,固定在自己的库函数中. b) 初始化函数定义: void USART_Confi ...

  3. stm32寄存器版学习笔记02 串口通信

    stm32F103RCT6提供5路串口.串口的使用,只要开启串口时钟,设置相应的I/O口的模式,然后配置下波特率.数据位长度.奇偶校验等信息,即可使用. 1.串口的配置步骤 ①串口时钟使能 APB2外 ...

  4. Arduino学习笔记① 初识Arduino

    1.前言     近段时间,博主陆续更新了ESP8266学习笔记,主要开发平台是Arduino.但是,对于很多无基础的初学者来说,甚至不了解Arduino是什么.因此,博主决定加入一个Arduino学 ...

  5. stm32学习笔记----双串口同时打开时的printf()问题

    stm32学习笔记----双串口同时打开时的printf()问题 最近因为要使用串口2外接PN532芯片实现通信,另一方面,要使用串口1来将一些提示信息输出到上位机,于是重定义了printf(),使其 ...

  6. Arduino和C51之串口通信

    技术:51单片机.Arduino.串口通信   概述 本文主要讲解串口通信技术的使用方法,并通过串口点灯实验介绍了51单片机和Arduino串口的使用,为初学者学习串口知识提供帮助 详细 代码下载:h ...

  7. 基于Arduino和python的串口通信和上位机控制

    引言 经常的时候我们要实现两个代码之间的通信,比如说两个不同不同人写的代码要对接,例如将python指令控制Arduino控件的开关,此处使用串口通信是非常方便的,下面笔者将结合自己踩过的坑来讲述下自 ...

  8. ucos实时操作系统学习笔记——任务间通信(消息)

    ucos另一种任务间通信的机制是消息(mbox),个人感觉是它是queue中只有一个信息的特殊情况,从代码中可以很清楚的看到,因为之前有关于queue的学习笔记,所以一并讲一下mbox.为什么有了qu ...

  9. Arduino学习笔记A6(补充) - 在串口读取多个字符串,并且转换为数字数组

    功能如题目. 在串口收到逗号分割的6串数字比如 100,200,45,4,87,99 然后在6个PWM端口3, 5, 6, 9, 10, 11输出对应PWM值 代码注释很详细了,就不再说明了. ARD ...

随机推荐

  1. C# 缓存的实现

    缓存的实现 我们不是做第三方比如Redis等的缓存实现,而是根据实际情况,基于C#上做一些环境变量的保存,方便项目使用. 1.系统全局变量 很多时候,在系统运行开始,需要对系统的运行参数进行保存,以便 ...

  2. 机器学习常用性能度量中的Accuracy、Precision、Recall、ROC、F score等都是些什么东西?

    一篇文章就搞懂啦,这个必须收藏! 我们以图片分类来举例,当然换成文本.语音等也是一样的. Positive 正样本.比如你要识别一组图片是不是猫,那么你预测某张图片是猫,这张图片就被预测成了正样本. ...

  3. (七十四)c#Winform自定义控件-金字塔图表

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...

  4. JavaScript DOM 编程艺术

    最近把JavaScript DOM 编程艺术这本书看完了,觉得这本书很好 深入浅出地展示了渐进增强.平稳退化.结构和样式分离等编程思想,我对书中重要的知识进行了梳理总结. 一.网页 二.JavaScr ...

  5. tomcat 报错出现 jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class

    这是你导入的jar的问题 一般情况下是导入的包tomcat已经存在 也就是说 不需要你再次导入 所以你现在要做的是删除你所导的包 解决方案:删除你的web项目导入的这两个jar文件 jsp-api.j ...

  6. 数据结构之二叉树篇卷三 -- 二叉树非递归遍历(With Java)

    Nonrecursive Traversal of Binary Tree First I wanna talk about why we should <code>Stack</c ...

  7. Spring MVC-从零开始-第一个控制器(不考虑命名规范)

    1.目录结构 (log4j.properties.mybatis-config.xml可忽略) 2.配置web.xml文件 <?xml version="1.0" encod ...

  8. Linux mint 启动文本模式(不启动图形界面)

    Linux Mint 系统用了很久,很顺手,赞一个! 有一天想同时运行多个虚拟机linux系统做实验,想着只启动文本模式可以省点内存资源,结果试了多种方法都不成功,网上现有针对Ubuntu原版和Cen ...

  9. rt.jar包添加源文件只需要关联到已安装对应jdk目录下source.zip源码文件即可

    项目中配置的JRE System Libriry下的rt.jar包,需要关联源文件时候,只需要点击“Attach Source...“按钮,选择"External File..." ...

  10. 正睿OI国庆day1

    正睿OI国庆day1 T1 \[ S_n=1*S_{n-1}+1*F_{n-1}+1*F_{n-2}+1*f_{n-1}+1*f_{n-2} \] \[ F_{n}=0*S_{n-1}+1*F_{n- ...