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


前言

明天的目标啦~
他山之石可攻玉石
先找一堆看似靠谱的,明天逐一击破!
树莓派3B+串口通信(超详细简单版)
树莓派3B+使用GPIO实现串口通信[通俗易懂]
树莓派3B 设置通用(UART)串口的方法
这个上了串口助手了⇨树莓派3b+串口配置
找了一堆参考,最终只是看了这篇就成功啦⇨树莓派3B+与STM32进行串口通讯传输信息🙆🏻‍♀️

-----2024/5/31
我之前认为在树莓派上进行串口通讯的时候,其实树莓派给不给管理员权限都行,这个是错误的。必须要给权限给/dev/ttyAMA0才能正常使用ttyAMA0进行串口通信。已经连续踩坑两次得出的血泪教训。
-----2024/6/28


一、mini UART配置

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

1.关闭蓝牙:

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

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

sudo systemctl enable hciuart

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

sudo systemctl start hciuart

在这里插入图片描述

【正式步骤】关闭蓝牙

sudo systemctl disable hciuart

在这里插入图片描述

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

2.修改第一个配置文件

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

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

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

在这里插入图片描述

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

  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

这个文件是一个系统服务单元文件,通常使用 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

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

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

[Install]
WantedBy=dev-serial1.device

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

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


修改后如图在这里插入图片描述

3.修改第三个配置文件

sudo nano /boot/config.txt

在文档的结尾加上

dtoverlay=pi3-miniuart-bt

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

4.修改第四个配置文件

sudo nano /boot/cmdline.txt

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

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

sudo -s 

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

需要注意的是,修改 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

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

这是 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 内核的启动行为,确保系统能够正确引导和运行。

修改完如图在这里插入图片描述

更新系统后重启

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

sudo apt-get update
sudo apt-get upgrade 
sudo reboot

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

sudo raspi-config

Interfacing Options => Serial =>No =>Yes
在这里插入图片描述
在这里插入图片描述
7.输入命令检查结果

ls -l /dev

在这里插入图片描述

二、 链接电脑和树莓派

保险起见,断电操作,通过sub转TTL线连接树莓派和电脑进行简单测试。
引脚图允许我套个娃在这里插入图片描述
实际连线如图所示

在这里插入图片描述

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

1.安装minicom工具

sudo apt-get install minicom

在这里插入图片描述
安装成功

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

minicom -b 9600 -o -D /dev/ttyAMA0

在这里插入图片描述

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


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

—问题1
这一步,死在乱码,看来是两个系统调节的编码没设置对
在这里插入图片描述
【好吧,我是蠢货,⇧这个之所以出错是因为波特率没设置对】
—问题2
在这里插入图片描述
–电量不足

RaspberryRaspberryHello Raspberry[  466.933734] hwmon hwmon1: Undervoltage detected!

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

—忘记登入
在这里插入图片描述
如果你不登入,就会导致跟我一样,指令输入半天不展示welcome的界面QAQ
在这里插入图片描述
⇩对于底下的情况,我把它归咎于就是因为数据丢失,发送完要缓一下才能继续发送出去。
在这里插入图片描述

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

首先要给管理员权限

sudo -s

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

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

sudo chmod 777 /dev/ttyAMA0

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

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

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

ser.isOpen()  

True 表示打开

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

ser.write(b'Raspberry pi')

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

示意图如下:
在这里插入图片描述

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

hex_data = bytes.fromhex('FFAABB')
ser.write(hex_data)

这将发送十六进制数据 FFAABB 到串口。
在这里插入图片描述


总结

这篇文章依旧没有总结

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值