树莓派3b/4b通用 + 串口配置

(本人使用的是树莓派4b,参考了树莓派3b,结果发现配置为一样的)

基本介绍:

树莓派3/4b的外设一共包含两个串口,一个称之为硬件串口(/dev/ttyAMA0),一个称之为mini串口(/dev/ttyS0)。硬件串口由硬件实现,有单独的波特率时钟源,性能高、可靠,mini串口性能低,功能也简单,并且没有波特率专用的时钟源而是由CPU内核时钟提供,因此mini串口有个致命的弱点是:波特率受到内核时钟的影响。内核若在智能调整功耗降低主频时,相应的这个mini串口的波特率便受到牵连了,虽然你可以固定内核的时钟频率,但这显然不符合低碳、节能的口号。在所有的树莓派板卡中都通过排针将一个串口引出来了,目前除了树莓派3代以外 ,引出的串口默认是CPU的那个硬件串口。而在树莓派3代中,由于板载蓝牙模块,因此这个硬件串口被默认分配给与蓝牙模块通信了,而把那个mini串口默认分配给了排针引出的GPIO Tx Rx。

步骤

1、启动串口

ls -l /dev

在没有配置过正常情况下看到的应该是:
只有 serial1 -> ttyAMA0
启动:

sudo vi /boot/config.txt

在打开的文件后面添加:

#ENABLE UART
enable_uart=1

然后需要重启reboot

在设置中启用串口后,会发现 /dev目录下变成了两个:
serial0 -> ttyS0 和 serial1 ->ttyAMA0

2、禁用蓝牙(硬件串口与mini串口默认映射对换)

sudo vi /boot/config.txt

在打开的文件后面添加:

dtoverlay=pi3-disable-bt 

(此处注意:树莓派4b也一样是pi3,虽然我也不知道为什么,我一开始写成pi4发现不可以,后来直接用pi3却可以)
修改后需要重启:reboot
在这里插入图片描述
因为蓝牙也使用硬件串口,所以我们在 /boot/config.txt里面加上 dtoverlay=pi3-disable-bt ,ttyAMA0 得以释放,这时候树莓派也自动交换了ttyAMA0和ttyS0,把serial0 分配给了 ttyAMA0 。

3、禁用串口的控制台功能

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

在树莓派命令窗口中分别通过如下两个命令停止和禁用串口的控制台功能。
由于我们前面已经交换了串口的映射关系,因此这里注意是ttyAMA0。

sudo systemctl stop serial-getty@ttyAMA0.service
sudo systemctl disable serial-getty@ttyAMA0.service

最后还需要删除一个东西:

sudo vi /boot/cmdline.txt

在打开的文件中删去 console=serial0,115200

树莓派与PC通信

使用wiringPi库代码如下:

#include "stdio.h"
#include "wiringPi.h"
#include "wiringSerial.h"
#include "unistd.h"
#include "string.h"
#include "errno.h"

int main(int argc, char *argv[])
{
	int fd;
	int err;
	char rd_buf[128] = {0};
	char wr_buf[] = {"You are right!\n"};
	
	err = wiringPiSetup();
	if(err != 0)
	{
		printf("wiringPiSetup error\n");
		return -1;
	}

	//初始化并打开串口
	fd = serialOpen("/dev/serial0", 115200);
	if(fd < 0)
	{
		printf("serialOpen error, errno = %d\n", errno);
		return -2;
	}

	while(1)
	{
		read(fd, rd_buf, 128);
		printf("receive data:%s", rd_buf);
		
		//注意:使用strcmp时注意rd_buf最后面会包含0x0d, 0x0e
		if(0 == strncmp(rd_buf, "Yang", 4))
		{
			write(fd, wr_buf, sizeof(wr_buf));
			break;
		}
		else
			serialPrintf(fd, "error, Continue\n");
		memset(rd_buf, 0, strlen(rd_buf));
	}

	serialClose(fd);

	return 0;
}

运行结果:
树莓派3b/4b通用 + 串口配置_第1张图片
在这里插入图片描述

参考文献

https://blog.csdn.net/Veritaz/article/details/89815205
https://blog.csdn.net/Tang_Chuanlin/article/details/92847343

你可能感兴趣的:(树莓派)