树莓派4串口配置及使用

改变串口的功能

sudo nano /boot/cmdline.txt
删除 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200

使能串口

sudo nano /boot/config.txt
最后增加下面两句话:
dtoverlay=pi3-miniuart-bt
enable_uart=1

重启树莓派

安装minicom

sudo apt-get install minicom

使用minicom通信

minicom -b 9600 -o -D /dev/ttyAMA0
-b 表示波特率  -D 表示端口号 -o 未知,也可以去掉

编写连接树莓派的代码

打开串口代码

int uart_open(int fd,const char *pathname)
{
    assert(pathname);

    /*打开串口*/
    fd = open(pathname,O_RDWR|O_NOCTTY|O_NDELAY|O_NONBLOCK);
    if(fd == -1)
    {
        perror("Open UART failed!");
        return -1;
    }

    /*设置串口非阻塞,因为这里是以非阻塞形式打开的,所以第三个参数为0*/
    if(fcntl(fd,F_SETFL,0) < 0)
    {
        fprintf(stderr,"fcntl failed!\n");
        return -1;
    }

    return fd;
}

配置串口代码

// 115200,0,8,'N',1
int uart_set(int fd,int baude,int c_flow,int bits,char parity,int stop)
{
    struct termios options;

    /*获取串口当前的配置*/
    if(tcgetattr(fd,&options) < 0)
    {
        perror("tcgetattr error");
        return -1;
    }


    /*配置波特率*/
    switch(baude)
    {
        case 4800:
            cfsetispeed(&options,B4800);
            cfsetospeed(&options,B4800);
            break;
        case 9600:
            cfsetispeed(&options,B9600);
            cfsetospeed(&options,B9600);
            break;
        case 19200:
            cfsetispeed(&options,B19200);
            cfsetospeed(&options,B19200);
            break;
        case 38400:
            cfsetispeed(&options,B38400);
            cfsetospeed(&options,B38400);
            break;
        case 115200:
            cfsetispeed(&options,B115200);
            cfsetospeed(&options,B115200);
            break;
        case 230400:
            cfsetispeed(&options,B230400);
            cfsetospeed(&options,B230400);
            break;
        default:
            fprintf(stderr,"Unkown baude!\n");
            return -1;
    }

    /*设置控制模式*/
    options.c_cflag |= CLOCAL;//保证程序不占用串口
    options.c_cflag |= CREAD;//保证程序可以从串口中读取数据

    /*设置数据流控制*/
    switch(c_flow)
    {
        case 0://不进行流控制
            options.c_cflag &= ~CRTSCTS;
            break;
        case 1://进行硬件流控制
            options.c_cflag |= CRTSCTS;
            break;
        case 2://进行软件流控制
            options.c_cflag |= IXON|IXOFF|IXANY;
            break;
        default:
            fprintf(stderr,"Unkown c_flow!\n");
            return -1;
    }

    /*设置数据位*/
    switch(bits)
    {
        case 5:
            options.c_cflag &= ~CSIZE;//屏蔽其他标志位
            options.c_cflag |= CS5;
            break;
        case 6:
            options.c_cflag &= ~CSIZE;//屏蔽其他标志位
            options.c_cflag |= CS6;
            break;
        case 7:
            options.c_cflag &= ~CSIZE;//屏蔽其他标志位
            options.c_cflag |= CS7;
            break;
        case 8:
            options.c_cflag &= ~CSIZE;//屏蔽其他标志位
            options.c_cflag |= CS8;
            break;
        default:
            fprintf(stderr,"Unkown bits!\n");
            return -1;
    }

    /*设置校验位*/
    switch(parity)
    {
        /*无奇偶校验位*/
        case 'n':
        case 'N':
            options.c_cflag &= ~PARENB;//PARENB:产生奇偶位,执行奇偶校验
            options.c_iflag &= ~INPCK;//INPCK:使奇偶校验起作用
            break;
        /*设置为空格,即停止位为2位*/
        case 's':
        case 'S':
            options.c_cflag &= ~PARENB;//PARENB:产生奇偶位,执行奇偶校验
            options.c_cflag &= ~CSTOPB;//CSTOPB:使奇偶校验起作用
            break;
        /*设置奇校验位*/
        case 'o':
        case 'O':
            options.c_cflag |= PARENB;//PARENB:产生奇偶位,执行奇偶校验
            options.c_cflag |= PARODD;//PARODD:若设置则为奇校验,否则为偶校验
            options.c_cflag |= INPCK;//INPCK:使机构校验起作用
            options.c_cflag |= ISTRIP;//ISTRIP:若设置则有效输入数字被剥离7个字节, 否则保留全部8位
            break;
        /*设置偶校验*/
        case 'e':
        case 'E':
            options.c_cflag |= PARENB;//PARENB:产生奇偶位,执行奇偶校验
            options.c_cflag &= ~PARODD;//PARODD:若设置则为奇校验,否则为偶校验
            options.c_cflag |= INPCK;//INPCK:使机构校验起作用
            options.c_cflag |= ISTRIP;//ISTRIP:若设置则有效输入数字被剥离7个字节, 否则保留全部8位
            break;
        default:
            fprintf(stderr,"Unkown parity!\n");
            return -1;
    }

    /*设置停止位*/
    switch(stop)
    {
        case 1:
            options.c_cflag &= ~CSTOPB;//CSTOPB:使用两位停止位
            break;
        case 2:
            options.c_cflag |= CSTOPB;//CSTOPB:使用两位停止位
            break;
        default:
            fprintf(stderr,"Unkown stop!\n");
            return -1;
    }

    /*设置输出模式为原始输出*/
    options.c_oflag &= ~OPOST;//OPOST:若设置则按定义的输出处理,否则所有c_oflag失效

    /*设置本地模式为原始模式*/
    options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
    /*
     *ICANON:允许规范模式进行输入处理
     *ECHO:允许输入字体的本地回显
     *ECHOE:在接收EPASE时执行Backspace,Space,Backspace组合
     *ISIG:允许信号
     */

    /*设置等待时间和最小接收字符*/
    options.c_cc[VTIME] = 0;
    options.c_cc[VMIN] = 1;//最少读取一个字符

    /*如果数据溢出,值接受数据,但是不进行读操作*/
    tcflush(fd,TCIFLUSH);

    options.c_iflag = 0;
    options.c_oflag = 0;
    options.c_lflag = 0;

    /*配置激活*/
    if(tcsetattr(fd,TCSANOW,&options) < 0)
    {
        perror("tcsetattr failed");
        return -1;
    }

    return 0;
}

树莓派接收配置完成后,如果没有 options.c_iflag = 0; options.c_oflag = 0; options.c_lflag = 0;这三行代码,会导致数据接收不稳定

关闭串口代码

int uart_close(int fd)
{
    assert(fd);
    close(fd);
    
    return 0;
}

读写串口

使用linux接口函数read和write函数就可以实现串口的读写

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: Raspberry Pi 4B的波特率是根据使用串口或者通信协议而定的。Raspberry Pi 4B有多个可用的UART串口,每个串口都可以设置不同的波特率。对于UART串口,可以通过设置config.txt文件或者使用软件来配置不同的波特率,常见的波特率有9600、115200等。 另外,对于其他通信协议,如SPI和I2C,Raspberry Pi 4B也支持不同的通信速率,这些通信速率也可以被认为是一种波特率。SPI通信速率可以在代码中进行配置,一般在MHz级别。I2C通信速率也可以通过代码进行配置,一般在100kHz或400kHz。 需要注意的是,波特率是指单位时间内传输的比特数,波特率越高,传输速率越快,但也会引入更多的噪声和误码。因此,在选择和配置波特率时,需要根据实际应用场景的需求进行权衡,确保数据传输的稳定性和准确性。 总之,Raspberry Pi 4B的波特率取决于所使用串口或通信协议,并且可以通过软件或代码进行配置。根据不同的需求和应用场景,选择合适的波特率可以实现稳定和快速的数据传输。 ### 回答2: Raspberry Pi 4B的波特率是指用于与其他设备进行通信的传输速率。波特率是指在单位时间内传输的数据位数。Raspberry Pi 4B支持多种不同的波特率,可以根据需要进行设置。 Raspberry Pi 4B的默认波特率是115200,这是一个常用的标准波特率,可用于与其他硬件设备进行串口通信。可以通过设置串口配置文件或者命令行界面来修改默认波特率。 除了默认波特率外,Raspberry Pi 4B还支持更高的波特率,如230400、460800、921600等。这些更高的波特率可以用于需要快速数据传输的应用,例如高速传输大量数据或者与其他高速设备进行通信。 修改Raspberry Pi 4B的波特率可以通过修改配置文件来实现,如修改串口配置文件中的波特率参数。另外,也可以通过命令行界面使用特定的指令来修改波特率设置。在修改波特率之后,需要确保与Raspberry Pi 4B通信的设备也能支持相同的波特率,以保证正常的数据传输。 总之,Raspberry Pi 4B的波特率是可以根据需求进行修改的,它可以支持多种不同的波特率用于与其他设备进行通信。根据实际应用的需要选择合适的波特率可以确保数据的快速、稳定传输。 ### 回答3: Raspberry Pi 4B支持的常用串口通信波特率是300字。 Raspberry Pi 4B在硬件上增加了两个串口UART接口,其中一个UART接口可通过GPIO引脚使用,另一个UART可通过USB-C接口使用。这两个UART接口都可以用于与外部设备进行串口通信。 在Raspberry Pi上,设定波特率通常需要在操作系统中进行配置。对于GPIO UART接口,可以通过在命令行中使用"stty"命令来设定波特率。通过设置特定的参数,比如"-F /dev/serial0"来指定使用串口设备,并通过参数"-speed 300"来设置波特率为300。 对于USB-C UART接口,通常可以在操作系统的串口设置菜单中设定波特率。支持的波特率通常包括300、1200、2400等常见的波特率。用户可以根据实际需要选择适合的波特率。 总而言之,Raspberry Pi 4B支持的波特率包括300字,用户可以根据实际需求选择适合的波特率来与外部设备进行串口通信。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值