嵌入式Linux串口通信

news2024/12/22 9:32:33

嵌入式板子就和普通用的单片机比如stm32开发板,51开发板差不多,他们的串口都很类似,都是直接连上然后在PC机器上用串口软件打开就好了。
我使用的嵌入式开发板上面有8个rs485串口,2个rs232串口以及一个网口,刚开始开发板连接成功后,使用命令

ls /dev/ttyUSB*

在这里插入图片描述

显示出所有的串口,这些串口能够使用的前提是你必须连接好硬件,我刚开分配了一个RS232串口用作调试,用SecureCRT上连接了网口和RS232的串口用作终端连接开发板,以为这样就可以实现开发板给XCOM串口软件发送消息,我还试着以为用在PC端口使用vspd虚拟两个端口,一个com1,一个com2,然后理所当然认为com2映射到了ttyUSB2,但是这样是错误的,因为你硬件连接的都不对,这一点困扰了我很久,正确的是那8个RS485串口对应了ttyUSB1-8,通过usb转RS485连接开发板和电脑,编写然后用XCOM打开串口就直接可以通信了。
代码如下:

#include <sys/time.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h> //标准函数库定义
#include <unistd.h> //unix标准函数定义
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> //文件控制定义
#include <termios.h> //POSIX终端控制定义

#define BUF   "hello world!"
int main(int argc, char **argv)
{
        int fd = -1;
        int rv = -1;


        struct termios options;//该结构体包含串口的选项
        /*struct termios
         {
            tcflag_t  c_iflag;  //输入选项
            tcflag_t  c_oflag;  //输出选项
            tcflag_t  c_cflag;  //控制选项
            tcflag_t  c_lflag;  //行选项
            cc_t      c_cc[NCCS]; //控制字符
         }*/



        fd = open("/dev/ttyUSB3",O_RDWR|O_NOCTTY|O_NDELAY);//打开串口设备
        if(fd < 0)
        {
                printf("open uart failure:%s\n",strerror(errno));
                close(fd);
                return -1;
        }

        printf("open uart successfuly\n");

        memset(&options, 0, sizeof(options));

        rv = tcgetattr(fd, &options);//获取原有的串口属性的配置

        if(rv != 0 )
        {
                printf("tcgetattr failure:%s\n", strerror(errno));
                return -2;
        }
        options.c_cflag|=(CLOCAL|CREAD);//CREAD开启串行数据接收,CLOCAL并打开本地连接模式
        //options.c_cflag &= ~(ECHO |ICANON |ECHOE); 
        options.c_cflag &= ~CSIZE;//先使用CSIZE做位屏蔽
        options.c_cflag |= CS8;//设置8位数据位
        options.c_cflag &= ~PARENB;//无校验位

        /*设置115200波特率*/
        cfsetispeed(&options,B115200);//设置输入波特率
        cfsetospeed(&options,B115200);//设置输出波特率

        options.c_cflag &= ~CSTOPB;//设置一位停止位

        options.c_cc[VTIME] = 0;//非规范模式读取时的超时时间
         options.c_cc[VMIN] = 0;//非规范模式读取时的最小字符数

        tcflush(fd, TCIFLUSH);

        rv=tcsetattr(fd, TCSANOW, &options);//设置终端的属性
        if(rv != 0)
        {
                printf("tcsetattr failure:%s\n",strerror(errno));
                close(fd);
                return -3;
        }

        while(1)
        {

                rv = write(fd, BUF,strlen(BUF)) ;
                if(rv < 0)
                {
                        printf("write error:%s\n",strerror(errno));
                        close(fd);
                }
                printf("%s\n", BUF);

                sleep(3);
        }

       close(fd);
        return 0;
}

现象:
在这里插入图片描述

另外的是PC上的XCOM给开发板发消息,开发板处于一直空等状态只有当收到消息后然后打印出这条信息

#include <sys/time.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h> //标准函数库定义
#include <unistd.h> //unix标准函数定义
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> //文件控制定义
#include <termios.h> //POSIX终端控制定义

#define BUF_SIZE 1024

int main(int argc, char **argv)
{
    int fd = -1;
    int rv = -1;
    char buf[BUF_SIZE];

    struct termios options;

    fd = open("/dev/ttyUSB3", O_RDWR | O_NOCTTY);
    if (fd < 0)
    {
        printf("open uart failure:%s\n", strerror(errno));
        close(fd);
        return -1;
    }

    printf("open uart successfuly\n");

    memset(&options, 0, sizeof(options));

    rv = tcgetattr(fd, &options);
    if (rv != 0)
    {
        printf("tcgetattr failure:%s\n", strerror(errno));
        return -2;
    }
    options.c_cflag |= (CLOCAL | CREAD);
    options.c_cflag &= ~CSIZE;
    options.c_cflag |= CS8;
    options.c_cflag &= ~PARENB;
    cfsetispeed(&options, B115200);
    cfsetospeed(&options, B115200);
    options.c_cflag &= ~CSTOPB;
    options.c_cc[VTIME] = 0; // 设置超时为0,表示无限等待
    options.c_cc[VMIN] = 1;  // 至少读取一个字符

    tcflush(fd, TCIFLUSH);

    rv = tcsetattr(fd, TCSANOW, &options);
    if (rv != 0)
    {
        printf("tcsetattr failure:%s\n", strerror(errno));
        close(fd);
        return -3;
    }

    while (1)
    {
        rv = read(fd, buf, BUF_SIZE);
        if (rv < 0)
        {
            printf("read error:%s\n", strerror(errno));
            close(fd);
            return -4;
        }
        else if (rv == 0)
        {
            printf("No data received\n");
        }
        else
        {
            buf[rv] = '\0'; // 添加字符串结束符
            printf("Received message: %s\n", buf);
        }
    }

    close(fd);
    return 0;
}


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1602570.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录算法训练营第三十七天| LeetCode 738.单调递增的数字、总结

一、LeetCode 738.单调递增的数字 题目链接/文章讲解/视频讲解&#xff1a;https://programmercarl.com/0738.%E5%8D%95%E8%B0%83%E9%80%92%E5%A2%9E%E7%9A%84%E6%95%B0%E5%AD%97.html 状态&#xff1a;已解决 1.思路 如何求得小于等于N的最大单调递增的整数&#xff1f;98&am…

<计算机网络自顶向下> 多路复用与解复用

多路复用/解复用 端口号区分进程到进程多路解复用工作原理 解复用作用&#xff1a;TCP或者UDP实体采用哪些信息&#xff0c;将报文段的数据部分交给正确的socket&#xff0c;从而交给正确的进程主机收到IP数据报 每个数据报有源IP地址和目标地址每个数据报承载一个传输层报文段…

C++从入门到精通——const与取地址重载

const与取地址重载 前言一、const正常用法const成员函数问题const对象可以调用非const成员函数吗非const对象可以调用const成员函数吗const成员函数内可以调用其它的非const成员函数吗非const成员函数内可以调用其它的const成员函数吗总结 二、取地址及const取地址操作符重载概…

PPTX与PPT文件有什么区别?这2个办公技巧一定要知道!

每一次点击鼠标&#xff0c;每一次敲击键盘&#xff0c;我们都在与各种软件进行互动。其中&#xff0c;PPTX 和 PPT 无疑是职场中最常见的两种办公文档格式。那么&#xff0c;你是否清楚 PPTX 和 PPT 这两者之间的区别呢&#xff1f; 或许你会说&#xff0c;这不过是文件后缀名…

通过抖音短视频获客 只需要六步

抖音是当前最受欢迎的短视频平台之一&#xff0c;拥有庞大的用户群体和强大的社交矩阵&#xff0c;已经成为企业打造品牌口碑和快速获客的一种有效方式。那么&#xff0c;如何利用抖音短视频快速获客&#xff0c;打造品牌口碑呢&#xff1f;小马识途营销顾问简要分析如下&#…

【已解决】html页面刷新后css样式消失

登录失败后显示主页面时样式消失&#xff0c;如&#xff1a; 原因&#xff1a;index的样式引入css前面没有加斜杠 解决办法&#xff1a;添加斜杠 <link th:href"{/asserts/css/bootstrap.min.css}" rel"stylesheet"><link th:href"{/a…

【Git教程】(十四)基于特性分支的开发 — 概述及使用要求,执行过程及其实现,替代方案 ~

Git教程 基于特性分支的开发 1️⃣ 概述2️⃣ 使用要求3️⃣ 执行过程及其实现3.1 创建特性分支3.2 在 master 分支上集成某一特性3.3 将 master 分支上所发生的修改传递给特性分支 4️⃣ 替代方案4.1 直接在部分交付后的合并版本上继续后续工作4.2 到发行版即将成型时再集成特…

AI实践与学习4_大模型之检索增强生成RAG实践

背景 针对AI解题业务场景&#xff0c;靠着ToT、CoT等提示词规则去引导模型的输出答案&#xff0c;一定程度相比Zero-shot解答质量更高&#xff08;正确率、格式&#xff09;等。但是针对某些测试CASE&#xff0c;LLM仍然不能输出期望的正确结果&#xff0c;将AI解题应用生产仍…

Python接口自动化 —— Web接口!

1.2.1 web接口的概念 这里用一个浏览器调试工具捕捉课程管理页面请求作为例子&#xff1a; 当请求页面时&#xff0c;服务器会返回资源&#xff0c;将协议看做是路的话&#xff0c;http可以看做高速公路&#xff0c;soap看做铁路传输的数据有html&#xff0c;css&#xff0…

新游戏-开箱H5游戏【无限贝拉/疯狂骑士团】最新整理Linux手工服务端+详细搭建教程

小编教大家搭建游戏啦 一款H5奉上 先上图 然后再看教程 90GM基地&#xff1a;www.t1gm.com 默认解压密码&#xff1a;www.t1gm.com 本教程只限于技术研究使用&#xff0c;请勿用于商业用途。 本资源由90GM基地独家提供 90GM基地交流群&#xff1a;639140260 ★★★★…

Vue2 —— 学习(七)

目录 一、TodoList 案例&#xff08;第一版&#xff09; &#xff08;一&#xff09;组件化编码流程 1.实现静态组件 2.显示动态数据 &#xff08;二&#xff09;增加元素 &#xff08;三&#xff09;多选框状态确定 &#xff08;四&#xff09;删除元素 &#xff08;五…

Boost电感的作用

Boost电感在Boost升压电路中起着关键的作用。Boost电路是一种DC-DC电源转换器&#xff0c;其主要功能是将低电压直流&#xff08;DC&#xff09;信号转换为高电压直流&#xff08;DC&#xff09;信号。Boost电感在这个过程中起着平滑电流、储存能量和提高电路效率的作用。 具体…

【yolo数据集合并方法】

yolo数据集合并方法 1.数据集容2.数据集合并 1.数据集容 包含训练集、验证集和测试集。 每一个数据集中包含图像文件夹和标签文件夹。 yaml文件中定义了配置参数&#xff0c;包括目标识别的class类别&#xff1a; 2.数据集合并 需要修改labels文件夹下txt文件class信息&…

Vision Pro 零基础教程:1.机器视觉概述

文章目录 机器视觉简介机器视觉的发展历史机器视觉的结构组成机器视觉的应用工业相机分类1. 按传感器类型分类&#xff1a;2. 按分辨率分类&#xff1a;3. 按扫描方式分类&#xff1a;4. 按输出信号类型分类&#xff1a;5. 按应用领域分类&#xff1a;6. 按接口类型分类&#x…

TLS v1.3 导致JetBrains IDE jdk.internal.net.http.common CPU占用高

开发环境 GoLand版本&#xff1a;2022.3.4 问题原因 JDK 中的 TLS v1.3 实现引起 解决办法 使用 SOCKS 代理代替HTTP代理 禁用 Space 和 Code With Me 插件 禁用 TLS v1.3&#xff0c;参考&#xff1a;https://stackoverflow.com/questions/54485755/java-11-httpclient-…

IEDA 的各种常用插件汇总

目录 IEDA 的各种常用插件汇总1、 Alibaba Java Coding Guidelines2、Translation3、Rainbow Brackets4、MyBatisX5、MyBatis Log Free6、Lombok7、Gitee IEDA 的各种常用插件汇总 1、 Alibaba Java Coding Guidelines 作用&#xff1a;阿里巴巴代码规范检查插件&#xff0c;…

Spring-dataSource事务案例分析-使用事务嵌套时,一个我们容易忽略的地方

场景如下&#xff1a; A_Bean 中的方法a()中调用B_Bean的b();方法都开启了事务&#xff0c;使用的默认的事务传递机制&#xff08;即&#xff1a;属于同一事务&#xff09;&#xff1b; 如下两种场景会存在较大的差异&#xff1a; 在b()方法中出现了异常&#xff0c;在b()中进…

只用键盘的技巧

技巧一&#xff1a;将常用软件固定在任务栏使用winnum/winT(shift)打开 技巧二&#xff1a;winX快捷键&#xff08;显示快捷键的快捷键&#xff09; ALT F4    关闭当前应用程序 技巧三&#xff1a;使用好Chrome快键键 ctrl h&#xff1b;历史纪录。 ctrl shift esc&am…

致远互联FE协作办公平台 editflow_manager.jsp 存在SQL注入漏洞

0x01 免责声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;作者不为此承担任何责任。工具来自网络&#xff0c;安全性自测&#xff0c;如有侵权请联系删…

多ip证书实现多个ip地址https加密

在互联网快速发展的现在&#xff0c;很多用户会使用由正规数字证书颁发机构颁发的数字证书&#xff0c;其中IP数字证书就是只有公网IP地址网站的用户用来维护网站安全的手段。由于域名网站比较方便记忆&#xff0c;只有公网IP地址的网站是很少的&#xff0c;相应的IP数字证书产…