浅谈linux下的串口通讯开发

浅谈 Linux 下的串口通讯开发

什么是串口通讯

在计算机与外设通讯中,串口通讯是一种老而弥坚的通讯方式,它通过一组简单的信号线传输数据,它能够对应用上出现的许多通讯问题提供精确、不出错的通讯解决方案。

Linux 中的串口通讯

在 Linux 中,串口通讯也被广泛应用于硬件与软件的沟通连接中。Linux 操作系统提供了开源的串口通讯库,可以方便的对串口进行编程。

串口通讯的参数设置

在编写串口通讯代码时,需要设置好串口的一些参数,包括波特率、校验位、数据位、停止位。在 Linux 中,我们可以通过系统的 API 来设置这些参数。

/* 打开串口 */
int fd = open("/dev/ttyUSB0", O_RDWR);
if(fd < 0){
    printf("Failed to open /dev/ttyUSB0!\n");
    return -1;
}

/* 配置串口 */
struct termios opt;
tcgetattr(fd, &opt);
opt.c_cflag |= (CLOCAL | CREAD);
opt.c_cflag &= ~CSIZE;
opt.c_cflag |= CS8;
opt.c_cflag &= ~PARENB;
opt.c_cflag &= ~CSTOPB;
opt.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
opt.c_iflag &= ~(OPOST | ONLCR | OCRNL);
opt.c_oflag &= ~(INLCR | ICRNL);
cfsetispeed(&opt, B9600);
cfsetospeed(&opt, B9600);
tcsetattr(fd, TCSANOW, &opt);

Linux 中的串口通讯实例

串口发送数据

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>

int main(int argc, char **argv)
{
    int fd;
    int n;
    int i;
    char buff[] = "Hello World!";
    fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);
    if(fd < 0)
    {
        printf("open /dev/ttyUSB0 fail!\n");
        return -1;
    }
    struct termios opt;
    tcgetattr(fd, &opt);
    cfsetispeed(&opt, B9600);
    cfsetospeed(&opt, B9600);
    opt.c_cflag &= ~CSIZE;
    opt.c_cflag |= CS8;
    opt.c_cflag &= ~PARENB;
    opt.c_cflag &= ~CSTOPB;
    opt.c_cflag &= ~CRTSCTS;
    opt.c_cflag |= CLOCAL | CREAD;
    opt.c_iflag |= IGNPAR | ICRNL;
    opt.c_iflag &= ~(IXON | IXOFF | IXANY);
    opt.c_oflag &= ~OPOST;
    opt.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
    opt.c_cc[VMIN] = 0;
    opt.c_cc[VTIME] = 1;
    tcsetattr(fd, TCSANOW, &opt);
    n = write(fd, buff, sizeof(buff));
    if(n < 0)
    {
        printf("write error!\n");
        return -1;
    }
    close(fd);
    return 0;
}

串口接收数据

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>

#define MAXSIZE 1024

int main(int argc, char **argv)
{
    int fd;
    int n;
    int i;
    char buf[MAXSIZE];
    fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);
    if(fd < 0)
    {
        printf("open /dev/ttyUSB0 fail!\n");
        return -1;
    }
    struct termios opt;
    tcgetattr(fd, &opt);
    cfsetispeed(&opt, B9600);
    cfsetospeed(&opt, B9600);
    opt.c_cflag &= ~CSIZE;
    opt.c_cflag |= CS8;
    opt.c_cflag &= ~PARENB;
    opt.c_cflag &= ~CSTOPB;
    opt.c_cflag &= ~CRTSCTS;
    opt.c_cflag |= CLOCAL | CREAD;
    opt.c_iflag |= IGNPAR | ICRNL;
    opt.c_iflag &= ~(IXON | IXOFF | IXANY);
    opt.c_oflag &= ~OPOST;
    opt.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
    opt.c_cc[VMIN] = 0;
    opt.c_cc[VTIME] = 1;
    tcsetattr(fd, TCSANOW, &opt);
    while(1)
    {
        n = read(fd, buf, MAXSIZE);
        if(n > 0)
        {
            buf[n] = '\0';
            printf("read %d bytes: %s\n", n, buf);
        }
    }
    close(fd);
    return 0;
}

总结

Linux 下的串口通讯开发需要设置好串口的参数,并使用 API 进行数据的读取和发送。本文介绍了两个实例,分别是串口数据发送和接收程序的编写。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈linux下的串口通讯开发 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • Tensorflow之梯度裁剪的实现示例

    下面是“Tensorflow之梯度裁剪的实现示例”的完整攻略。 什么是梯度裁剪? 梯度裁剪是一种常见的优化技巧,用于限制梯度的范围,避免梯度爆炸或消失。在深度学习中,梯度裁剪常用于RNN等网络中,比如LSTM、GRU等。 梯度裁剪的实现方法 Tensorflow提供了两种梯度裁剪的实现方式: 1. tf.clip_by_norm tf.clip_by_nor…

    人工智能概论 2023年5月25日
    00
  • 使用pytorch搭建AlexNet操作(微调预训练模型及手动搭建)

    使用PyTorch搭建AlexNet操作的完整攻略可以分为两部分:微调预训练模型和手动搭建。下面分别介绍这两个部分的具体操作过程和代码示例: 微调预训练模型 微调预训练模型旨在通过对一个已经在大型数据集上训练过的模型进行细调,来提高该模型在你自己的数据集上的表现。常见的预训练模型包括AlexNet、VGG、ResNet等。下面以AlexNet为例,介绍微调预…

    人工智能概论 2023年5月25日
    00
  • Python+Django+MySQL实现基于Web版的增删改查的示例代码

    下面是“Python+Django+MySQL实现基于Web版的增删改查的示例代码”的完整攻略。 第一步:安装环境和工具 首先,我们需要安装Python、Django和MySQL。具体步骤如下: 安装Python。Python的官网https://www.python.org/提供了下载和安装说明。安装完毕后,需要添加Python的执行路径到系统环境变量中。…

    人工智能概论 2023年5月24日
    00
  • .NET微服务架构CI/CD自动打包镜像

    下面是详细讲解“.NET微服务架构CI/CD自动打包镜像”的完整攻略: 1. 准备工作 在开始构建CI/CD流程之前,需要进行一些准备工作。首先需要具备以下条件:- 拥有一台运行Docker的服务器;- 安装了Git、Docker和Docker Compose等软件;- 编写好了微服务的代码,并将其存储在Git仓库中。 2. CI/CD流程构建 2.1 编写…

    人工智能概览 2023年5月25日
    00
  • 用vscode开发python的步骤详解

    下面是我为你详细讲解“用vscode开发python的步骤详解”的完整攻略: 用vscode开发Python的步骤详解 1. 下载安装VSCode 首先,你需要在官网(https://code.visualstudio.com/)下载并安装Visual Studio Code。安装过程中,你可以自行设置一些个性化选项(如语言、颜色主题等)。 2. 安装Pyt…

    人工智能概览 2023年5月25日
    00
  • 深入学习spring cloud gateway 限流熔断

    深入学习Spring Cloud Gateway 限流熔断攻略 什么是Spring Cloud Gateway Spring Cloud Gateway是一个构建在Spring Framework 5,Project Reactor和Spring Boot 2之上的网关,可以作为所有基于HTTP路由的API的入口点。它提供了一种简单而有效的方式来传递客户端请…

    人工智能概览 2023年5月25日
    00
  • jupyter 添加不同内核的操作

    下面是操作攻略: 1. 安装不同内核 在使用Jupyter之前,需要确保所需要的内核已经安装正确。常见的内核包括Python、R、Julia等,可以使用pip或conda进行安装。以Python为例,可以使用以下命令进行安装: pip install ipykernel # 安装ipykernel内核 ipython kernel install –nam…

    人工智能概览 2023年5月25日
    00
  • Python中暂存上传图片的方法

    下面是详细讲解Python中暂存上传图片的方法的完整攻略。 1. 前提条件 在进行任何操作之前,需要确保你已经安装了Python并且熟悉了基本的Python语法和操作。 2. 为什么要暂存上传图片? 在进行图片上传过程中,有些情况下需要对图片进行暂存处理,比如:- 验证图片是否符合规定要求- 对图片进行压缩处理- 将图片拆分成多个部分进行上传 3. Pyth…

    人工智能概论 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部