树莓派4B使用硬件串口

树莓派4B硬件串口数量

  • 4B相比前几代增加了4个硬件串口,具体看下图

  • 串口资源

  • 这是官网的描述

  • 这就意味着我们并不需要像很多博客说的那样修改映射,直接开启这些硬件串口就能用!

硬件串口的信息查看

  • 比如我们想查看UART2的信息,就可以在终端输入dtoverlay -h uart2,终端输出:uart2
  • 这里显示串口2使用的是GPIO0~3,其中GPIO0TXGPIO1RX,GPIO2和GPIO3是CTS/RTS用于硬件流控,通常的使用过程中不需要考虑。
  • 这里附上4b的引脚定义图:引脚定义图

配置串口2

  1. sudo nano /boot/config.txt打开配置文件,在文件末尾添加dtoverlay=uart2
  2. 重启树莓派
  3. ls /dev/ttyAMA*查看是否成功开启,有ttyAMA1说明成功开启,另外这里的/dev/ttyAMA0是默认开启的,用于树莓派的蓝牙通信。现在就可以使用该串口了!ama

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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值