当前位置:   article > 正文

树莓派4B使用硬件串口_树莓派查看dtoverlay

树莓派查看dtoverlay

树莓派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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/762711
推荐阅读
相关标签
  

闽ICP备14008679号