串口通信

Stduino定义了数个通信协议来实现数据交换。通信协议可以分为两类:并行或串行。

并行通信

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

并行通信优缺点

并行通信肯定有其优势。它比串行更快,更直接,相对容易实施。然而,它需要许多的输入/输出(I / O)端口和线路。因此,我们更喜欢串行通信,牺牲针脚空间的潜在速度,而保证同时相互传输信息。

串行通信

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

使用哪个系统取决于以下因素:

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

有关串行通信的最重要的事情之一是协议,应该严格遵守。它是一套规则,必须应用这些规则才能使设备正确地解释它们相互交换的数据。幸运的是,Stduino会自动处理这个问题,这样程序员/用户的工作就可以简化为简单的写(发送的数据)读(接收的数据)

串行通信类型

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

  • 同步 - 同步的设备使用相同的时钟,它们的时序彼此同步。
  • 异步 - 异步的设备具有各自的时钟,并由前一状态的输出触发。

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

例如,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字节。

如果是串口通信,一般包括起始位,数据位,校验位(可无)和停止位。以起始位为标志,通信双方进行同步,然后发送方以一个固定的时间间隔进行比特位的传输,接收方以一个固定的时间间隔进行比特位的接收,如果双方的波特率不同,就意味着发送方和接收方所采用的时间间隔不相等,就可能导致接收数据的错位。一般认为通信双方的波特率相差2.5%以内可保证正常通信。

Serial2与Serial3 需手动实例化后进行使用

#include <Arduino.h>
HardwareSerial Serial2(3,2);//PA3,PA2 亦可 HardwareSerial Serial2(PA3,PA2);
HardwareSerial Serial3(5,4);//PB11,PB10 亦可  HardwareSerial Serial2(PB11,PB10);
HardwareSerial Serial4(PC11,PC10);//非Stduino 板请直接写PA\B\C\D+数字
HardwareSerial Serial5(PD2,PC12);//非Stduino 板请直接写PA\B\C\D+数字
void setup() 
{
  // put your setup code here, to run once:
Serial2.begin(9600);
Serial3.begin(9600);
Serial4.begin(9600);
Serial5.begin(9600);
}
void loop()
{
    Serial2.println(9);
    Serial3.println(9);
    Serial4.println(9);
    Serial5.println(9);
    delay(1000);
  // put your main code here, to run repeatedly:

}

实验代码

以下代码将使Stduino在启动时发送hello world。
Serial默认与PA10,PA9绑定可以直接使用

#include <Arduino.h>
void setup() {
   Serial.begin(9600); 
}

void loop() {
   Serial.println("hello,world"); 
   delay(1000);
}

将Stduino程序下载到Stduino后,打开Stduino IDE右上角的串口监视器,就可以看到返回了一条信息:“hello,world”。
以下代码将使Stduino根据提供的输入传送输出。

#include <Arduino.h>
void setup() {
   Serial.begin(9600); 
}

void loop() {
   if(Serial.available()) 
   { 

      Serial.print("I received:"); 
      Serial.write(Serial.read()); 
   }
}

请注意,Serial.print 和 Serial.println 将发回实际的ASCII代码,而 Serial.write 将返回实际的文本。请参阅ASCII代码串行通信了解更多用法。

文档更新时间: 2021-02-25 15:01   作者:admin