环境:
树莓派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。
serial0即GPIO映射的串口(TXD0、RXD0),默认是ttyS0,即mini串口。
serial1即板载蓝牙映射的串口,默认是ttyAMA0,即硬件串口。
我们要做的工作是将两者映射互相交换——serial0映射成ttyAMA0,serial1映射成ttyS0。
1.4 补充
树莓派IO引出的串口默认是用来做控制台使用的(使用串口登录树莓派,类似SSH登录那种),
它的初衷是为了在没有网络接口时,通过串口对树莓派进行相关的配置。
2. 串口配置步骤
运行以下命令可以查看到默认的串口分配方式:
ls /dev -al
由于硬件串口分配给板载蓝牙使用,所以我们要释放掉,并且设置硬件串口分配给GPIO串口。
2.1 修改串口配置
sudo raspi-config
进入树莓派系统配置界面,选择第五个Interfacing Options
进入P6 Serial
选择关闭串口登录功能,打开硬件串口调试功能。
终端键入:
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也调换为:
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:
解决方法:使用命令
sudo chmod 777 /dev/ttyAMA0
然后重新调用命令,不会报错:
3.3 电脑发送数据给树莓派