显然,原创但已在其他平台发布

一、mini UART配置

关闭蓝牙对硬件串口的使用,将硬件串口重新恢复给GPIO的串口使用,也就意味着树莓派3的板载蓝牙和串口,两者是无法兼得的。

1.关闭蓝牙:

【因为之前忘记做笔记了,所以这里记录一下这么打开蓝牙】

使蓝牙服务在系统启动时自动启用

sudo systemctl enable hciuart
  • 1.

立即启动蓝牙服务,使其可用。

sudo systemctl start hciuart
  • 1.

【树莓派3B+使用串口通讯】_根文件系统

【正式步骤】关闭蓝牙

sudo systemctl disable hciuart
  • 1.

【树莓派3B+使用串口通讯】_串口_02

表示 已成功移除了hciuart.service服务的启动配置文件路径/etc/systemd/system/dev-serial1.device.wants/hciuart.service。

2.修改第一个配置文件

sudo nano /lib/systemd/system/hciuart.service
  • 1.

将文档中的所有“ttyAMA0”(若没有,就改serial1)改成“ttyS0”,总共需要修改两处,修改完后Ctrl+O保存退出。

ttyS0 代表 Linux 系统中的第一个串口设备。

【树莓派3B+使用串口通讯】_根文件系统_03

为了防止出现什么不可预测的意外,先备份一个文件出来

GNU nano 5.4         /lib/systemd/system/hciuart.service  
[Unit]
Description=Configure Bluetooth Modems connected by UART
ConditionFileNotEmpty=/proc/device-tree/soc/gpio@7e200000/bt_pins/brcm,pins
After=dev-serial1.device

[Service]
Type=forking
ExecStart=/usr/bin/btuart

[Install]
WantedBy=dev-serial1.device
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

这个文件是一个系统服务单元文件,通常使用 systemd 来管理。让我们逐段解释它的内容:

Unit 部分:

[Unit]
Description=Configure Bluetooth Modems connected by UART
ConditionFileNotEmpty=/proc/device-tree/soc/gpio@7e200000/bt_pins/brcm,pins
After=dev-serial1.device
  • 1.
  • 2.
  • 3.
  • 4.

Description=: 描述了这个服务单元的作用,即配置通过UART连接的蓝牙调制解调器。 ConditionFileNotEmpty=: 这是一个条件,表示只有当指定路径的文件不为空时,该服务单元才会被激活。在这里,它检查的是 /proc/device-tree/soc/gpio@7e200000/bt_pins/brcm,pins 这个文件是否非空。 After=: 指定了该服务单元应该在 dev-serial1.device 之后启动。这确保了蓝牙服务在串行设备 serial1 准备好后才启动,以避免启动顺序问题。 Service 部分:

[Service]
Type=forking
ExecStart=/usr/bin/btuart
  • 1.
  • 2.
  • 3.

Type=forking: 指定服务的启动类型为 forking,这意味着 systemd 期望服务会在后台派生一个子进程,主进程会退出,以便 systemd 可以检测服务的启动完成。 ExecStart=: 指定了服务启动时执行的命令或程序,这里是 /usr/bin/btuart。 Install 部分:

[Install]
WantedBy=dev-serial1.device
  • 1.
  • 2.

WantedBy=: 指定了一个设备单元或者是系统中的其他单元,它告诉 systemd 当特定的设备 (dev-serial1.device) 准备好时,希望启动这个服务。

综上所述,这个服务单元文件的作用是在特定条件下(UART连接的蓝牙调制解调器就绪),启动 /usr/bin/btuart 程序来配置和启动相关的蓝牙模块。


修改后如图

【树莓派3B+使用串口通讯】_串口_04

3.修改第三个配置文件

sudo nano /boot/config.txt
  • 1.

在文档的结尾加上

dtoverlay=pi3-miniuart-bt
  • 1.
dtoverlay=pi3-miniuart-bt 是 Raspberry Pi 上的一个 Device Tree Overlay。它用于配置 Raspberry Pi 3 或更高版本的设备,以将默认的 mini UART(ttyS0)重新分配为 Bluetooth 模块的使用,从而释放出标准的 UART 用于通信。

【树莓派3B+使用串口通讯】_串口_05

4.修改第四个配置文件

sudo nano /boot/cmdline.txt
  • 1.

Raspberry Pi 系统启动时的内核命令行参数配置文件。 在 Raspberry Pi (基于 Raspberry Pi OS 或其他基于 Debian 的操作系统) 中,cmdline.txt 文件包含了启动 Linux 内核时传递给内核的参数。

命令用于以超级用户(root)身份启动一个新的 shell 会话。

sudo -s
  • 1.

通过编辑这个文件,用户可以修改诸如根文件系统的位置、启动参数、控制台设置等参数,以定制系统的启动行为。这对于调试、优化系统性能或进行特定配置非常有用。

需要注意的是,修改 cmdline.txt 文件需要超级用户权限,因此使用 sudo 命令来以超级用户身份编辑这个文件是一个常见的做法。编辑完成后,保存更改并重新启动系统,新的内核命令行参数设置将生效。

备份一下原来的

console=serial0,115200 console=tty1 root=PARTUUID=7fdd6ec3-02 ootfstype=ext4 fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles cfg80211.ieee80211_regdom=CN
  • 1.

console=serial0,115200:指定系统启动时使用串口 serial0 作为控制台,波特率为 115200。 console=tty1:指定使用虚拟终端 1 作为控制台。 root=PARTUUID=7fdd6ec3-02:指定系统的根文件系统位于具有特定 UUID 的分区上。 rootfstype=ext4:指定根文件系统的类型为 ext4。 fsck.repair=yes:在挂载之前,自动尝试修复根文件系统的错误。 rootwait:如果根文件系统不可用,则等待直到系统可以挂载它。 quiet splash:在启动过程中减少输出到控制台的日志信息,并显示一个启动屏幕。 plymouth.ignore-serial-consoles:指示 Plymouth 不要在启动过程中显示串口控制台。 cfg80211.ieee80211_regdom=CN:指定 Wi-Fi 设备的监管域为 CN(中国)。

这些参数通常在 Linux 系统的 /etc/default/grub 文件或类似的引导配置文件中定义,并通过运行 grub-mkconfig 或类似的命令来更新引导加载器的配置。

请注意,这些参数非常依赖于具体的系统配置和需求,因此在修改它们之前,请确保了解它们的作用,并谨慎操作。如果您是在尝试启动一个特定的 Linux 系统,那么这些参数将是启动时传递给内核的。如果您需要进一步的帮助,可以提供更多的上下文或具体的问题。

-把内容改成如下

dwc_otg.lpm_enable=0  console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4  elevator=deadline fsck.repair=yes   rootwait
  • 1.

这是 Linux 内核启动参数的一部分。让我逐个解释:

dwc_otg.lpm_enable=0: 禁用 USB 低功耗模式,这是针对 Raspberry Pi 上的 USB 控制器(DWC OTG)的参数。 console=tty1: 指定系统控制台输出到 tty1,这是系统上的第一个虚拟终端。 root=/dev/mmcblk0p2: 指定根文件系统的位置,即系统应该从哪个设备的哪个分区启动。在这里,/dev/mmcblk0p2 表示 SD 卡上的第二个分区。 rootfstype=ext4: 指定根文件系统的文件系统类型为 ext4,这是一种常用的 Linux 文件系统格式。 elevator=deadline: 指定 I/O 调度程序为 deadline,它决定了系统中块设备(如硬盘、SSD)的读写顺序。 fsck.repair=yes: 如果文件系统检查(fsck)失败,自动修复文件系统错误。 rootwait: 等待根文件系统可用后再启动系统。 这些参数一起配置了 Linux 内核的启动行为,确保系统能够正确引导和运行。

修改完如图

【树莓派3B+使用串口通讯】_串口_06

更新系统后重启

一条一条的逐步执行以下命令

sudo apt-get update
  • 1.
sudo apt-get upgrade
  • 1.
sudo reboot
  • 1.

重启后关闭蓝牙串口,打开硬件串口

sudo raspi-config
  • 1.

Interfacing Options => Serial =>No =>Yes

【树莓派3B+使用串口通讯】_根文件系统_07

【树莓派3B+使用串口通讯】_串口_08

7.输入命令检查结果

ls -l /dev
  • 1.

【树莓派3B+使用串口通讯】_ci_09

二、 链接电脑和树莓派

保险起见,断电操作,通过sub转TTL线连接树莓派和电脑进行简单测试。

引脚图允许我套个娃

【树莓派3B+使用串口通讯】_ci_10

实际连线如图所示

【树莓派3B+使用串口通讯】_ci_11

三、【电脑->派】通过minicom工具来获取串口上的数据

1.安装minicom工具

sudo apt-get install minicom
  • 1.

【树莓派3B+使用串口通讯】_根文件系统_12

安装成功

2.通过命令获取串口上的数据

minicom -b 9600 -o -D /dev/ttyAMA0
  • 1.

【树莓派3B+使用串口通讯】_ci_13

Debian GNU/Linux 11 raspberry ttyAMA0是因为已经成功登录到了您的 Raspberry Pi,这是登录提示。“raspberry” 是您的主机名,而 “ttyAMA0” 是您的串口设备名。登录后,您可以在该终端上执行命令和操作系统任务。


::>_<::接下来是本人的踩坑历程

---问题1这一步,死在乱码,看来是两个系统调节的编码没设置对

【树莓派3B+使用串口通讯】_ci_14

【好吧,我是蠢货,⇧这个之所以出错是因为波特率没设置对】 ---问题2

【树莓派3B+使用串口通讯】_根文件系统_15

--电量不足

RaspberryRaspberryHello Raspberry[  466.933734] hwmon hwmon1: Undervoltage detected!
  • 1.

忘记截图了,这个问题是因为树莓派端的供电不足,被检测出来了。

---忘记登入

【树莓派3B+使用串口通讯】_ci_16

如果你不登入,就会导致跟我一样,指令输入半天不展示welcome的界面QAQ

【树莓派3B+使用串口通讯】_ci_17

⇩对于底下的情况,我把它归咎于就是因为数据丢失,发送完要缓一下才能继续发送出去。

【树莓派3B+使用串口通讯】_ci_18

四、树莓派给电脑发送信息

首先要给管理员权限

sudo -s
  • 1.

这步骤好像多余了,因为chmod 777意味着所有者、属组和其他用户都拥有文件的完全权限,包括读取、写入和执行操作,也就是管理员权限了。

进入到树莓派的命令行当中进行如下操作在命令行中输入如下命令

sudo chmod 777 /dev/ttyAMA0
  • 1.

接着进入python3中,输入如下代码,我参考博文的博主说,这里一定一定要注意,不要安装serial库!!!因为这个是安装好的,再安装会提示serial中无Serial!

import serial
  • 1.
ser = serial.Serial('/dev/ttyAMA0',115200)
  • 1.

检验串口是否打开,若未打开则输入 ser.open() 打开

ser.isOpen()
  • 1.

True 表示打开

接着我们打开串口,设置波特率,再发送串口信息

ser.write(b'Raspberry pi')
  • 1.

在 Python 中,前缀 b 表示一个字节字符串(byte string)。通过在字符串前面加上 b 前缀,您告诉 Python 解释器将该字符串视为字节序列而不是普通的 Unicode 字符串。这在处理二进制数据时非常有用,因为字节字符串可以直接表示原始的字节数据。在示例中 b'Raspberry pi',b 告诉 Python 将 'Raspberry pi' 视为字节序列,而不是包含 Unicode 字符的普通字符串。这通常在需要向串口设备或文件等处理二进制数据的时候使用。

示意图如下:

【树莓派3B+使用串口通讯】_串口_19

要以十六进制形式发送数据,您可以使用 Python 的内置函数 bytes.fromhex() 将十六进制字符串转换为字节对象,然后使用 ser.write() 方法将其发送到串口。例如,如果您想发送十六进制字符串 'FFAABB',您可以这样做:

hex_data = bytes.fromhex('FFAABB')
ser.write(hex_data)
  • 1.
  • 2.

这将发送十六进制数据 FFAABB 到串口。

【树莓派3B+使用串口通讯】_根文件系统_20

结束!