树莓派如何通过 GPIO 串口读写数据?

在此树莓派串行读写教程中,我们将向您展示如何通过树莓派上可用的串行 GPIO 连接读写数据。

我们将向您展示如何通过使用 RS232 到 TTL 适配器创建回树莓派的环路来进行这些串行写入,并且相同的概念将适用于任何串行设备。

您将学习使用哪些 GPIO 引脚,以便能够将您的串行设备连接到树莓派,我们还将展示必须执行的步骤,以允许树莓派通过 TX 和 RX GPIO 引脚进行读写。

我们还将教您如何使用 Python 编程语言通过串行端口读取和写入数据,这应该使您很好地了解如何处理标准串行设备,而不仅仅是环回树莓派。

如果您有兴趣,我们还将在单独的教程中逐步处理 Arduino 的串行读写。

设备清单

以下是本树莓派串行教程所使用的所有细节。

推荐的

  • 树莓派 2 或 3

  • Micro SD 卡

  • 电源

  • RS232 到 TTL 转换器板

  • USB 转串行

可选的

  • 树莓派外壳

  • 以太网网络连接或 * Wifi 加密狗 (Pi 3 具有 WiFi 内置的)

为串行 Pi 连线树莓派

在 ** RS232 至 TTL 适配器上,您应该至少找到四个连接,有些电路确实具有更多连接,但您仅需四个:VCC **(IC 电源引脚), TX (传输数据), RX (接收数据) 和 GND **(接地电源引脚)

您可以将导线直接连接到 GPIO 引脚,也可以像本教程中一样将面包板用作中间人。我们主要这样做是因为我们没有可用的母对母面包板线。

将您的 RS232 到 TTL 适配器连接到树莓派是一个简单的过程,只需要将 4 个 GPIO 连接线连接到串行连接器,甚至更好的是,所有需要的 4 个 GPIO 引脚都排成一排,因此易于遵循。利用下面的表格和指南将串行连接器连接到树莓派。

  • ** VCC 连接至 Pin 4 **。
  • ** TX 连接至 Pin 8 **。
  • ** RX 连接到 Pin 10 **。
  • ** GND 连接至引脚 6 **。

设置树莓派进行串行读写

1 首先,通过运行以下两个命令确保树莓派是最新的,从而开始本教程。

sudo apt-get update
sudo apt-get upgrade

2 既然树莓派是最新的,我们就可以使用 raspi -config 工具。该工具将使我们能够轻松禁用默认情况下启用的串行输入 / 输出接口

sudo raspi-config

3 此命令将加载树莓派配置屏幕。到目前为止,尽管我们只是在一个特定的选择之后,但该工具仍使我们能够对树莓派的配置进行许多不同的更改。如果您需要更深入的概述,则可以查看我们的 raspi-config 工具指南。

使用箭头向下并选择”** 5 接口选项 **”。选择此选项后,您可以按 Enter 。

4 在下一个屏幕中,您将要再次使用箭头键选择” P6 Serial “,突出显示后按 Enter ** 以选择此选项。

5 现在,系统将提示您是否希望通过串行访问登录外壳,用箭头键选择否,然后按 ** Enter ** 继续。

6 在询问您是否要使用串行端口硬件之后,请确保使用箭头键选择是,然后按。输入 ** 以继续。

7 树莓派进行更改后,您应该在屏幕上看到以下文本。

串行登录外壳已禁用
串行接口已启用
“。

在这些更改完全生效之前,我们必须首先重新启动树莓派。为此,请先按 ** Enter ,然后按 ESC ** 返回终端。

在树莓派的终端上键入以下命令以重新启动它。

sudo reboot**8** 现在,通过在树莓派上运行以下命令来检查所有设置是否已正确更改。
dmesg | grep tty

在这里,您要确保以下消息不在输出中显示,如果不是 **,则可以跳至下一部分。否则,请从” 第 2 步” 开始。这些消息表明仍然为该接口启用了串行登录。

** 树莓派 3 和树莓派 Zero W **

[ttyS0]已启用

** 树莓派 2 和更早的版本以及树莓派 Zero **

[ttyAMA0]已启用

在树莓派上利用串行读写

在本部分教程中,您需要将 USB 串行适配器插入 RS232 适配器。然后,您希望将 USB 串行适配器的 USB 端插入树莓派的 USB 端口。

当然,在实际应用中,您将串行连接连接到实际设备,例如调制解调器,打印机甚至某些 RFID 阅读器,实际上,我们在设置 RFID RC522] 教程中使用了串行连接。芯片。

对于本树莓派串行教程,我们将仅向您展示它们的工作原理,以及如何读取来自串行线路的数据。

1 连接好 USB -Serial 适配器并将其插入树莓派后,我们可以在终端中运行以下命令。

dmesg | grep tty

2 在此命令的输出中,您要注意出现的所有其他行,这些行也指定了它所连接的 USB 。

例如,如下面的输出所示,我自己的转换器已连接到 ttyUSB0 **。记下您的 USB 设备所连接的对象,因为这将需要您完成本教程。

[2429.234287] USB 1-1.2:ch341-uart转换器现已连接到 ttyUSB0 

3 现在,我们知道连接了 USB 设备,接下来就可以对两个脚本进行编程了。这些脚本中的一个将通过 ttyUSB0 端口读取数据,另一个将通过 ttyS0 /ttyAMA0 端口写入数据。

首先,我们将编写我们自己的串行写脚本,转到下一部分以了解如何在 Python 中进行串行写。

对树莓派进行编程以进行串行写入

1 首先,让我们开始编写我们的 ** serial \ _write.py ** 脚本,该脚本将通过串行端口写入数据。在树莓派上运行以下两个命令以开始写入文件。

mkdir〜/serial
cd〜/序列
vim serial _write.py

2 在该文件中编写以下代码行。

#!/usr/bin/env python
导入时间
导入序列

代码的第一行告诉操作系统应该使用什么来运行文件。否则,它将可能尝试将其作为标准 bash 脚本运行。

第一次导入是时间。我们不时使用该库暂时将脚本休眠,以供测试计数器使用,而您不需要此程序包即可进行串行写入。

第二次导入是序列。该库包含处理串行连接的所有功能,从而允许通过串行端口进行读写。

ser = serial.Serial(
        port ='/dev/ttyS0',#用 ttyAM0 将 ttyS0 替换为 Pi1 ,Pi2,Pi0
        波特率= 9600,
        parity = serial.PARITY_NONE,
        stopbits = serial.STOPBITS_ONE,
        bytesize = serial.EIGHTBITS,
        超时= 1
)
计数器= 0

这部分代码主要实例化串行类,并为其建立连接所需的所有各种信息位。

  • 端口 –定义对象应尝试进行读写的串行端口。对于 Pi 3 和 Pi Zero W,它应该是 tty0 。如果您使用的是 Pi 2 和更早的版本,或者使用基本的 Pi 0,则应该使用 ttyAM0 。

  • 波特率 –这是通过通信信道传输信息的速率。

  • ** parity ** –设置是否应该进行奇偶校验,这是为了确保通信期间节点之间的准确数据传输。

  • ** stopbits ** –这是预期的位模式,它指示字符或数据传输的结束。

  • ** bytesize ** –这是数据位数。

  • 超时 –这是串行命令在超时之前应等待的时间。

    而 1 :

          ser.write('写计数器:%d \ n'%(计数器))
          time.sleep(1)
          计数器+ = 1

该代码非常简单,并且始终循环循环,将文本”** Write Counter:1 “(其中 1 替换为当前计数器编号) 连续写入串行端口。这意味着在另一侧监听的任何脚本或设备将不断接收该文本。在每个循环中,我们使用时间库在增加计数器之前将脚本休眠 1 秒钟,这是为了避免对串行端口发送垃圾邮件。
**3
完成编写 ** serial \ _write.py ** 脚本后,它应该看起来类似于下面显示的内容。

#!/usr/bin/env python
导入时间
导入序列

ser = serial.Serial(
        port ='/dev/ttyS0',#用 ttyAM0 将 ttyS0 替换为 Pi1 ,Pi2,Pi0
        波特率= 9600,
        parity = serial.PARITY_NONE,
        stopbits = serial.STOPBITS_ONE,
        bytesize = serial.EIGHTBITS,
        超时= 1
)
计数器= 0

而 1 :
        ser.write("写计数器:%d \ n"%(计数器))
        time.sleep(1)
        计数器+ = 1

确定输入正确的代码后,您可以通过按 ** Ctrl + X ,然后按 Y ,然后最后按 Enter **,来保存文件。

4 至此,我们已经完成了 ** serial \ _write.py 脚本的编写,现在还不能对其进行测试。首先,我们需要编写 serial \ _read.py ** 脚本。这样做的原因是要判断串行写入是否正在通过串行写入,我们实际上需要一些东西来接收它们。

在下一部分中,我们将探索编写 ** serial \ _read.py ** 脚本。不必担心太多,因为它与串行写入代码非常相似。

对树莓派进行编程以进行串行读取

1 首先,我们开始编写 ** serial \ _read.py ** 脚本,这基本上会通过串行端口写入数据。在树莓派上运行以下两个命令以开始写入文件。

mkdir〜/serial
cd〜/序列
vim serial _read.py

2 在该文件中编写以下代码行。

#!/usr/bin/env python
导入时间
导入序列

ser = serial.Serial(
        port ='/dev/ttyUSB0',
        波特率= 9600,
        parity = serial.PARITY_NONE,
        stopbits = serial.STOPBITS_ONE,
        bytesize = serial.EIGHTBITS,
        超时= 1
)

由于我们已经遍历了很多这段代码,因此我们不再烦恼它。

此代码块与我们在串行写入脚本中使用的代码块之间的唯一区别是,我们正在使用 USB 设备的端口。在我们的例子中,这是 ** ttyUSB0 **,如果您在本树莓派串行读写教程的前面获得了不同的结果,请记住更改它。

而 1 :
        x = ser.readline()
        打印 x 

这段代码非常简单。基本上,它利用了我们先前在代码中设置的串行对象中的函数。

此函数读取终止的行,这意味着它将读取直到命中以 ** \ n 结尾的行。之后的任何内容都将被拒绝。读取值后,将其存储到我们的 x ** 变量中。

最后,我们打印使用 ** ser.readline ()** 函数获得的值。

3 完成编写 ** serial \ _read.py ** 之后,脚本看起来应该类似于下面显示的内容。

#!/usr/bin/env python
导入时间
导入序列

ser = serial.Serial(
        port ='/dev/ttyUSB0',
        波特率= 9600,
        parity = serial.PARITY_NONE,
        stopbits = serial.STOPBITS_ONE,
        bytesize = serial.EIGHTBITS,
        超时= 1
)

而 1 :
        x = ser.readline()
        打印 x 

确定输入正确的代码后,可以按 Ctrl + X,然后按 Y ,最后按 Enter ,以保存文件。

测试我们的串行读写 Python 脚本

1 现在,我们已经编写了串行读取和串行写入 Python 脚本,现在我们可以开始对其进行测试了。

为此,您将需要有两个活动的终端窗口。这意味着要么在树莓派上打开终端应用程序两次,要么仅启动两个单独的 SSH 连接。

这样做的原因是,您可以同时看到串行写入脚本和串行读取脚本。

2 现在在一个终端窗口中,您将需要键入以下两个命令来启动我们的 ** serial \ _read.py ** Python 脚本。该脚本将立即开始读取我们的 ** serial \ _write.py ** 脚本通过其串行连接传递的所有数据。

cd〜/序列
sudo python serial_read.py

3 现在在我们的另一个终端窗口中,键入以下两个命令以启动 ** serial \ _write.py ** Python 脚本。基本上,该脚本将开始通过串行连接输出数据,我们很快将使用其他脚本接收该串行连接。

cd〜/序列
sudo python serial_write.py

4 您现在应该注意到,在您的第一个终端窗口中,正在显示我们使用 ** serial \ _write.py 脚本编写的串行数据。在终端中显示数据将意味着我们已成功编写了两个脚本,并且 serial \ _read.py 已成功从 serial \ _write.py ** 接收数据。
我们希望在完成本树莓派教程之后,您现在对如何通过树莓派上的串行总线写入和读取数据有了一个想法。

本教程应该使您了解如何可能与使用串行接口的其他设备进行交互。

如果您喜欢树莓派系列教程或有任何反馈,请随时在我们的论坛上发表评论。

分享到