树莓派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;
}

运行结果:
在这里插入图片描述
在这里插入图片描述

参考文献

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

  • 9
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
树莓派4B 是一款单板计算机,它作为一个强大而灵活的开源平台,被广泛应用于物联网、嵌入式系统、教育等领域。其中的/dev/ttyama0 是树莓派4B上的一个串口设备。 串口是一种用于串行数据传输的通信接口,它可以用于连接各种外部设备,如传感器、打印机、调试工具等。而/dev/ttyama0 是树莓派4B上的第一个串口设备,它通过GPIO引脚实现了数据的收发。 通过/dev/ttyama0,可以实现与其他设备之间的数据交换和通信。用户可以通过编程语言(如Python)或者命令行工具(如minicom)来访问/dev/ttyama0,并使用相应的协议进行数据传输。在物联网项目中,可以利用/dev/ttyama0与传感器进行通信,获取传感器的数据并进行处理。在嵌入式系统开发中,可以使用/dev/ttyama0进行调试,输出调试信息,或者与其他设备进行交互。 当我们在树莓派4B上使用串口通信时,需要注意一些配置和设置。首先,我们需要确认树莓派上的串口是否已经启用,并且与/dev/ttyama0 对应。在树莓派操作系统中,可以使用命令行工具raspi-config来对串口进行配置。其次,我们需要按照相应的通信协议编写代码,以实现数据的发送和接收。不同的设备和应用场景可能需要不同的协议和参数设置,因此需要根据具体情况进行配置。 总而言之,树莓派4B上的/dev/ttyama0 是一个串口设备,它提供了与其他设备进行数据交换和通信的接口。通过适当的配置和编程,我们可以实现与传感器、工具等设备的连接和数据交互。这为我们在物联网、嵌入式系统等领域的开发和应用带来了更多的可能性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值