浅谈linux下的串口通讯开发

yizhihongxing

浅谈 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日

相关文章

  • Python pyecharts绘制条形图详解

    Python pyecharts绘制条形图详解 前言 本文主要介绍如何使用Python的pyecharts库来绘制条形图。pyecharts是一个简单易用的数据可视化Python库,支持多种图表类型。条形图是一种常用的图表类型,常用于对比各种数据。在本文中,我们将学习如何使用pyecharts库来创建条形图。 安装 在使用pyecharts之前,需要确保已经…

    人工智能概览 2023年5月25日
    00
  • python使用urlparse分析网址中域名的方法

    下面是详细的“Python使用urlparse分析网址中域名的方法”的攻略,包括: 一、什么是urlparse? urlparse是Python中一个用于解析URL地址的库,可以将URL地址解析成6个部分:协议、域名、路径、参数、查询参数和锚点。其中,我们可以通过urlparse获取其中的域名信息,常见用法如下: from urllib.parse impo…

    人工智能概览 2023年5月25日
    00
  • python实现从wind导入数据

    要在Python中从Wind导入数据,你需要遵循以下步骤: 步骤1:安装Wind API Wind API是与Wind Financial Terminal数据库交互的Python包。在使用Wind API之前,用户需要对Wind API进行安装。可以在以下网址下载Wind API安装程序:https://www.wind.com.cn/NewSite/da…

    人工智能概览 2023年5月25日
    00
  • pytorch中的weight-initilzation用法

    下面我将为您详细讲解pytorch中的weight-initilzation用法的完整攻略。 什么是weight initialization weight initialization指的是神经网络权重初始化的方法。在神经网络中,权重对于模型的训练和性能至关重要。适当的权重初始化可以加快训练速度,提高模型精度。 通常,我们可以采用随机初始化的方式来对神经网…

    人工智能概论 2023年5月25日
    00
  • iGame RTX 3090Ti显卡首测 性能再提10%!

    iGame RTX 3090Ti显卡首测 iGame RTX 3090Ti是一款性能非常强劲的显卡,它配备有NVIDIA的最新GPU技术,采用更先进的制造工艺,能够提供更高的运行速度和更流畅的游戏体验。下面是针对iGame RTX 3090Ti显卡的完整攻略: 硬件准备 要进行iGame RTX 3090Ti显卡的测试,我们需要先准备好以下硬件设备: 一台配…

    人工智能概览 2023年5月25日
    00
  • 详解Java日志正确使用姿势

    当我们在开发Java应用时,记录日志是非常重要的。它可以帮助开发人员和运维人员发现问题、排除故障,同时也使得我们对应用程序的运行情况有一个清晰的了解。然而,正确的使用Java日志需要一定的技术知识和实践经验。本篇攻略旨在介绍如何正确地使用日志,以及如何防止日志泄露和日志劫持等常见的安全问题。 一、选择合适的日志框架 Java提供了自己的日志框架,即Java …

    人工智能概览 2023年5月25日
    00
  • 可视化pytorch 模型中不同BN层的running mean曲线实例

    让我来为您详细讲解一下“可视化pytorch模型中不同BN层的running mean曲线实例”的攻略。 1. 什么是BatchNorm? BatchNorm,即Batch Normalization,是一种常用的深度学习网络加速和优化的技巧。BatchNorm可以对每一层的输入数据进行归一化,使得数据分布更加稳定,从而加速网络的训练过程。 2. BN层的r…

    人工智能概论 2023年5月25日
    00
  • 基于OpenCV自定义色条实现灰度图上色功能代码

    自定义色条是一个在图像处理中常用的功能,它可以把灰度图像上的灰度映射至不同的颜色上,从而实现更加直观的图像色彩表达。在OpenCV中可以基于LUT(Lookup Table)实现灰度图上色的功能,具体步骤如下: 创建颜色映射表LUT 首先需要创建一个颜色映射表LUT,这个LUT是一个256×1的彩色矩阵,它定义了当前灰度下的RGB颜色值,用于后续的灰度图像上…

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