📜  Arduino-通讯

📅  最后修改于: 2020-11-05 03:37:19             🧑  作者: Mango


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

并行通讯

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在启动时发送问候。

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的右上角。

在串行监视器的顶部框中键入任何内容,然后按发送或键盘上的Enter键。这将向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.printSerial.println将发回实际的ASCII代码,而Serial.write将发回实际的文本。有关更多信息,请参见ASCII代码。