树莓派4B相较前几代多了4个硬件串口
树莓派4B硬件串口数量
4B相比前几代增加了4个硬件串口,具体看下图
这就意味着我们并不需要像很多博客说的那样修改映射,直接开启这些硬件串口就能用!
硬件串口的信息查看
- 比如我们想查看UART2的信息,就可以在终端输入
dtoverlay -h uart2
,终端输出: - 这里显示串口2使用的是GPIO0~3,其中GPIO0是TX,GPIO1是RX,GPIO2和GPIO3是CTS/RTS用于硬件流控,通常的使用过程中不需要考虑。
- 这里附上4b的引脚定义图:
配置串口2
sudo nano /boot/config.txt
打开配置文件,在文件末尾添加dtoverlay=uart2
- 重启树莓派
ls /dev/ttyAMA*
查看是否成功开启,有ttyAMA1说明成功开启,另外这里的/dev/ttyAMA0是默认开启的,用于树莓派的蓝牙通信。现在就可以使用该串口了!
c++例程
#include <iostream>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#include <string.h>
int main() {
// 打开串口
int serialPort = open("/dev/ttyAMA1", O_RDWR | O_NOCTTY | O_NDELAY);
if (serialPort < 0) {
std::cerr << "Error opening serial port" << std::endl;
return 1;
}
// 配置串口
struct termios tty;
if(tcgetattr(serialPort, &tty) != 0) {
std::cerr << "Error from tcgetattr" << std::endl;
return 1;
}
cfsetospeed(&tty, B9600);
cfsetispeed(&tty, B9600);
tty.c_cflag &= ~PARENB;
tty.c_cflag &= ~CSTOPB;
tty.c_cflag &= ~CSIZE;
tty.c_cflag |= CS8;
tty.c_cflag &= ~CRTSCTS;
tty.c_cflag |= CREAD | CLOCAL;
tty.c_lflag &= ~ICANON;
tty.c_lflag &= ~ECHO;
tty.c_lflag &= ~ECHOE;
tty.c_lflag &= ~ECHONL;
tty.c_lflag &= ~ISIG;
tty.c_iflag &= ~(IXON | IXOFF | IXANY);
tty.c_iflag &= ~(ICRNL | INLCR);
tty.c_oflag &= ~OPOST;
if (tcsetattr(serialPort, TCSANOW, &tty) != 0) {
std::cerr << "Error from tcsetattr" << std::endl;
return 1;
}
// 发送数据
unsigned char data[] = {0xff, 0x44, 0xfe};
write(serialPort, data, sizeof(data));
// 设置非阻塞模式
fcntl(serialPort, F_SETFL, FNDELAY);
// 循环读取数据
unsigned char byte;
int numBytesRead;
while (true) {
numBytesRead = read(serialPort, &byte, 1); // 读取一个字节
if (numBytesRead == 0) {
// 没有数据
usleep(10000); // 等待 10 毫秒
} else {
// 打印接收到的字节,收到0xff退出
std::cout << "Received byte: " << std::hex << (int)byte << std::endl;
if (byte == 0xff) {std::cout<<"recived 0xff, exit!\n";break;}
}
}
// 关闭串口
close(serialPort);
return 0;
}