树莓派从零开始快速入门第9讲——串口

一、前言

串口是嵌入式环境里面使用最多的通讯方式之一,相信很多接触过单片机的同学对串口或多或少都有些了解,老规矩,通信原理和相关的一些参数(如:波特率)我就不介绍了,这些东西都比较简单,不清楚的同学自行查阅相关资料,我主要讲一下大家可能不太清楚的一些知识点。
串口的冷门知识:
串口的类型其实不止一种,串口常用的电平有三种:TTL、RS232、RS485,还有一种不常见的RS422,不常用的我就不说了,我主要讲一下常用的这三种电平的区别。
TTL:电压范围0V至+5V,高电平>2.4V,低电平<0.4V,一般MCU直接输出的串口就是TTL电平的。
RS232:电压范围-15V至+15V,高电平为-3V至-15V,低电平为+3V至+15V。
RS485:电压范围-7V至+12V,不同于TTL和RS232,RS485采用的差分信号负逻辑,高电平为两线间的电压差-2V至-6V,低电平为两线间的电压差+2V至+6V。
三种电平之间不能直接连接,需要通过转换芯片改变电平,一般MCU端出来的电平都是TTL。
如果MCU的串口需要连接到PC端,一般有三种方法:
1、通过一个USB转TTL的芯片转换,可以放在主板上,也可以用那种转换小板,这个大家应该比较熟悉了,某宝上面随处可见。
2、通过一个TTL转232的芯片转换,然后再接一根USB转232的连接线,常用DB9接口。
3、通过一个TTL转485的芯片转换,然后再接一根USB转485的连接线。
TTL一般是板内模块间通讯用的比较多,因为串口线过长会有线损,影响通讯,因此,外接的传感器和MCU的通讯大多使用RS232和RS485这两种,像RS485,串口线即使长达一百米,也不影响正常通讯。

二、配置串口

特别说明:关于串口的配置,我专门查阅了相关的资料,发现众说纷纭,一时间搞得我也有点懵,最后,我用了一种跟大家都不太一样的方法解决了这个问题,当然,我不觉得他们说的就是错的,应该是跟树莓派硬件版本和镜像版本有关系。

我总结了一下网上关于串口的配置,基本都是修改config.txt和cmdline.txt这两个文件,于是在我把串口调试好了之后,将这两个文件的内容贴出来,做个参考。
cmdline.txt文件内容如下:

console=tty1 root=PARTUUID=88efaca1-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles

config.txt文件内容如下:
在这里插入图片描述

我这里用的是树莓派是3B+,镜像是2021-05-07-raspios-buster-armhf.img,其他版本不确定以下方法是否可行。

配置方法1:通过配置命令

sudo raspi-config    // 打开配置
sudo reboot          // 重启,如果之前没有使能,配置完之后要重启才能生效

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
配置完成后重启即可。
注意:如果同时打开了端口和shell打印,就只能用于shell调试,不能当普通串口使用,不然会导致串口数据传输不稳定,偶尔出现乱码。

配置方法2:在可视化界面的设置里面修改
在这里插入图片描述
在这里插入图片描述
配置完成后重启即可。
注意:如果同时打开了端口和shell打印,就只能用于shell调试,不能当普通串口使用,不然会导致串口数据传输不稳定,偶尔出现乱码。

三、串口收发测试

1、查询端口

串口的端口有两个:ttyAMA0(硬件串口)和ttyS0(mini串口),serial也有两个。
serial0:对应的shell调试串口(引脚有引出,可以直接使用)。
serial1:对应的蓝牙串口(引脚没有引出直接连接板载蓝牙,不能直接使用)。
ttyAMA0:硬件串口,默认打开,默认映射serial1。
ttyS0:mini串口,默认不打开。(据说该串口不稳定,实际测试关闭shell之后并没有出现过异常情况)
注:serial0和serial1的映射关系可以通过配置反过来(具体怎么配置这里就不说了),据说ttyAMA0比ttyS0稳定,实际测试都没有发现不稳定的情况(也可能是我测试的次数不够多,或者其他进程启动的不够多)。

查询serial端口是否打开,命令如下:

ls -l /dev            // 查询所有dev
ls -l /dev/serial     // 只查询serial

在这里插入图片描述
serial0端口对应的是树莓派物理引脚的第8脚和第10脚。
在这里插入图片描述

2、串口调试

我这里用的调试工具是minicom。
1)下载minicom

sudo apt-get install minicom

在这里插入图片描述

2)硬件连接
通过一个USB转TTL的模块,连接电脑和树莓派。(USB转TTL的模块可以自由选择,如果你的树莓派扩展板带有usb转ttl的芯片,也是可以使用的)
在这里插入图片描述
3)运行minicom

sudo minicom -D /dev/ttyS0  // 默认波特率为115200,-D代表端口,/dev/ttyS0 类似于windows中的COM口

在这里插入图片描述

3)PC端打开串口助手
随便打开一个串口助手,设置好波特率和com口。
在这里插入图片描述
4)PC端和树莓派相互收发数据
在minicom窗口输入字符串即可发送至PC端,窗口默认不显示键盘输入的字符串。
在PC端发送字符串,会在minicom的窗口显示出来。
minicom使用技巧:
1:输入crtl+A,再输入E,可以打开串口发送显示(默认是关闭显示的),再操作一遍则是隐藏显示。
2:输入crtl+A,再输入Q,Enter,可以退出minicom窗口。
在这里插入图片描述
在这里插入图片描述

四、程序编写并运行

示例代码:

#!/usr/bin/python
# -*- coding:utf-8 -*-
import serial

#ser = serial.Serial("/dev/ttyAMA0",115200)
ser = serial.Serial("/dev/ttyS0",115200)

print("serial test start ...")
ser.write("Hello Wrold !!!\n")
try:
    while True:
        ser.write(ser.read())
except KeyboardInterrupt:
    if ser != None:
        ser.close()

示例代码运行结果:
运行后PC端会收到“Hello Wrold !!!”,PC端随意发送一个字符串,树莓派会返回一样的字符串。
![在这里插入图片描述](https://img-blog.csdnimg.cn/0a82f08641ed459387a05b5ebedfb67d.png
注:代码运行后可通过Crtl+C退出运行。
在这里插入图片描述
进阶代码:
修改1:波特率改为9600
修改2:增加一个功能:通过串口来控制LED灯。

#!/usr/bin/python
# -*- coding:utf-8 -*-
import serial
import RPi.GPIO as GPIO

LED = 26
GPIO.setwarnings(False)               #禁用警告(可以不用)
GPIO.setmode(GPIO.BCM)
GPIO.setup(LED,GPIO.OUT)

#ser = serial.Serial("/dev/ttyAMA0",115200)
ser = serial.Serial("/dev/ttyS0",9600)

print("serial test start ...")
ser.write("Hello Wrold !!!\n")
try:
    while True:
        rx_buf = ser.read()
        ser.write(rx_buf)

        if rx_buf == 'a':
            GPIO.output(LED,GPIO.HIGH)
            print("led on")

        if rx_buf == 'b':
            GPIO.output(LED,GPIO.LOW)
            print("led off")

except KeyboardInterrupt:
    if ser != None:
        ser.close()

进阶代码运行结果:
和预期的一样,波特率9600,串口通信依然正常,PC端发送打开LED灯,发送b关闭LED灯。
在这里插入图片描述

五、结束语

总结一下串口的配置,树莓派的串口有两个,但是只有一个是有用排针引出来,所以先要把调试串口或硬件串口映射到引出来的那对引脚,然后再编写串口收发的程序即可。

好了,这一讲的内容就这么多了,如果对你有帮助,可以点个赞或者给个收藏,如果想了解更多树莓派的知识可以关注我,后续我会继续更新更多的教程,谢谢!
树莓派入门系列教程:树莓派从零开始快速入门系列汇总

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐