Arduino Serial#

Arduino Serial 概况#

见官方文档: Serial - Arduino Reference

  • Hardware Serial

  • Software Serial

UNO 的硬件串口太少了,可能不够用。

软串口是不是存在更容易丢数据的可能呢?如何设计软串口,使得它不容易丢数据?

串口上发来的数据,一般都是随机出来的,CPU 除非不停地查询或一直等待接收,否则一旦数据到达而没有做好准备,就可能丢数据。

软串口上应该也是可以绑中断的,但接收过程中一直要CPU的参与,这一过程中, CPU 干不了别的。看起来,软件串口可用于低频且数据量不太大的场合。为了保证可靠性,可以加入应答机制。

Hardware Serial#

UNO 的硬件串口用于下载程序,在下载完程序后,就可用作串口了。使用 Pin 0, 1。或已将 Pin 0,1 用作串口通信,那么再在这两个引角上连接其它电路,则会干扰 Serial 数据传输。

硬件串口不够用时,可以使用软件串口。

Software Serial#

什么是是 Software Serial, See: Difference between hardware serial and software serial in Arduino

连接方法#

https://blog.csdn.net/xq151750111/article/details/114885341

#

UNO-Pin

PC-USB-UART

2 (RX)

TX

3 (TX)

RX

GND

GND

代码#

  1. 包含 SoftwareSerial.h 头文件

  2. 先创建 SoftwareSerial ;

  3. Serial1.begin() 之后和默认 Serial 方法相同。

#include <SoftwareSerial.h>
SoftwareSerial mySerial(2,3); //RX, TX
void setup() {
  // put your setup code here, to run once:
  mySerial.begin(9600);
  mySerial.print("Hi, Welcome!");
}

void loop() {
  // put your main code here, to run repeatedly:
  mySerial.println("Hello");
  delay(1000);
}

关于语法 ?#

SoftwareSerial mySerial(2,3) 是类的实例化吗? SoftwareSerial 是类,mySerial 是实例的名字,(2,3) 是参数。

Next#

实验: 可在 PC 和 UNO 之间建立两个串口管道,实现转发,以及循环发送。

如何设计软件串口?#

软件串口收发数据时占用 CPU 时间,如果在发送或接收一个字节的过程中(发送某个比特)被中断,那么该字节一定会丢失,而不能传输成功。那么如何设计才能尽量让软件串口不丢数据呢?

  1. 在发送一个字节的过程中,不允许中断;字节与字节之间好像可以中断;

  2. 接收一个字节的过程中,不允许中断;甚至只要对方还在连续发送,接收就不能中断。为了防止接收端过久地占用 CPU,那么发送方不要一次发得太长。如果发送方不停的发送,接收方要么会丢数据,要么软件中断就会一直占用 CPU

  3. 对于接收方来说,数据是随机而突然到来的,所以最好是用中断处理,而且是立即处理,中间不能延迟。为了给接收方留下反应时间,发送方可以在前几个字节发送无用的数据,等接收方准备好之后再发有用信息

Arduino Serial Monitor#

点击 Tools > Serial Monitors 后,或点击右上角的图标打开串口监视器图标,可以在 IDE 底部显示串口助手,包括3个重要的区域:

  1. Settings: 设置常用的 Com 口参数

  2. send: 发送数据区域,这个区域在第一次使用时容易注意不到

  3. receive: 接收数据区域

image-20230513164950694

调试端口#

Serial.print() 向串口发送的数据,会到哪里去?

简单地说, Serial 是硬件串口,通过 UNO 板方口 USB 线向 PC 上的USB 发送数据。

详细来看,如果正在用 Arduino IDE 调试程序并通过 USB 连接到了 Arduino,那么 Serial.print() 就通过该 USB 口向电脑发送数据。此时该 USB 口已被 Arduino 占用,即 Arduino 会从 USB 口收到数据,并在 Serial Monitor 中打印出来。

Arduino IDE 作为临时使用工具虽然不错,但如果希望使用其它串口调试工具,例如 cutecom (例如使用Cutecom 发送文件等大量数据),则要:

  1. 先关闭 Arduino IDE,释放 USB 口;

  2. 启动 cutecom 软件,设置和 Arduino 中相同的串口参数,再 Open 串口

UNO 除了使用硬件串口外,还可以通过软件串口

其它串口#

Arduino 如何向其它引脚发送 Serial 口数据?