Arduino之串口通信函数

串口通信,也称为串行通信,是一种数据传输方式,其中数据以串行的形式按位顺序发送和接收。Arduino板通常具有内置的串口通信功能,允许它与其他设备(如计算机、传感器或其他微控制器)进行数据交换。Arduion的串口通信主要是通过TX/RX引脚实现的。

TX(发送)和RX(接收)引脚是Arduino等微控制器上用于串口通信的重要接口。它们允许微控制器与其他设备(如计算机、其他微控制器、传感器等)进行数据传输。

串口通信的工作原理

  • TX引脚:发送(Transmit)引脚,用于将Arduino板上的数据发送出去。

  • RX引脚:接收(Receive)引脚,用于接收外部设备发送给Arduino板的数据。

Arduino板上的USB接口通过转换芯片(如ATmega16U2、CH340等)实现了与计算机的USB通信,并在计算机上虚拟出一个串口。这样,计算机就可以通过串口监视器与Arduino进行通信了。

串口通信的代码实现

在Arduino中,串口通信通常通过以下步骤实现:

1、初始化串口:在Arduino程序中,使用Serial.begin()函数来初始化串口通信。这个函数接受一个参数,即波特率(baud rate),它定义了数据传输的速度。

 Serial.begin(9600); // 设置波特率为9600

波特率的设置并没有一定要求是9600,只需要两边都是设置一样的数值就行了,但是如果设置过高,可能传输失败的概率会增加,如果设置过低,传输速率得不到保证,一般我们就按照默认的设置为9600影响不大。

2、发送数据:使用Serial.print()Serial.println()函数来发送数据。这些函数可以发送字符串、数字或其他数据类型。

 Serial.print("Hello, world!"); // 发送字符串
 Serial.println(123); // 发送数字并换行

Serial.print() 函数可以发送中文字符,但是要注意几个关键点:

那就是Arduino板和计算机的编码格式要一致,Arduino在发送中文字符的时候,它的编码格式是代码文件的编码格式,所以串口监视器的编码格式要设置的跟代码文件的编码格式一致才行。

3、接收数据:使用Serial.read()函数来从串口接收数据。这个函数在有数据可读时返回读取的字符,否则返回-1,它每次只能读一个字符。Serial.available()函数用来判断缓冲区里面是否有字符可读。

 if (Serial.available() > 0) {
   char inChar = Serial.read(); // 读取一个字符
 }

这些函数都比较简单,唯一需要理解清楚的是,串口监视器和TX,RX引脚之间的关系。

问题1:串口监视器的数据,是通过TX/RX获取和发送的吗?

串口监视器是Arduino IDE内置的一个工具,它主要用于监视和调试Arduino与计算机之间的串口通信,他是虚拟的串口。而TX(发送)和RX(接收)引脚是Arduino板上用于串口通信的物理引脚,他是实体的串口。

TX和RX引脚的使用
  • TX和RX引脚是Arduino进行串口通信的物理接口。当Arduino需要通过串口与其他设备(如计算机、其他Arduino板、传感器模块等)通信时,就需要使用到这两个引脚。

  • 开发者可以在Arduino程序中编写串口通信的代码,通过TX引脚发送数据,通过RX引脚接收数据。

串口监视器的作用
  • 串口监视器的主要作用是将Arduino发送或接收的数据实时显示出来,便于开发者进行调试和监视。

  • 它并不占用TX和RX引脚本身,而是通过与Arduino的USB接口(或其他通信接口)建立连接,来捕获和显示串口数据。

前面说过,Arduino板上的USB接口通过一个转换芯片与TX和RX引脚连接,这并不意味着当数据发送给串口监视器时,就不能同时通过TX引脚发送给连接的设备。

实际上,当你使用Serial.print函数的时候,发送到了串口缓冲区,然后发送了两份相同的数据,一份数据通过TX引脚发送出去。另一份数据被转换为USB数据包,并通过USB数据线发送给计算机串口监视器中。他们是并发执行的,并不干扰,所以Arduino 使用了串口监视器,还能用TX/RX引脚。

问题2:波特率到底有什么影响

当你调用Serial.print()Serial.println()等函数时,Arduino会将数据发送到它的串口缓冲区。然后,这些数据会被发送到TX引脚以供外部设备接收。

默认情况下,硬件串口(HardwareSerial)的缓冲区大小通常为64字节。这意味着,在发送或接收数据时,串口缓冲区最多可以暂存64字节的数据

波特率定义了数据传输的速率,即每秒传输的比特数(或字节数,取决于具体的定义和上下文)。当波特率增加时,数据以更快的速度通过串口传输,这就要求缓冲区能够更快地处理这些数据。

如果缓冲区的大小不足以在数据到达时存储所有的数据,那么新的数据可能会覆盖掉旧的数据,或者数据可能会被简单地丢弃,从而导致数据丢失。这种情况在高速数据传输时尤为常见,因为数据以非常快的速度涌入缓冲区。

因此,如果波特率设置得过大,而缓冲区大小不足以应对高速数据传输的需求,那么确实容易出现数据丢失的情况。

问题3:计算机通过串口监视器发数据,然后外接设备也发送数据到RX,数据如何区分

在Arduino或类似的串口通信环境中,当串口监视器(通常通过USB连接)和外部设备同时发送数据时,Serial.read()函数本身并不直接提供区分数据来源的能力。Serial.read()只是从串口接收缓冲区中读取下一个可用的字节,而不关心这个字节来自哪里。

要区分来自串口监视器和外部设备的数据,你需要实现一些额外的逻辑。例如,在发送的数据位中,规定第一个位为0的是来自监视器数据,为1的来自外接设备数据。这需要你在代码逻辑上进行区分。

问题4:串口通信中,数据到底是怎么传输的

串口通信的数据格式在串行通信中扮演着重要的角色,它决定了数据如何被编码、传输和解码。串口通信的数据格式一般包含以下几个关键部分:起始位、数据位、校验位(可选)和停止位。下面将详细解释这些组成部分:

1. 起始位
  • 作用:起始位标志着一帧数据的开始,它是一个逻辑低电平(0)。当接收端检测到从高电平到低电平的跳变时,就知道一帧数据开始了。

  • 数量:起始位通常只有1位。

2. 数据位
  • 作用:数据位是实际传输的数据内容,它可以是5、6、7或8位。标准的ASCII码是7位,而扩展的ASCII码和大多数应用场合使用的是8位(1字节)。

  • 顺序:数据位从低位(LSB)开始传输,到高位(MSB)结束。

3. 校验位(可选)
  • 作用:校验位用于确保数据传输的正确性。它不是必须的,但可以在需要高可靠性的通信场合中使用。

  • 类型:校验位可以是奇校验、偶校验、无校验、1校验(校验位始终为1)或0校验(校验位始终为0)。奇校验要求数据位和校验位中1的总数为奇数,偶校验则要求为偶数。

4. 停止位
  • 作用:停止位标志着一帧数据的结束,它是一个逻辑高电平(1)。停止位不仅仅表示传输的结束,还提供了计算机校正时钟同步的机会。

  • 数量:停止位可以是1位、1.5位或2位,但1位停止位最为常见。

串口通信数据格式示例

以最常见的8位数据位、1位停止位、无奇偶校验为例,一个字节的数据(如0x55,即二进制01010101)在串口通信中的格式如下:

 起始位(1位): 0  
 数据位(8位): 01010101  
 停止位(1位): 1复制代码

所以,如果你每次传输一个字节的数据,那么实际上加上起始位和停止位,一个数据帧就是10位了。

问题5:如果设置数据位为8位,那么既然数据位都是8位对齐的,那么为什么还需要起始位和停止位,有什么意义

在串口通信中,即使数据位被设置为8位对齐,起始位和停止位的存在仍然具有重要意义。这些位共同构成了一个完整的数据帧,确保了数据的正确传输和接收。以下是起始位和停止位的具体意义:

起始位的意义
  1. 标识数据帧的开始:起始位是数据帧的第一个位,通常为逻辑低电平(0)。当接收设备检测到起始位时,它知道一个新的数据帧即将开始传输。这有助于接收设备同步其内部时钟,准备接收后续的数据位。

  2. 避免数据混淆:在连续的数据传输中,起始位有助于区分不同的数据帧。如果没有起始位,接收设备可能无法准确判断一个数据帧的结束和下一个数据帧的开始,从而导致数据混淆或丢失。

  3. 提高通信可靠性:起始位为接收设备提供了一个明确的信号,表明数据传输即将开始。这有助于减少因信号干扰或线路噪声引起的误判,提高通信的可靠性。

停止位的意义
  1. 标识数据帧的结束:停止位是数据帧的最后一个位,通常为逻辑高电平(1)。当接收设备检测到停止位时,它知道当前数据帧的传输已经结束。这有助于接收设备正确地将接收到的数据位组合成一个完整的数据帧。

  2. 提供时间窗口:停止位的存在为接收设备提供了一个时间窗口,用于准备接收下一个数据帧的起始位。这有助于接收设备在连续的数据传输中保持同步,确保每个数据帧都能被正确接收和处理。

  3. 增强抗干扰能力:停止位的高电平状态有助于接收设备在数据帧传输结束后恢复到一个稳定的空闲状态。这可以减少因线路噪声或信号干扰引起的误判,增强通信的抗干扰能力。

综上所述,起始位和停止位在串口通信中起着至关重要的作用。它们不仅标识了数据帧的开始和结束,还提供了同步时钟、避免数据混淆、提高通信可靠性和增强抗干扰能力等功能。因此,在串口通信中,即使数据位被设置为8位对齐,起始位和停止位的存在仍然是不可或缺的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值