记录关于树莓派如何对换串口映射关系

树莓派3代串口的麻烦

树莓派从大的方向来说一共出了3代,每一代的CPU外设基本相同,但内核不同,外设里面一共包含两个串口,一个称之为硬件串口(/dev/ttyAMA0),一个称之为mini串口(/dev/ttyS0)。

硬件串口由硬件实现,有单独的波特率时钟源,性能高、可靠,mini串口性能低,功能也简单,并且没有波特率专用的时钟源而是由CPU内核时钟提供,因此mini串口有个致命的弱点是:波特率受到内核时钟的影响。内核若在智能调整功耗降低主频时,相应的这个mini串口的波特率便受到牵连了,虽然你可以固定内核的时钟频率,但这显然不符合低碳、节能的口号。

在所有的树莓派板卡中都通过排针将一个串口引出来了,目前除了树莓派3代以外 ,引出的串口默认是CPU的那个硬件串口。而在树莓派3代中,由于板载蓝牙模块,因此这个硬件串口被默认分配给与蓝牙模块通信了,而把那个mini串口默认分配给了排针引出的GPIO Tx Rx,下图是树莓派3的接口图

http://etrd.org/2017/01/29/%E6%A0%91%E8%8E%93%E6%B4%BE3%E7%A1%AC%E4%BB%B6%E4%B8%B2%E5%8F%A3%E7%9A%84%E4%BD%BF%E7%94%A8%E5%8F%8A%E7%BC%96%E7%A8%8B/QQ%E6%88%AA%E5%9B%BE20170129145844.png

 

其中红框中就是引出的串口IO,如果我们需要通过UART外接模块,默认情况下必须得使用性能很低的mini串口了,而且随着内核主频的变化,还会造成波特率的变化导致通信的失败,几乎很难使用。所以我们希望恢复硬件串口与GPIO 14/15的映射关系,使得我们能够通过GPIO使用高性能的硬件串口来连接我们的串口设备。

将树莓派3的硬件串口与mini串口默认映射对换

树莓派可以配置文件来修改设备树,我的理解是可以通过配置文件来修改管脚的映射关系,这在许多Cortex-M3内核的单片机中也很常见,可以将同一个串口映射到不同的管脚上,以方便PCB的布线。

为了在树莓派3中通过GPIO使用高性能的硬件串口,我们必须将分配给蓝牙使用的硬件串口与分配给IO排针的mini串口进行对换,这必然会使得蓝牙模块的功能受到影响,但还好,蓝牙并不是必须的。

在树莓派系统中打开指令

/boot/overlays/

目录下,提供了一个pi3-miniuart-bt-overlay.dtb的文件,这个文件的作用可以通过该目录下的README文件查看

如果没有pi3-miniuart-bt-overlay.dtb这个文件,点击 http://ukonline2000.com/wp-content/uploads/2016/03/ 下载

README文件中说明了这个文件的功能是将树莓派3的蓝牙切换到mini串口(ttyS0),并且恢复硬件串口(ttyAMA0)到GPIO 14&15脚中。并且给出了载入的方法。

首先在树莓派命令终端中通过命令查看树莓派3当前的串口映射关系

1

ls -l /dev

红色框中体现的应该是一种映射关系,此处暂时没有做深究,简单理解 serial0 就是GPIO映射的串口,此时GPIO映射的串口是默认的/dev/ttyS0这个mini串口。

使用下面这条指令编辑 /boot/config.txt 文件

1

sudo nano /boot/config.txt

在该文件中增加一行代码

1

dtoverlay=pi3-miniuart-bt

然后保存文件,重启树莓派使之生效。

 

再通过 ls -l /dev 命令查看修改后的映射关系

对比修改前的关系,可以看出serial0和serial1 与 ttyAMA0和ttyS0的映射关系对换完成了,也就是ttyAMA0映射到了引出的GPIO Tx Rx上。

禁用串口的控制台功能

前面的步骤已经交换了硬件串口与mini串口的映射关系,但现在想使用树莓派外接串口模块进行通信还不行,因为树莓派IO引出的串口默认是用来做控制台使用的,它的初衷是为了在没有网络接口时,通过串口对树莓派进行相关的配置。因此需要禁用这个默认功能,使得串口为我们自由使用。

在树莓派命令窗口中分别通过如下两个命令停止和禁用串口的控制台功能

1

2

sudo systemctl stop serial-getty@ttyAMA0.service

sudo systemctl disable serial-getty@ttyAMA0.service

由于我们前面已经交换了串口的映射关系,因此这里注意是ttyAMA0。

然后通过下列指令编辑cmdline.txt文件

1

sudo nano /boot/cmdline.txt

然后看到里面类似如下的内容

1

dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

console=serial0,115200删掉 console=serial0,115200 ,剩下的内容类似如下

1

dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

然后重新启动树莓派,使修改生效

 

转自:https://blog.csdn.net/qq_31396093/article/details/58640995,只为记录一下,方便查找

 

 

 

 

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
树莓派上有两个串口接口,分别是GPIO14/15和GPIOTXD/RXD。其中,GPIO14/15是板载的UART0串口,GPIOTXD/RXD是板载的UART1串口。 要使用树莓派串口,需要先在系统中启用相应的串口。可以通过编辑/boot/config.txt文件来启用串口,将以下两行代码添加到文件末尾: ``` enable_uart=1 dtoverlay=pi3-miniuart-bt # 如果使用板载的UART0串口,请注释掉这一行 ``` 启用串口之后,可以使用C语言中的termios库来进行串口通信。以下是一个简单的串口通信示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <termios.h> int main() { int fd; struct termios options; // 打开串口设备文件 fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY); if (fd < 0) { perror("open"); exit(1); } // 配置串口参数 tcgetattr(fd, &options); cfsetispeed(&options, B115200); cfsetospeed(&options, B115200); options.c_cflag |= CLOCAL | CREAD; options.c_cflag &= ~CSIZE; options.c_cflag |= CS8; options.c_cflag &= ~PARENB; options.c_cflag &= ~CSTOPB; options.c_cc[VTIME] = 0; options.c_cc[VMIN] = 1; tcsetattr(fd, TCSANOW, &options); // 发送数据 char send_buf[] = "Hello, world!\n"; write(fd, send_buf, strlen(send_buf)); // 接收数据 char recv_buf[256]; int n = read(fd, recv_buf, sizeof(recv_buf)); recv_buf[n] = '\0'; printf("Received data: %s", recv_buf); // 关闭串口 close(fd); return 0; } ``` 在上述代码中,首先打开了/dev/ttyS0设备文件,该文件对应的是板载的UART0串口。然后通过tcgetattr和tcsetattr函数配置了串口的参数,包括波特率、数据位、停止位等。在发送数据时,使用write函数向串口写入数据,而在接收数据时,使用read函数从串口读取数据。最后,使用close函数关闭了串口。 需要注意的是,在使用串口时,需要根据实际情况配置串口的参数,例如波特率、数据位、停止位等。同时,串口通信也需要注意数据的粘包和分包问题,通常需要使用特定的协议来解决。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值