- Arduino 教程
- Arduino - 首页
- Arduino - 概述
- Arduino - 开发板描述
- Arduino - 安装
- Arduino - 程序结构
- Arduino - 数据类型
- Arduino - 变量与常量
- Arduino - 运算符
- Arduino - 控制语句
- Arduino - 循环
- Arduino - 函数
- Arduino - 字符串
- Arduino - 字符串对象
- Arduino - 时间
- Arduino - 数组
- Arduino 函数库
- Arduino - I/O 函数
- Arduino - 高级 I/O 函数
- Arduino - 字符函数
- Arduino - 数学库
- Arduino - 三角函数
- Arduino 高级应用
- Arduino - Due & Zero
- Arduino - 脉宽调制 (PWM)
- Arduino - 随机数
- Arduino - 中断
- Arduino - 通信
- Arduino - 集成电路 (I2C)
- Arduino - 串行外设接口 (SPI)
- Arduino 项目
- Arduino - 闪烁 LED
- Arduino - 渐变 LED
- Arduino - 读取模拟电压
- Arduino - LED 条形图
- Arduino - 键盘注销
- Arduino - 键盘消息
- Arduino - 鼠标按键控制
- Arduino - 键盘串口
- Arduino 传感器
- Arduino - 湿度传感器
- Arduino - 温度传感器
- Arduino - 水位检测/传感器
- Arduino - PIR 传感器
- Arduino - 超声波传感器
- Arduino - 连接开关
- 电机控制
- Arduino - 直流电机
- Arduino - 伺服电机
- Arduino - 步进电机
- Arduino 和声音
- Arduino - 音调库
- Arduino - 无线通信
- Arduino - 网络通信
- Arduino 有用资源
- Arduino - 快速指南
- Arduino - 有用资源
- Arduino - 讨论
Arduino - 通信
为了实现这种数据交换,已经定义了数百种通信协议。每种协议都可以分为两类之一:并行或串行。
并行通信
通过输入/输出端口进行Arduino和外围设备之间的并行连接是短距离(最多几米)的理想解决方案。但是,在其他情况下,如果需要在两个设备之间建立更长距离的通信,则无法使用并行连接。并行接口同时传输多个位。它们通常需要数据总线——跨越八根、十六根或更多线进行传输。数据以巨大的、冲击性的1和0波的形式传输。
并行通信的优点和缺点
并行通信当然有其优点。它比串行快,简单明了,并且相对易于实现。但是,它需要许多输入/输出 (I/O) 端口和线路。如果您曾经将项目从基本的Arduino Uno迁移到Mega,您就会知道微处理器上的I/O线路可能是宝贵的且数量有限的。因此,我们更喜欢串行通信,牺牲潜在的速度来换取引脚空间。
串行通信模块
如今,大多数Arduino开发板都将几种不同的串行通信系统作为标准设备内置。
使用这些系统中的哪一个取决于以下因素:
- 微控制器必须与多少个设备交换数据?
- 数据交换速度必须有多快?
- 这些设备之间的距离是多少?
- 是否需要同时发送和接收数据?
关于串行通信最重要的事情之一是**协议**,必须严格遵守。它是一套规则,必须应用这些规则,以便设备能够正确解释它们相互交换的数据。幸运的是,Arduino会自动处理这个问题,从而将程序员/用户的工作简化为简单的写入(要发送的数据)和读取(接收到的数据)。
串行通信类型
串行通信可以进一步分类为:
**同步** - 同步的设备使用相同的时钟,并且它们的定时与彼此同步。
**异步** - 异步的设备有自己的时钟,并由前一状态的输出触发。
很容易找出设备是否同步。如果将相同的时钟提供给所有连接的设备,则它们是同步的。如果没有时钟线,则它是异步的。
例如,UART(通用异步收发器)模块是异步的。
异步串行协议具有一些内置规则。这些规则只不过是帮助确保健壮且无错误数据传输的机制。这些机制(我们为了避免外部时钟信号而获得的机制)是:
- 同步位
- 数据位
- 奇偶校验位
- 波特率
同步位
同步位是与每个数据包一起传输的两三个特殊位。它们是起始位和停止位。顾名思义,这些位分别标记数据包的开头和结尾。
始终只有一个起始位,但停止位的数量可配置为一个或两个(尽管通常保留为一个)。
起始位始终由空闲数据线从1变为0指示,而停止位将通过将线路保持为1而转换回空闲状态。
数据位
每个数据包中的数据量可以设置为从5到9位的任何大小。当然,标准数据大小是您的基本8位字节,但其他大小也有其用途。7位数据包可能比8位更有效,特别是如果您只是传输7位ASCII字符。
奇偶校验位
用户可以选择是否应该有奇偶校验位,如果有的,奇偶校验应该是奇数还是偶数。如果数据位中1的个数为偶数,则奇偶校验位为0。奇校验正好相反。
波特率
术语波特率用于表示每秒传输的位数 [bps]。请注意,它指的是位,而不是字节。协议通常要求每个字节都与几个控制位一起传输。这意味着串行数据流中的一个字节可能包含11位。例如,如果波特率为300 bps,则每秒最多可以传输37个字节,最少可以传输27个字节。
Arduino UART
以下代码将使Arduino在启动时发送hello world。
void setup() { Serial.begin(9600); //set up serial library baud rate to 9600 Serial.println("hello world"); //print hello world } void loop() { }
将Arduino程序上传到Arduino后,打开Arduino IDE右上角的串口监视器 。
在串口监视器的顶部框中输入任何内容,然后按键盘上的发送或回车键。这将向Arduino发送一系列字节。
以下代码返回它接收到的任何输入。
以下代码将使Arduino根据提供的输入提供输出。
void setup() { Serial.begin(9600); //set up serial library baud rate to 9600 } void loop() { if(Serial.available()) //if number of bytes (characters) available for reading from { serial port Serial.print("I received:"); //print I received Serial.write(Serial.read()); //send what you read } }
请注意,**Serial.print** 和 **Serial.println** 将返回实际的ASCII代码,而 **Serial.write** 将返回实际的文本。有关更多信息,请参阅ASCII代码。