环境:

树莓派4B,ubuntu mate20

1.外设串口简介

1.1 硬件串口(/dev/ttyAMA0)

该串口由硬件实现,有单独的波特率时钟源,性能高、可靠。

1.2 mini串口(/dev/ttyS0)

该串口性能低,功能也简单,并且没有波特率专用的时钟源,而是由CPU内核时钟提供。因此mini串口有个致命的弱点是:波特率受到内核时钟的影响。

也就是说,和CPU共用同一时钟,当CPU处理较多任务时,或者低功耗时,你的串口波特率不是稳定的,数据误传、传丢就会成为常态。

1.3 外设串口的默认分配和改进方案

树莓派(3/4代)板载蓝牙模块,默认的硬件串口是分配给蓝牙模块使用的,而性能较差的mini串口是分配给GPIO串口 TXD0、RXD0。

树莓派 java 串口 树莓派4串口_树莓派 java 串口

serial0即GPIO映射的串口(TXD0、RXD0),默认是ttyS0,即mini串口。
serial1即板载蓝牙映射的串口,默认是ttyAMA0,即硬件串口。
我们要做的工作是将两者映射互相交换——serial0映射成ttyAMA0,serial1映射成ttyS0。

1.4 补充

树莓派IO引出的串口默认是用来做控制台使用的(使用串口登录树莓派,类似SSH登录那种),
它的初衷是为了在没有网络接口时,通过串口对树莓派进行相关的配置。

2. 串口配置步骤

运行以下命令可以查看到默认的串口分配方式:

ls /dev -al

树莓派 java 串口 树莓派4串口_网络接口_02

 由于硬件串口分配给板载蓝牙使用,所以我们要释放掉,并且设置硬件串口分配给GPIO串口。

2.1 修改串口配置

sudo raspi-config

进入树莓派系统配置界面,选择第五个Interfacing Options

树莓派 java 串口 树莓派4串口_树莓派 java 串口_03

进入P6 Serial

树莓派 java 串口 树莓派4串口_网络接口_04

选择关闭串口登录功能,打开硬件串口调试功能。

终端键入:

sudo reboot

 2.2 设置硬件串口为GPIO串口(调换serial0和serial1的映射)

尝试了很多教程都没有成功,直到看到了这位大佬的文章:树莓派4B没有serial0或ttyS0,serial0没有映射到ttyS0,serial0和serial1调换映射_红衰绿老的博客-_ttys0 树莓派

如果各位是树莓派4B的话,我自己反正是/boot下没有overlays文件夹的,手动创建然后下载dtb文件改config也没用,只有用以下方法才成功!

编辑: (注意是firmware里的config不是boot下的)

cd /boot/firmware
sudo gedit config.txt

在config.txt的结尾加上

dtoverlay=disable-bt

 保存,在终端输入以下命令禁用掉和蓝牙有关的开机启动项

sudo systemctl disable bluetooth

 重启树莓派,应该没有蓝牙标志了,serial0和serial1也调换为:

树莓派 java 串口 树莓派4串口_树莓派 java 串口_05

3. minicom串口助手测试

3.1 安装minicom

sudo apt-get install minicom

3.2 安装完成后启动minicom

minicom -D /dev/ttyAMA0 -b 115200

其中-D表示选择串口**/dev/ttyAMA0**,-b 设置波特率为115200,此参数可以不用设置,默认115200。

但是提示报错permission denied:

树莓派 java 串口 树莓派4串口_网络接口_06

解决方法:使用命令

sudo chmod 777 /dev/ttyAMA0

然后重新调用命令,不会报错:

树莓派 java 串口 树莓派4串口_树莓派_07

 3.3 电脑发送数据给树莓派