树莓派4B的串口配置与接收发送16进制数据

一、原理

1、树莓派 4B 有 UART0(PL011)、UART1(mini UART)和 4 个 PL011 串口共计有 6 个 UART

2、默认情况下,树莓派会将 /dev/ttyAMA0 用作终端串口,而不是普通的串口设备。可以通过编辑 /boot/cmdline.txt 文件来禁用终端串口。找到以 console=serial0 开头的行,并将其修改为 console=tty1,如下图所示

 二、 其他串口配置

2.1 展示所有串口命令

输出下面的命令可以看到所有的串口

dtoverlay -a | grep uart

在这里插入图片描述

2.2 查看特定串口信息

使用下面的命令会展示串口的配置信息

dtoverlay -h uart3

在这里插入图片描述

2.3 配置开启串口 UART2-5

在/boot/config.txt的末尾添加如下的代码,保存重启树莓派

dtoverlay=uart2
dtoverlay=uart3
dtoverlay=uart4
dtoverlay=uart5
 

查看是否生效

ls /dev/ttyAMA*

结果如下图

 

到这里就打开了所有的串口了

三、验证结果
各 UART 串口与 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

3.1这里进行两个验证

UART2的自环测试,UART2和3的串口间通信,以及一个究极测试:同时打开所有的串口(包括USB转的,看看树莓派的CPU使用率有多少)

杜邦线短接 GPIO4 和 GPIO5
编写下面的 python 程序

import serial

ser1 = serial.Serial(port='/dev/ttyAMA2',baudrate=115200)
ser1.write(b'Hello, World!\n')

data = ser1.readline()
print(data)

3.2 UART2和3的串口间通信

使用杜邦线按照下图的方式进行连接

GPIO4(TXD3)-------GPIO9(RXD2)
GPIO5(RXD3)-------GPIO8(TXD2)

然后编写如下的程序

import serial

ser2 = serial.Serial(port='/dev/ttyAMA2',baudrate=115200)
ser3 = serial.Serial(port='/dev/ttyAMA3',baudrate=115200)

ser2.write(b'hello ser3,I am ser2\n')
ser3.write(b'hello ser2,I am ser3\n')
line2 = ser2.readline()
line3 = ser3.readline()
print('ser2Rec:'+str(line2))
print('ser3Rec:'+str(line3)

结果如下图,说明串口生效,实验成功:
在这里插入图片描述

四、串口接受发送16进制数据

1、打开串口usart2、3

使用 nano 编辑器:

sudo nano /boot/config.txt

这将使用 nano 编辑器打开 /boot/config.txt 文件。你需要使用超级用户权限(sudo)运行该命令,以便能够编辑 /boot 目录下的文件。

使用 vi 编辑器:

sudo vi /boot/config.txt

这将使用 vi 编辑器打开 /boot/config.txt 文件。同样,你需要使用超级用户权限(sudo)来编辑该文件。

修改完成后,按下相应编辑器的保存快捷键(通常是 Ctrl+O),然后按下退出快捷键(通常是 Ctrl+X)来保存并退出编辑器。

/boot/config.txt的末尾添加如下的代码,保存重启树莓派 sudo reboot

查看是否生效

ls /dev/ttyAMA*

 结果如下图

 各 UART 串口与 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

 

 在树莓派上,引脚的编号可以使用两种方式:物理引脚编号(Physical Pin Numbering)和BCM引脚编号(BCM GPIO Numbering)。

# -*- coding: UTF-8 -*-
#!/usr/bin/python3 python3


import serial

def init_usart1(baudrate):
    ser = serial.Serial('/dev/ttyAMA2', baudrate, timeout=1)  # 打开 ttyUSB0 设备,指定波特率
    return ser

def send_hex_data(ser, data):
    hex_data = bytearray.fromhex(data)
    ser.write(hex_data)  # 将16进制数据转换成字节并发送到串口
    print('发送的数据:', ' '.join(format(byte, '02X') for byte in hex_data))

def read_hex_data(ser):
    try:
        while True:
            if ser.in_waiting > 0:  # 如果串口有数据可读
                data_recv = ser.read(ser.in_waiting)  # 读取所有可用的数据
                hex_data = data_recv.hex()  # 将数据以16进制格式打印出来
                print(hex_data)  # 将数据以16进制格式打印出来

    except KeyboardInterrupt:
        # Ctrl+C被按下,执行异常处理
        ser.close()
        print("程序终止,关闭串口")

# 在主程序中调用函数
baudrate = 115200
usart1 = init_usart1(baudrate)

send_data = "AA 55 01 01 55 AA"  # 要发送的16进制数据

send_hex_data(usart1, send_data)

read_hex_data(usart1)

运行结果如下

参考链接:https://blog.csdn.net/FuckerGod/article/details/131232138

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值