树莓派串口(UART)编程Python示例
文章参考:https://blog.csdn.net/berryfish/article/details/60147631
1. 首先了解树莓派两个串口的对应关系
serial0 -> ttyS0
serial1 -> ttyAMA0
树莓派包含两个串口:
一个称之为硬件串口(/dev/ttyAMA0)
一个称之为mini串口(/dev/ttyS0)
硬件串口由硬件实现,有单独的波特率时钟源,性能高、可靠。mini串口时钟源是由CPU内核时钟提供,波特率受到内核时钟的影响,不稳定。想要通过树莓派的GPIO引脚进行稳定的串口通信,需要修改串口的映射关系。
serial0是GPIO引脚对应的串口,serial1是蓝牙对应的串口
这是没打开GPIO串口的情况,只有serial1(蓝牙)使用的是ttyAMA0(硬件串口):
接下来打开GPIO串口,这个就不贴图了,比较简单。执行
sudo raspi-config
找到Interfacing选项,找到serial。
第一个问题是:would you like a login shell to be accessible over serial?
选否。
第二个问题是would you like the serial port hardware to be enabled?
选是。
2. 关闭蓝牙功能
sudo systemctl disable hciuart
编辑文档 /lib/systemd/system/hciuart.service,命令如下:
sudo nano /lib/systemd/system/hciuart.service
将文档中所有的 “ttyAMA0"改成"ttyS0”,总共要修改两处,修改好以后保存退出。
或者:
/usr/bin/hciattach /dev/ttyS0 bcm43xx 115200 noflow -
加入到ExecStart
[Unit]
Description=Configure Bluetooth Modems connected by UART
ConditionFileNotEmpty=/proc/device-tree/soc/gpio@7e200000/bt_pins/brcm,pins
Requires=dev-serial1.device
After=dev-serial1.device
[Service]
Type=forking
ExecStart=/usr/bin/hciattach /dev/ttyS0 bcm43xx 115200 noflow -
[Install]
WantedBy=multi-user.target
恢复串口使用并设置为通用串口
sudo nano /boot/config.txt
在文档的末尾,添加语句:
dtoverlay=pi3-miniuart-bt
编辑文档 /boot/cmdline.txt
sudo nano /boot/cmdline.txt
替换以下内容
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
这里我们要注意:该替换内容是针对于设置通用串口的,这个内容实际上是关闭了serial console,因为只有这样方可使串口变为通用,即可以使树莓派连接外部设备。如果你是想用串口连接、登录以及控制树莓派,则需要 enable seiral console,具体方法可以参考我在开头给出的链接。
3. 依次执行以下命令完成所有配置并重启:
sudo apt-get update
sudo apt-get upgrade
sudo reboot
完成以上步骤后,我们现在可以通过"ttyAMA0"与外部设备进行连接了。
重启后我们就发现
serial0 -> ttyAMA0
serial1 -> ttyS0
对调了
4. 测试使用的 python 程序
# -*- coding: utf-8 -*
import serial
import time
# 打开串口
ser = serial.Serial("/dev/ttyAMA0", 9600)
def main():
while True:
# 获得接收缓冲区字符
count = ser.inWaiting()
if count != 0:
# 读取内容并回显
recv = ser.read(count)
print(recv)
ser.write(recv)
# 清空接收缓冲区
ser.flushInput()
# 必要的软件延时
time.sleep(0.1)
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
if ser != None:
ser.close()
运行
pi@raspberrypi:~/pilearn/uart $ python uart.py