Arm Qt 实战一:简单使用Arm设备的串口

2023-05-16

1、Arm串口驱动程序

创建Serial类:serial.h、serial.cpp

#include "serial.h"
#include <QDebug>

#define printf qDebug

Serial::Serial()
{
}
bool Serial::opend(QString dev,BAUD_RATE buad,char nEvent)
{
    fd = open(dev.toLocal8Bit().data(), O_RDWR);
    if(fd < 0)
    {
        printf("open device = %s false!!",dev.toLatin1().data());
        return false;
    }
    else
    {
        printf("open device = %s ok!!",dev.toLatin1().data());
        switch(buad)
        {
            case BAUD115200:
                printf("open set baud rate = 115200");
                init(fd, B115200, &sendFd, &reciveFd);
            break;
            case BAUD38400:
                printf("open set baud rate = 38400");
                init(fd, B38400, &sendFd, &reciveFd);
            break;
            case BAUD19200:
                printf("open set baud rate = 19200");
                init(fd, B19200, &sendFd, &reciveFd);
            break;
            case BAUD9600:
                printf("open set baud rate = 9600");
                init(fd, B9600, &sendFd, &reciveFd);
            break;
        }
        return true;
    }
}
void Serial::closed()
{
    close(fd);
}

bool Serial::init(int i_fd, speed_t i_baud, fd_set* i_sendSet, fd_set* i_rcvSet)
{
    int i;

    struct termios newtio;

    printf("init");

    FD_ZERO(i_rcvSet);									// Çå¿Õ´®¿Ú½ÓÊն˿ڼ¯
    FD_ZERO(i_sendSet);									// Çå¿Õ´®¿Ú·¢ËͶ˿ڼ¯
    FD_SET(i_fd,i_rcvSet);								// ÉèÖô®¿Ú½ÓÊն˿ڼ¯
    FD_SET(i_fd,i_sendSet);								// ÉèÖô®¿Ú·¢ËͶ˿ڼ¯

    bzero(&newtio, sizeof(newtio));
    tcgetattr(i_fd, &newtio);							// µÃµ½µ±Ç°´®¿ÚµÄ²ÎÊý
    cfsetispeed(&newtio, i_baud);						// ÉèÖÃÊäÈ벨ÌØÂÊÉè
    cfsetospeed(&newtio, i_baud);						// ÉèÖÃÊä³ö²¨ÌØÂÊÉè
    newtio.c_cflag |= (CLOCAL | CREAD);					// ʹÄܽÓÊÕ²¢Ê¹Äܱ¾µØ״̬
    newtio.c_cflag &= ~PARENB;							// ÎÞУÑé 8λÊý¾Ýλ1λֹͣλ
    newtio.c_cflag &= ~CSTOPB;
    newtio.c_cflag &= ~CSIZE;
    newtio.c_iflag &= ~(ICRNL | IXON);
    newtio.c_cflag |= CS8;
    newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);	// ԭʼÊý¾ÝÊäÈë
    newtio.c_oflag &= ~(OPOST);

    newtio.c_cc[VTIME]    = 0;   						// ÉèÖõȴýʱ¼äºÍ×îС½ÓÊÕ×Ö·ûÊý
    newtio.c_cc[VMIN]     = 0;

    tcflush(i_fd, TCIFLUSH);							// ´¦Àíδ½ÓÊÕµÄ×Ö·û
    tcsetattr(i_fd,TCSANOW,&newtio); 					// ¼¤»îÐÂÅäÖÃ

    //this->start();
}

bool Serial::writed(char *data,int len)
{
    write(fd, data, len);
}
bool Serial::writed(char *data)
{
    write(fd, data, sizeof(data));
}

int Serial::readData(unsigned char *data,int len)
{
    return read(fd,data,len);
}

int Serial::readData(char *data,int len)
{
    int ret = read(fd,data,len);
    return ret;
}


#ifndef SERIAL_H
#define SERIAL_H

#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <linux/types.h>
#include <linux/fb.h>
#include <stdio.h>
#include <sys/wait.h>
#include <pthread.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <unistd.h>
#include <time.h>
#include <termios.h>
#include <sys/select.h>

#include <QString>
#include <QThread>

class Serial
{
public:
    Serial();

    enum BAUD_RATE
    {
        BAUD115200,
        BAUD38400,
        BAUD19200,
        BAUD9600,
    };


    bool opend(QString dev,BAUD_RATE buad,char nEvent);
    bool init(int i_fd, speed_t i_baud, fd_set* i_sendSet, fd_set* i_rcvSet);
    void closed();
    bool writed(char *data,int len);
    bool writed(char *data);
    int readData(unsigned char *data,int len);
    int readData(char *data,int len);

private:
    int fd;
    char writeBuf[50];
    char reciveBuf[50];
    fd_set sendFd,reciveFd;
    void debug(QString str);
};

#endif // SERIAL_H

2、使用Serial操作串口

创建一个Rs485sender线程类,操作Serial进行数据的发送

rs485sender.cpp

#include "rs485sender.h"
#include <stdio.h>
#include <stdlib.h>

Rs485sender::Rs485sender(QObject *parent) :
    QThread(parent)
{
    com = new Serial();
    com->opend("/dev/ttyO1",Serial::BAUD115200,'n');

    moveToThread(this);
    this->start();
}
void Rs485sender::run()
{
    printf("Rs485sender::run\r\n");
    char comInput[100];

    while(true)
    {
        this->msleep(1000);
        memset(comInput,0,sizeof(comInput));
        QString comCmd = "send com2";
        com->writed(comCmd.toLatin1().data(),comCmd.length());
       printf("Rs485sender::send ----- \r\n");
    }
}

rs485sender.h

#ifndef RS485SENDER_H
#define RS485SENDER_H


#include <QThread>
#include <QtCore>
#include <QString>
#include <QMap>
#include <QMutex>
#include <QTimer>

#include "../../util/serial.h"

class Rs485sender : public QThread
{
    Q_OBJECT
public:
    explicit Rs485sender(QObject *parent = 0);

private:
    QMutex qmutex;
    Serial *com;

protected:
    void run();
    QString getValue(QString in,QString cut);
    void deal(char *in,int len);

signals:

public slots:

};

#endif // RS485SENDER_H

创建Rs485resver1进行数据的接收

rs485resver1.cpp

#include "rs485resver1.h"
#include <stdio.h>
#include <stdlib.h>

Rs485resver1::Rs485resver1(QObject *parent) :
    QThread(parent)
{
    com = new Serial();
    com->opend("/dev/ttyO3",Serial::BAUD115200,'n');

    moveToThread(this);
    this->start();
}
void Rs485resver1::run()
{
    printf("Rs485resver1::run\r\n");
    char comInput[100];

    while(true)
    {
        this->msleep(1000);
        memset(comInput,0,sizeof(comInput));
//        String com1Cmd = "read com2";
        //com1Input->writed(com1Cmd.toLatin1().data(),com1Cmd.length());
        int len = com->readData(comInput,sizeof(comInput));
        printf("Rs485resver1::%s \r\n",comInput);
    }
}

rs485resver1.h

#ifndef RS485RESVER1_H
#define RS485RESVER1_H


#include <QThread>
#include <QtCore>
#include <QString>
#include <QMap>
#include <QMutex>
#include <QTimer>

#include "../../util/serial.h"

class Rs485resver1 : public QThread
{
    Q_OBJECT
public:
    explicit Rs485resver1(QObject *parent = 0);

private:
    QMutex qmutex;
    Serial *com;

protected:
    void run();
    QString getValue(QString in,QString cut);
    void deal(char *in,int len);

signals:

public slots:

};

#endif // RS485RESVER1_H

Main方法中调用

    Rs485resver1 *rs485resver1;
    Rs485resver2 *rs485resver2;
    Rs485sender *rs485sender;
    
    /*485总线测试*/
    rs485resver1 = new Rs485resver1();
    rs485resver2 = new Rs485resver2();
    rs485sender = new Rs485sender();

3、ARM设备进行线缆连接

1、将板卡上的485线缆进行连接,串口1的A和串口2的A连接,串口1的B和串口2的B连接,485不是AB交叉连接的,A对A,B对B
2、我的板卡有4个485口,我使用了1个发送,2个接收。

4、运行代码测试:

可以看到,Rs485sender发送数据Rs485resver1、Rs485resver2收到数据。

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Arm Qt 实战一:简单使用Arm设备的串口 的相关文章

  • java中ISO8601标准时间格式的转换

    日期格式转换yyyy MM dd 39 T 39 HH mm ss SSSXXX yyyy MM dd 39 T 39 HH mm ss SSSZ TO yyyy MM dd HH mm ss 2020 04 09T23 00 00 000
  • centos 解决 -bash: shasum: command not found

    root 64 c1 src ll total 95624 rw r r 1 root root 97914519 Oct 2 21 58 elasticsearch 6 4 2 tar gz rw r r 1 root root 156
  • powershell中压缩与解压缩zip文件的问题

    powershell压缩与解压缩zip文件 powershell一些小使用技巧能在开发过程中带来便捷 powerShell v5 以前 这里先介绍powershell v5之前的做法 xff1a 1 解压缩zip function Unzi
  • Kotlin 在Android使用问题

    1 kotlin与Databinding的使用出现 Unresolved reference ActivityMainBinding 的错误 解决方案 xff1a app build kapt generateStubs 61 span c
  • spring框架

    关于spring的说法错误的是 xff08 D xff09 A spring是一个轻量级Java EE的框架集合 B spring的 依赖注入 模式的实现 C 使用spring可以实现声明事务 D spring提供了AOP方式的日志系统 解
  • NSAttributedString用法简介,控制文字颜色,背景色等属性

    NSAttributedString用来管理字符串以及和字符串相关的属性 下面的代码是根据字符范围设置label的text的颜色 UIFont font 61 UIFont systemFontOfSize 14 0 行间距和字体 NSDi
  • AVStream AVCodecContext AVCodec

    AVStream 表示成一个流媒体 xff0c 每个AVStream对应一个AVCodecContext xff0c 存储该音视频流使用解码器的相关数据 xff0c 每个AVCodecContext中对应一个AVCodec 包含该音视频的解
  • 2022 年 GIS 就业状况

    2022 年 GIS 就业状况 我们生活在数字时代 xff0c 通过进行在线研究选择我们的道路 xff0c 比如选择假期 选择大学或追求职业 如果您正在考虑进入 GIS 领域或在 GIS 领域进一步发展 xff0c 那么这份报告一定会有所帮
  • 在Keyguard锁屏上面可弹出Toast消息的方法

    通过调用toast的getWindowParams方法获取toast的WindowParams xff0c 再设置允许在锁屏之上显示的window flag FLAG SHOW WHEN LOCKED 参考代码如下 Toast mToast
  • vsftpd的参数说明和虚拟用户配置

    vsftpd配置文件详解 1 默认配置 xff1a 1 gt 允许匿名用户和本地用户登陆 anonymous enable 61 YES local enable 61 YES 2 gt 匿名用户使用的登陆名为ftp或anonymous x
  • gradle 插件版本、gradle版本 和buildToolsVersion之间的对应关系

    一 主要概念 1 Gradle是什么 xff1f Gradle其实就是一个构建项目的工具 xff0c 即把一堆堆的目录 文件按照一定的规则关联起来 xff0c 形成一个项目的自动化构建工具 Gradle版本 如 xff1a gradle 5
  • 学神的“诞生”-2014清华大学本科生特等奖学金答辩观后感

    清华的特奖与交大的竢实扬华 偶然间在学堂在线上留意到有这样的一场现场答辩 xff0c 很想知道最高学府的最高荣誉花落谁家 xff0c 得此殊荣的又是些怎样的 学神 xff0c 几点感受记录之 1 经历 gt gt 证书 清华的学生更注重大学
  • nexus3.14.0版本linux环境安装、启动、搭建私库

    本文介绍的是nexus3 14 0版本在linux环境下安装 启动 搭建私库 nexus3以上的版本太新了 xff0c 网上很少介绍安装细节的 据了解和2 X版本有所不同了 1 前提 linux机器上需先安装好jdk xff0c 并且配置好
  • CentOS7安装MariaDB以及编码注意事项

    1 安装并启动MariaDB span class hljs preprocessor 先更新一下 span yum upgrade span class hljs preprocessor 安装 span yum y install ma
  • c++多线程 (生产者消费者问题)

    针对多线程中常见的生产者消费者问题 xff0c 封装了一个类 xff0c 和测试代码 xff0c 方便日后直接套用 具体来说就是多线程使用时候经常遇到的 一个线程取数据 xff0c 一个处理数据 xff0c 一个保存或传递数据 的情况 简单
  • 看技术书籍坚持不下来的,看这里,记录增量学习法

    今天 xff0c 在阅读 软技能 代码之外的生存指南 这本书的过程中 xff0c 学习到了番茄工作法 定额工作法 xff0c 受此启发 xff0c 突然脑海里冒出了一个方法论 xff0c 这是我独创的一个学习方法论 xff0c 我把它称作
  • Android native内存泄露排查总结

    Android开发通常涉及java层 native xff08 c c 43 43 xff09 下的开发 xff1b 内存的泄露也可以分为dalvik和native两种 xff1b java层的通常叫好分析 xff0c 可以借助heapdu
  • 分享一个手游脚本源码

    目的 给大家接触手游模拟脚本的一个样板 xff0c 支持多分辨率适配 脚本功能为批量送体力给好友 xff0c 功能简单 源码 lua span class token comment 版本 span span class token com
  • crackme例子2

    样本 jadx clacSnFuntion jni函数 xff0c ida分析 关键位置函数一片红色 xff0c 可能有动态加解密 如果不分析具体解密算法 xff0c 可内存dump解密后整个so frida如下 xff1a span cl
  • 8本游戏开发书籍推荐

    很多刚刚接触游戏开发的朋友经常问我 xff1a 如何开始学习游戏开发 xff1f 我从事游戏开发行业很多年了 xff0c 坦率地讲 xff0c 开发游戏充满挑战性 xff0c 需要开发人员具备大量的技能与积极的创新精神 希望这篇小文能帮助朋

随机推荐

  • win10编译scrcpy详解

    环境配置 安装MSYS2 安装后打开msys终端 xff0c 运行如下命令 span class token comment runtime dependencies span pacman S mingw w64 x86 64 SDL2
  • windows编译安卓源码记录

    环境 Windows10 43 vmware17 43 ubuntu22 ubuntu环境设置 装完ubuntu系统后拖拽复制文件进去验证vmtools功能情况 xff0c 如果vmtools异常很麻烦 xff0c 试了n多方法 xff0c
  • adb执行多条连续cmd命令

    你可以试一下下面的方法 xff1a 64 echo off echo su gt temp txt echo 其它命令 gt gt temp txt adb shell lt temp txt del temp txt 普通情况 xff0c
  • java代码混淆

    什么是代码混淆 Java 是一种跨平台的 解释型语言 xff0c Java 源代码编译成中间 字节码 存储于 class 文件中 由于跨平台的需要 xff0c Java 字节码中包括了很多源代码信息 xff0c 如变量名 方法名 xff0c
  • nm命令 查看符号文件

    nm命令介绍的很多 xff0c 但大多不介绍其函数符号标志的含义 最近在调试动态库时常用到 xff0c 其中用的最多的用法 nm A grep aaa c 43 43 filt A 为了显示文件 xff0c c 43 43 filt转换为可
  • 把1-9这9个数字按从小到大的顺序排列 ,中间添上“+”和“-“,““,可以计算的结果等于100的程序

    Talk is cheap show me the code 穷举法 计算次数 3 8 61 6561 输出等于100的结果 arr 61 1 2 3 4 5 6 7 8 9 flag 61 34 43 34 34 34 34 34 fun
  • 安卓某Q协议分析

    直接进入主题 主要数据包 renamed from oicq wlogin sdk request l 抓包数据分析 oicq wlogin sdk request request TGTGT 这个类 tlv18 包数据 001800160
  • pyinstaller打包

    virtualenv pip span class token function install span virtualenv pipenv xff08 官方推荐 xff09 pip span class token function i
  • sudo apt-get update 报错:E: Problem executing scripts APT::Update::Post-Invoke-Success 'if /usr/bin/te

    Ubuntu 更换源后 xff0c 使用命令更新源 xff0c 出现报错 xff0c 解决办法 今天在装完ubuntu系统后 xff0c 更换了阿里源 xff0c 使用sudo apt get update命令更新源 出现如下错误 xff1
  • 基于线程池的生产者消费者模型(含阻塞队列)

    一 线程池 二 模型实现 1 准备工作 2 创建线程 3 PushTask函数 4 PopTask函数 5 线程执行函数Routines 三 模型测试 一 线程池 和内存池一样 xff0c 线程池也是为了提升效率 一个服务器可能短时间会接收
  • 意图识别资料纪录

    今天搞意图识别貌似这个资料的介绍很不错 不知道怎么转载 xff0c 放到这https blog csdn net zengNLP article details 94657099
  • 在C#中 麦克风录音数据float [] 转byte [] 的方法

    public static byte AudioFloat2Byte float floatData float samples 61 floatData audio clip GetData samples 0 short intData
  • redis 是个啥后续--Redis 数据缓存和消息队列

    用python写了一个Redis 的数据缓存和消息队列的例子 xff0c 代码没有在这里传 xff0c 有想看的去Github 上吧 xff0c 有什么问题别赖我 xff0c 在这个领域我知道的也就这么多了 xff0c 后续还有更深的研究的
  • 第二天-模板简单修改(基于t3-bs3-blank模板)

    最近做joomla网站由于客户要求首页内容比较特殊 xff0c 但是现有的模板块布局又不符合要求 xff0c 没办法只能硬着头皮上 改代码 xff0c 修改代码前请先备份 xff01 xff01 xff01 手中有一个T3的模板 xff0c
  • 设置开机软件启动的方法

    前两天要设置自己公司研发的软件设备的开机启动 从网上找到的如下方法 环境win10 xff0c win7都适用 第一步 快捷键 meta 43 R 也就是键盘上win 43 R 调出运行 第二步 在运行中输入 shell startup 然
  • unity中使用httppost的两种方式

    最近需要在unity中使用http post的方式传递消息 xff0c 所以做一下记录吧 1 unity自己的www 方式 因为我传递的消息是json字符串所以前期的工作就是 拼字符串然后通过litjson或者newtonsoft json
  • python 调用百度云端人脸搜索

    python 调用百度云端人脸搜索1 xff1a N 进行人脸搜索的方法 xff08 从已有的库中搜索当前人脸id xff09 不多述 xff0c 直接上代码 环境是Ubuntu16 04 43 Python3 coding utf 8 i
  • Python3 +opencv 调用摄像头拍照保存

    配置好的pycharm环境 xff0c 配的是Python3 5 opencv4 1 上代码 xff1a import cv2 import sys def getImage index path cap 61 cv2 VideoCaptu
  • 通用方法 由于找不到vcruntime140_1.dll,无法继续执行代码

    问题场景描述 xff1a RDM安装完成后 xff0c 打开不了应用程序 xff0c 提示 由于找不到vcruntime140 1 dll 无法继续执行代码 解决方案 xff1a 这是因为缺少了对应的动态链接库 ddl文件 跟应用程序无关
  • Arm Qt 实战一:简单使用Arm设备的串口

    1 Arm串口驱动程序 创建Serial类 xff1a serial h serial cpp span class token macro property span class token directive keyword inclu