【自我提高】树莓派UART的几种语言控制方法 python 篇

树莓派串口(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 

猜你喜欢

转载自blog.csdn.net/shileiwu0505/article/details/106391556
今日推荐