需要了解的一些知识
树莓派3的时候,一共有两个串口。
- 硬件串口:/dev/ttyAMA0
- mini串口:/dev/ttyS0
硬件串口有独立的时钟源,通信稳定,但默认分配成了蓝牙功能。可以通过禁用蓝牙等操作来使用这个串口。
而mini串口的时钟源由cpu提供,会随主频的变化而变化,通信不稳定,但可以通过固定CPU主频来稳定通信。
为追求稳定的串口通信,树莓派3需要经过非常复杂的操作才得以实现。
树莓派4增加了四个硬件串口,但需要修改配置来打开。
sudo nano /boot/config.txt
追加以下内容到末尾
dtoverlay=uart2
dtoverlay=uart3
dtoverlay=uart4
dtoverlay=uart5
保存后 reboot 重启系统
查看硬件串口是否可用
ls /dev/ttyA*
如图所示,成功打开额外的硬件串口。
串口与GPIO的对应关系
GPIO14 = TXD0 -> ttyAMA0
GPIO0 = TXD2 -> ttyAMA1
GPIO4 = TXD3 -> ttyAMA2
GPIO8 = TXD4 -> ttyAMA3
GPIO12 = TXD5 -> ttyAMA4
GPIO15 = RXD0 -> ttyAMA0
GPIO1 = RXD2 -> ttyAMA1
GPIO5 = RXD3 -> ttyAMA2
GPIO9 = RXD4 -> ttyAMA3
GPIO13 = RXD5 -> ttyAMA4
树莓派4GPIO引脚图
测试串口
1、用一条杜邦线,将GPIO0和GPIO1相连。
2、在桌面新建一个py文件
3、写一个简单的测试例子(收到数据后打印出来)
# -*- coding: utf-8 -*
import serial
import time
# 打开串口
ser = serial.Serial("/dev/ttyAMA1", 115200)
def main():
while True:
# 获得接收缓冲区字符
count = ser.inWaiting()
if count != 0:
# 读取内容并回显
recv = ser.read(count)
print(recv)
# ser.write(recv)
# 清空接收缓冲区
#ser.flushInput()
# 必要的软件延时
time.sleep(1)
ser.write("Hello World".encode('gbk'))
if __name__ == '__main__':
#如果本文件作为脚本运行
try:
main()
except Exception:
if ser != None:
ser.close()
4、双击打开py文件,运行并查看输出。