树莓派串口通信,Raspberry Pi如何读写串口

在本篇Raspberry Pi串口读写教程中,我将向您展示如何使用Raspberry Pi上的串行GPIO进行串口通信,读写数据。

serial-read-and-write-v2-web.jpg

我将向您展示如何通过使用RS232转TTL适配器来完成这些串行写入,创建一个循环把数据回传到Raspberry Pi,同样的方法适用于任何串行设备。

我还将展示如何使用Python编程语言通过串口读写数据,这都是通用的,可以很好地处理标准的串口设备,而不仅是Raspberry Pi的。

设备清单

下面是在这个树莓派串口通信教程中用到的所有设备清单,点击链接直达特别优惠购买。

建议

可选

Raspberry Pi的串行布线

在RS232转TTL适配器上,可以找到至少四个连接点,有些电路有更多的连接点,但现在只需要四个连接点:VCC(IC电源引脚),TX(发送数据),RX(接收数据)和GND(接地电源引脚)。

可以直接把线连接到GPIO Pins上,也可以像我在本教程中那样用面包板作为中间人。我主要是这样做的,因为我没有母线到母线的面包板线可用。

将RS232转TTL适配器连接到Raspberry Pi很简单,它只需要4个GPIO连接到串口,更好的是所有4个GPIO引脚都在一排,这样看起来比较清晰。请利用下面的表格和指南将串口连接到Raspberry Pi上。

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

serial-read-and-write-fitzrig.jpg

Serial-read-and-write-web.jpg

设置Raspberry Pi的串行读写功能

1. 开始本教程,首先通过运行以下两个命令确保Raspberry Pi是最新的。

sudo apt-get update
sudo apt-get upgrade

2. 现在Raspberry Pi已经更新了,利用raspi-config工具可以轻松地禁用默认启用的串行输入/输出接口。

sudo raspi-config

3. 这个命令将加载Raspberry Pi的配置界面。这个工具可以对Raspberry Pi进行很多配置。如果想了解更深入的概述,可以查看的raspi-config工具指南

使用方向键向下,选择 “5个接口选项”。一旦选择了这个选项,您就可以按Enter键。

4. 在下一个屏幕上,你要再次使用方向键选择 “P6串行”,按Enter键,一旦突出显示,选择这个选项。

5. 现在会提示您是否希望通过序列号访问登录,用方向键选择 “否”,然后按Enter继续。

6. 在是否要使用串行端口硬件后,请确保用箭头键选择 “是”,然后按Enter键继续。

7. Raspberry Pi进行了更改后,应该会看到屏幕上出现以下文字。

“The serial login shell is disabled The serial interface is enabled”。

在这些改变完全生效之前,必须重新启动树莓派。首先通过按Enter键,然后按ESC键回到终端。

在Raspberry Pi的终端中输入以下命令来重新启动它。

sudo reboot

8. 现在在Raspberry Pi上运行以下命令来检查是否一切都已正确更改。

dmesg | grep tty

在这里,要确保下面的信息没有显示在输出中,如果没有,可以跳到下一节。否则,从第二步开始。这些信息表明接口的串行登录仍然处于启用状态。

Raspberry Pi 3和Raspberry Pi Zero W。

[ttyS0] enabled

Raspberry Pi 2和更早的Raspberry Pi Zero。

[ttyAMA0] enabled

利用Raspberry Pi上的串行读和写功能

在本段教程中,需要将USB-串行适配器插入RS232适配器。然后您需要将USB串口适配器的USB端插入Raspberry Pi的USB端口。

当然,在实际应用中,把你的串口连接到一个实际的设备上,比如调制解调器、打印机甚至一些RFID阅读器。

对于这个Raspberry Pi串口教程,只向你展示它是如何工作的,以及如何读取通过串口线传来的数据。

1. 一旦USB串口适配器连接起来,并把它插到Raspberry Pi上,就可以在终端运行以下命令。

dmesg | grep tty

2. 在这个命令的输出中,要注意任何出现的附加信息,这些附加信息指定了它所连接的USB。

例如,我自己的转换器被连接到ttyUSB0,我已经在下面的输出中显示。记下你的USB设备连接的是什么,因为你将需要这个来完成本教程。

[ 2429.234287] usb 1-1.2: ch341-uart converter now attached to ttyUSB0

3. 现在我知道了我的USB设备连接的是什么,可以继续编程。其中一个脚本将通过ttyUSB0端口读取数据,另一个将通过ttyS0/ttyAMA0端口写入数据。

首先我自己写一个串行写脚本,到下一节学习如何在Python中进行串行写。

串行写入的Raspberry Pi编程

1. 首先,开始编的serial_write.py脚本,这将通过串口写入数据。在Raspberry Pi上运行以下两个命令来开始写文件。

mkdir ~/serial
cd ~/serial
nano serial_write.py

2. 在该文件中写下以下几行代码:

#!/usr/bin/env python
import time
import serial

第一行代码是用来告诉操作系统应该尝试用什么来运行这个文件。否则,它很可能会尝试用标准的bash脚本来运行它。

第一个导入的是time。我们的测试计数器每隔一段时间就会使用这个库来临时睡眠脚本,你不需要这个包就可以进行串行写入。

第二个进口是串行。这个库包含了所有处理串口连接的功能,这允许通过串口进行读写。

ser = serial.Serial(
        port='/dev/ttyS0', #Replace ttyS0 with ttyAM0 for Pi1,Pi2,Pi0
        baudrate = 9600,
        parity=serial.PARITY_NONE,
        stopbits=serial.STOPBITS_ONE,
        bytesize=serial.EIGHTBITS,
        timeout=1
)
counter=0

这一部分代码主要是实例化串行类,设置它需要与之进行连接的各种信息位。

  • port – 定义了对象应该尝试进行读写操作的串行端口,对于Pi 3和Pi Zero W来说,应该是tty0。对于Pi 3和Pi Zero W,应该是tty0。如果您使用的是Pi 2和更老的产品,或者是Pi Zero,那么您应该使用ttyAM0。
  • 波特率 – 这是信息在通信通道上传输的速率。
  • 奇偶校验 – 设置是否要进行奇偶校验,这是为了保证通信过程中节点之间数据传输的准确性。
  • stopbits – 这是表示一个字符或数据传输结束的预期位模式。
  • bytesize – 这是数据位数。
  • 超时 – 这是串行命令在超时之前应该等待的时间。
while 1:
        ser.write('Write counter: %d \n'%(counter))
        time.sleep(1)
        counter += 1

这段代码相当简单,它永远循环不断地向串口写入文字 “Write Counter: 1″(其中1被替换为当前的计数器编号)到串口。这意味着任何脚本或另一边监听的设备都会不断地收到这段文字。

在每一次循环中,我们使用时间库在增加计数器之前让脚本睡眠1秒,这是为了尽量不滥用串口。

3. 一旦完成了serial_write.py脚本的编写,它应该有点像下面显示的那样。

#!/usr/bin/env python
import time
import serial

ser = serial.Serial(
        port='/dev/ttyS0', #Replace ttyS0 with ttyAM0 for Pi1,Pi2,Pi0
        baudrate = 9600,
        parity=serial.PARITY_NONE,
        stopbits=serial.STOPBITS_ONE,
        bytesize=serial.EIGHTBITS,
        timeout=1
)
counter=0

while 1:
        ser.write("Write counter: %d \n"%(counter))
        time.sleep(1)
        counter += 1

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

4. 现在已经完成了serial_write.py脚本的编写,但还不能测试它。需要编写serial_read.py脚本。这样做的原因是为了判断是否通过串行写入,需要一些实际的东西来接收它们。

在下一节,将探索编写serial_read.py脚本。不用太担心,因为它与串行写代码相当相似。

串行读取Raspberry Pi的编程

1.开始编写serial_read.py脚本,这会通过串口写入数据。在Raspberry Pi上运行以下两个命令开始写文件。

mkdir ~/serial
cd ~/serial
nano serial_read.py

2. 在该文件中写下以下几行代码:

#!/usr/bin/env python
import time
import serial

ser = serial.Serial(
        port='/dev/ttyUSB0',
        baudrate = 9600,
        parity=serial.PARITY_NONE,
        stopbits=serial.STOPBITS_ONE,
        bytesize=serial.EIGHTBITS,
        timeout=1
)

既然已经讲过了大量的这段代码,就不再赘述了。

这段代码和我们在串口写脚本中使用的代码之间的唯一区别是,使用的是USB设备的端口。在例子中,这是ttyUSB0,如果在这个Raspberry Pi串行读写教程中早些时候得到了不同的结果,记得要改变这个。

while 1:
        x=ser.readline()
        print x,

这段代码非常简单。基本上,它利用了在前面代码中设置的一个序列对象的函数。

这个函数读取一个终止的行,这意味着它读取到一个以\n结束的行。之后的任何内容都将被拒绝。一旦它读取到值,它就会将其存储到我们的x变量中。

最后,使用ser.readline()函数得到的值打印出来。

3. 一旦你完成了serial_read.py脚本的编写,它应该有点像下面显示的那样。

#!/usr/bin/env python
import time
import serial

ser = serial.Serial(
        port='/dev/ttyUSB0',
        baudrate = 9600,
        parity=serial.PARITY_NONE,
        stopbits=serial.STOPBITS_ONE,
        bytesize=serial.EIGHTBITS,
        timeout=1
)

while 1:
        x=ser.readline()
        print x

一旦确定你已经输入了正确的代码,可以通过按Ctrl + X然后按Y,最后按Enter键保存文件。

测试串行读和写Python脚本

1. 现在已经写好了串行读取和串行写入的Python脚本,终于可以开始测试它们了。

要做到这一点,你将需要有两个活动的终端窗口。这意味着要么在Raspberry Pi上打开两次终端应用程序,要么就启动两个单独的SSH连接。

这样做的原因是,你可以看到串行写脚本和串行读脚本同时工作。

2. 现在在一个终端窗口中输入以下两个命令来启动serial_read.py Python脚本。这个脚本将立即开始读取serial_write.py脚本通过其串行连接传递的所有数据。

cd ~/serial
sudo python serial_read.py

3. 现在在另一个终端窗口中,键入以下两个命令来启动serial_write.py Python脚本。这个脚本将开始通过串行连接输出数据,很快就会用另一个脚本接收这些数据。

cd ~/serial
sudo python serial_write.py

4. 现在应该注意到,在第一个终端窗口中,显示了用serial_write.py脚本写入的串行数据。

数据在终端中的显示意味着已经成功地运行了两个脚本,并且serial_read.py成功地接收了serial_write.py的数据。

希望在完成本教程后,现在已经知道如何通过Raspberry Pi上的串行总线写入和读取数据。

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

如果你喜欢这篇树莓派的串口通信教程,或者有任何反馈意见,那么欢迎在下面留言。

平均: 1.8 / 5. votes: 4

到目前为止还没有投票!成为第一位评论此文章。

欢迎转载,请留下出处链接:Labno3 » 树莓派串口通信,Raspberry Pi如何读写串口

赞 (0)

评论

5+3=