课程表

Arduino 基础

Arduino 函数库

Arduino 进阶

Arduino 项目

Arduino 传感器

Arduino 电机控制

Arduino 声音

工具箱
速查手册

Arduino 通信

当前位置:免费教程 » 程序设计 » Arduino

已经定义了数百个通信协议来实现这种数据交换。 每个协议可以分为两种类型之一:并行或串行。

并行通信

通过输入/输出端口在Arduino和外设之间进行并行连接是较短距离(最多几米)的理想解决方案。 然而,在其他情况下,当需要在两个设备之间建立较长距离的通信时,不可能使用并行连接。 并行接口同时传输多个位。 它们通常需要数据总线 - 通过八条,十六条或更多的线路进行传输。 数据在巨大的,崩溃的1和0的波传输。

并行通信

 

并行通信的优点和缺点

并行通信肯定有其优势。 它比串行,直接和相对容易实现更快。 然而,它需要许多输入/输出(I / O)端口和线路。 如果你不得不将一个项目从一个基本的Arduino Uno移动到一个Mega,你知道一个微处理器上的I / O线可能是宝贵的,很少。 因此,我们更喜欢串行通信,牺牲针脚空间的潜在速度。

串行通信模块

今天,大多数Arduino板都是用几种不同的串行通信系统作为标准设备。

使用这些系统中的哪一个取决于以下因素:

  • 微控制器有多少个器件与数据交换?
  • 数据交换有多快?
  • 这些设备之间的距离是多少?
  • 是否有必要同时发送和接收数据?

有关串行通信的最重要的事情之一是协议,应该严格遵守。 它是一组规则,必须应用这些规则,使得设备可以正确地解释它们相互交换的数据。 幸运的是,Arduino自动处理这一点,使程序员/用户的工作减少到简单的写(要发送的数据)和读(接收的数据)。

串行通信类型

串行通信可以进一步分类为 -

  • 同步 - 同步的设备使用相同的时钟,它们的时序彼此同步。

  • 异步 - 异步设备具有自己的时钟,并由前一状态的输出触发。

很容易找出设备是否同步。 如果给所有连接的设备提供相同的时钟,则它们是同步的。 如果没有时钟线,它是异步的。

例如,UART(通用异步收发器)模块是异步的。

异步串行协议有一些内置的规则。 这些规则只是帮助确保稳健且无错误的数据传输的机制。 这些机制,我们得到避免外部时钟信号,是 -

  • Synchronization bits 同步位
  • Data bits 数据位
  • Parity bits 奇偶校验位
  • Baud rate 波特率

同步位

同步位是与每个数据包一起传送的两个或三个特殊位。 它们是起始位和停止位。 正确的名称,这些位分别标记数据包的开始和结束。

始终只有一个起始位,但停止位的数量可以配置为一个或两个(尽管通常保持为1)。

起始位始终由从1到0的空闲数据线指示,而停止位将通过将线保持在1处而转换回空闲状态。

 

同步位

 

数据位

每个分组中的数据量可以设置为从5到9位的任何大小。 当然,标准数据大小是你的基本8位字节,但其他大小有它们的用途。 7位数据包可以比8更有效,特别是如果你只是传输7位ASCII字符。

奇偶位

用户可以选择是否应该有奇偶校验位,如果是,则奇偶校验应该是奇数还是偶数。 如果数据位中的1的数目是偶数,则奇偶校验位为0。 奇数的平等恰恰相反。

波特率

术语波特率用于表示每秒传输的位数[bps]。 注意,它是指位,而不是字节。 协议通常要求每个字节与几个控制位一起传输。 这意味着串行数据流中的一个字节可以包括11个比特。 例如,如果波特率为300bps,则每秒可以传输最大37字节和最小27字节。

Arduino UART

以下代码将使Arduino在启动时发送hello world。

  1. void setup() {
  2. Serial.begin(9600); //set up serial library baud rate to 9600
  3. Serial.println("hello world"); //print hello world
  4. }
  5.  
  6. void loop() {
  7.  
  8. }

将Arduino草图上传到Arduino后,在Arduino IDE的右上部分打开串行监视器<img class="“inline" src"="" attachments="" tuploads="" arduino="" search.jpg="">。

在串行监视器的顶部框中键入任何内容,然后按键盘上的发送或输入。 这将发送一系列字节到Arduino。

以下代码返回它作为输入接收的任何内容。

以下代码将使Arduino根据提供的输入提供输出。

  1. void setup() {
  2. Serial.begin(9600); //set up serial library baud rate to 9600
  3. }
  4.  
  5. void loop() {
  6. if(Serial.available()) //if number of bytes (characters) available for reading from {
  7. serial port
  8. Serial.print("I received:"); //print I received
  9. Serial.write(Serial.read()); //send what you read
  10. }
  11. }

请注意, Serial.print 和 Serial.println 将发回实际的ASCII代码,而 Serial.write 将返回实际的文本。 有关详细信息,请参阅ASCII代码。

转载本站内容时,请务必注明来自W3xue,违者必究。
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号