- 博客(93)
- 资源 (21)
- 收藏
- 关注
原创 PN/EtherCAT耦合器级联系统异步问题深度排查报告——当“普鲁士蓝”遇见“工业红”的兼容性交响曲
问题场景描述:做PN耦合器硬件实验,目前测试国标三静电干扰下,模块掉线后可以恢复通讯,不再出现死机。但测试发现PN耦合器与EtherCAT耦合器级联IO模块,配置相同滤波参数后,实际效果不一致的情况,尝试在博途软件中编写梯形图测试,发现IO输出实际与博途梯形图执行不同步。:测PN耦合器TX vs EtherCAT RX延迟(正常<1µs!:换EtherCAT耦合器(如倍福EK1100),问题还在?:只连1个EtherCAT模块,同步正常吗?:按“最小公倍数”设计,拒绝打架!:所有设备跟主站节奏走!
2025-03-13 09:57:18
309
原创 EtherNet/IP协议学习指南与研究报告——从零开始成为工业通信“邮差”
从2001年至今,EIP靠着“标准兼容”(连西门子都低头)和“实时性强”(卷死PROFINET),稳坐工业通信C位。未来,随着5G和TSN(时间敏感网络)加入,EIP可能连“太空工厂”都能征服!
2025-03-12 15:17:38
621
原创 C++ std::atomic_flag实现自旋锁
原子操作就是在多线程程序中“最小的且不可并行化的”操作,就是说多个线程访问同一个资源时,有且仅有一个线程能对资源进行操作。在C++11之前,使用第三方API可以实现并行编程,比如pthread多线程库,但是在使用时需要创建互斥锁,以及进行加锁、解锁等操作来保证多线程对临界资源的原子操作,这无疑增加了开发的工作量。不过从C++11开始,C++从语言层面开始支持并行编程,内容包括了管理线程、保护共享数据、线程间的同步操作、低级原子操作等各种类。
2023-01-12 14:54:02
836
原创 VS2019+Opencv3.4+Win10配置详解
在环境变量的系统path中添加D:\soft\opencv3416\opencv\build\x64\vc15(根据下载路径不同替换)3、 VC++目录–>常规–>库目录中添加D:\soft\opencv3416\opencv\build\x64\vc15\lib。1、新建vs项目后选择“视图”->“其他窗口”->“属性管理器”配置Debug|x64。1、“链接器”->“高级”->“目标计算机”调整Debug配置为X64(可以不用)2、Debug|X64->属性->VC++目录->常规->包含目录。
2023-01-09 11:16:18
1973
1
原创 c++ std::funciona代替函数指针——结合std::bind
std::function是函数模板类(是一个类)。包含在#include 中。以前没有这个类的时候,我们在想定义一个回调函数指针,非常的麻烦。typedef void(*ptr)(int,int)// 这里的ptr就是一个函数指针而使用了std::function这个类的时候,我们可以这样使用,来替换函数指针。例如std::function 是一种通用、多态的函数封装。它的实例能存储、复制及调用任何可调用 (Callable) 目标——
2023-01-06 17:38:35
2574
原创 C++ 操作 (读写)json 文件及jsoncpp的配置
为什么要用json文件呢?我们最常使用的存储数据的方式有很多,比如利用txt文件存,利用xml存,利用word存,利用Excel存,如果我们要求比较高,还可以使用数据库存。相对于txt,word来说,json格式更加明确,获取重要信息非常方便。相对于xml来说,json格式更加简洁,存储同样的文件,花费的内存更小。相对于Excel来说,json更适合存储字符类文件。Excel相当于比较简单的数据库了。相对于数据库来说,json更加方便,数据库我们还需要做一些设置,安装一些软件。
2022-10-09 15:59:16
11385
1
原创 Python实现一个简单的socket服务器
该服务器主要实现从客户端拷贝文件(.c)到指定目录,再把这个文件发送给服务器,并让服务器执行脚本,执行脚本需要用到这个.c文件进行编译,编译完告诉客户端,并且把编译生成的多个文件夹(含文件)发送给客户端查看。
2022-09-26 21:18:58
2999
原创 Windows 配置基于rust的llvm st编译器环境
6、可直接打开vscode打开rusty源码 ,进入到工程目录,执行cargo build(test)即可在target下生成debug文件夹等,debug里面包含rustyc.exe。2、下载vs2017、 2019 ,都选择c++桌面开发(扩展开发 linux开发)4、下载llvm window 特殊构建(构建rusty 需要)1、搭建rust环境,下载、运行rustup-init.exe。5、设置环境变量:path添加压缩包解压后的bin文件。3、下载vscode(下载对应插件 编辑rusty)
2022-09-24 10:47:20
1146
原创 Python实现一个简单的HTTP服务器(GET/POST)
首先用户在browser里输入URL,然后browser发送request message给server,接着server在文档库里找到这个URL对应的文件,然后返回response message给client (browser),最后由browser显示出来。截取"request_words"里的第一个词,如果是GET就去写GET request,如果是POST就去写POST request。写requests message:实现GET和POST requests的HTTP server。......
2022-08-12 15:42:49
13075
原创 虚拟机三种网络设置的特点以及linux ping window( ipv4 ipv6)
三、虚拟机改成VMnet8仅主机模式,设置使用本地DHCP服务给虚拟机分配ip地址(ifconfig可以看到ipv4地址)。自己的写的ping程序去pingipv6——都不在同一网段也可以通,因为代码中根据三个不同网段的ipv6的报文类型加以判断,类型相同则表示有响应,即可以通。从VMware虚拟机的软件中的编辑,打开“虚拟网络编辑器”可以查看对应网卡的网络设置,可以在“设置”硬件中修改三种网络模式,如下图。),可以Ping通主机ipv6,都在51网段,其他不在就ping不通。.........
2022-07-15 14:37:36
1770
原创 C++ CreateFileMapping 内存映射实现快速读取文件
共享内存的方式原理就是将一份物理内存映射到不同进程各自的虚拟地址空间上,这样每个进程都可以读取同一份数据,从而实现进程通信。因为是通过内存操作实现通信,因此是一种最高效的数据交换方法。本文主要讲述的使用内存映射文件的目的是访问磁盘上的数据文件。你可以不必对文件执行I / O操作,并且可以不必对文件内容进行缓存。1、CreateFileMapping// 创建一个内存映射文件的内核对象2、MapViewOfFile // 将内存映射文件映射到进程的虚拟地址中3、OpenFileMapping //
2022-07-08 10:42:59
11640
原创 C++的跨平台(Linux)开发——总结
设备和文件IO Linux 内核函数 内核函数和API区别(fopen、open) API函数通过库函数 进行操作 内核直接操作硬件 从效率上:内核函数比库函数快 从移植性上:内核几乎无法跨操作移植,库函数比较方便 文件操作 open函数 read函数 阻塞式函数——没读取到内容是不会往下执行的 wirte函数 create函数 close函数 lseek函数 fcntl函数 文件夹操...
2022-05-25 12:29:22
1346
原创 Qt+OpenCV联合开发(三十)--图像拼接
应用场景:车载摄像头、球型摄像头——十字路口、鱼眼摄像头——跑酷图像拼接的前提条件,图像要有公共的部分1、SURF(精准度较高,计算耗时导致效率较低,清晰度也还行)拼接的图片比较少(2张) 拼接的效果比较好 可以拼接不规则的图像2、STITCH(效率高,可以多张图拼接,代码简单,效果差)多图拼接 拼接的效果不好,会丢帧、图像失真、计算过程偏暴力,效率高(代码少,实现简单) 规则的图像3、ORB 算法两张或者多张都可以拼接,需要借助第三方库(SURF、STITCH是opencv
2022-04-25 20:00:47
3441
原创 基于VS2019 C++的跨平台(Linux)开发(2.7)——服务器SOCKET封装
一、TCP编程通信本质——处理三个半事件建立连接——服务器accept等待客户端、客户端connect连接服务器 断开连接——主动断开close、shutdown、被动断开read返回0 消息到达——接收数据read(对它的处理方式决定了网络编程的风格(阻塞还是非阻塞,如何处理分包,应用层的缓冲如何设计等等) 消息发送完毕——发送数据write(算半个事件)二、面向对象方式封装IO类封装―—读写二次封装 ——读写重载 地址类(CHostAddress)——地址偏移 socket接口基类.
2022-04-07 20:19:42
871
3
原创 基于VS2019 C++的跨平台(Linux)开发(2.6)——SOCKET-IO复用技术
一、前言首先来分析一下进程版通信和线程版通信利用进程,一个客户端一个进程 利用线程,一个客户单一个线程进程是资源分配的基本单位,如果客户端数量剧增,每一个进程都会有代码段、数据段、堆栈段,所以使用进程开销大, 且进程间数据还不能共享,也不可能每个进程都写一个IPC实现通信。如果使用线程,一个进程如果开出N个线程,一旦这个进程被杀死,就会导致N个线程全部销毁。而且在一些计算机上一个进程最多开300个进程(现实中肯定不够用,就像QQ平均每天在线人数达到7亿多),但这时候操作系统也被卡死了。线
2022-04-04 20:44:27
768
原创 C++跨平台开发——Linux下QT实现客户端聊天的六大细节
其中,Write 是为了发出账号密码(点击登录按钮),read是为了判断登录成功(聊天界面)还是失败(登录界面)1、读写两个线程定义成两个单例类登录界面和聊天界面等界面都要实现读写线程,因为功能基本一样,可以把它们整合为单例类定义单例的网络连接类网络连接之后的socket是重要的这样就可以在多个窗口同时使用(不能直接在窗口里面创建线程)2、QT做客户端,何时打开网络连接?①按下登录按钮(构造函数中准备好所有数据——获取socket传到读、写线程——此时没有打...
2022-04-04 09:21:08
927
原创 C++跨平台开发——SOCKET网络编程中实现客户端对聊
一、案例C++跨平台开发——关于解决SOCKET网络编程中客户端对聊的问题二、实现分析1、为什么服务器开启线程而不是进程?线程的开销小,启动快,共享数据(不需要ipc就可以实现交互),所以一个线程一个客户端(效率提升将近10倍。2、创建线程的时候传accepfd的原因accepfd记录客户端,客户端每上线一个就覆盖一个accepfd,第一个accepfd就没了,利用值传参并保存下来。线程永远都停留在死循环内,保存下来的fd就不会被替换掉。(知道客户端下线)3、自定义通信协议
2022-04-02 16:32:42
4196
1
原创 基于VS2019 C++的跨平台(Linux)开发(2.5)——线程同步
一、前言首先来回顾一下cpu的随机轮转机制顺序随机(固定优先级情况下) 时间随机(可能有固定时间,就像鸿蒙OS芯片是10毫秒) 次数随机其次是进程与线程的区别1、进程是资源分配的基本单位,线程是CPU调度的基本单位 2、一个进程中可以包含n条线程,n条线程同时共享当前进程的所有资源 3、进程无法共享数据(要通过IPC),在一个进程内多条线程可以共享数据计算机会为一个进程开辟磁盘、内存和cpu等,用进程来计算,进程再开出线程,线程的开辟更加的节省资源开销,线程再共享当前进程的所有资源
2022-03-31 11:06:07
1718
2
原创 C++跨平台开发——关于解决SOCKET网络编程中客户端对聊的问题
前面我们在SOCKET网络编程学习中,简单实现了服务器为客户端单独开一个进程,客户端网络连接成功之后可以输入数据,并陆续给服务器发送消息,服务器则实现读取操作。那么如果想要让客户端和客户端进行聊天该怎么办?...
2022-03-28 08:39:46
3003
3
原创 C++跨平台开发——解决共享内存实现进程互发消息的BUG
在之前写的利用共享内存实现进程间发送消息中,如果细心的同学可能发现了一系列的问题,基于大佬的讲解,我对出现的BUG做了一些分析和总结C++跨平台开发——共享内存实现进程间发送消息一、共享内存没有写成功就去读首先请思考读端什么时候读数据?即什么时候能让你知道共享内存中有了数据?因为读的时候直接就memcpy了,本来在调用memcpy之前应该有一个逻辑在证明共享内存中有数据,这样的逻辑才是正常的,如果共享内存中还没有数据的话memcpy出来就是内存中的乱码。但是你又需要读出来才知道共享内存中
2022-03-27 21:44:44
2126
原创 基于VS2019 C++的跨平台(Linux)开发(2.4)——多线程
学习目标:线程的概念 线程和子进程的区别 线程的实现 线程同步 信号灯 互斥量和条件变量在一个程序里的多个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”一切进程至少都有一个执行线程进程是资源分配的基本单位,线程是cpu调度的基本单位 fork和创建新线程的区别当一个进程执行一个fork调用的时候,会创建出进程的一个新拷贝,新进程将拥有它自己的变量和它自己的PID。这个新进程的运行时间是独立的,它在执行时几乎完全独立于创建它的进程在进程.
2022-03-27 21:02:19
2266
1
原创 基于VS2019 C++的跨平台(Linux)开发(2.3)——消息队列
一、引言先来聊聊数据结构中的队列(如下图),队列具有先进先出的特点,其实就很像我们现实生活中做核酸、打疫苗排队一样。你去做核酸会先在队尾排,然后队列里面的人一直往前进,对头的人先做核酸,做完接着下一个,依次进行。那么IPC通信中的消息队列也类似这样。二、消息队列概述消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法 每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值 消息队列也有管道一样的不足,就是每个数据块的最大长度是有上限的,系统上全体队列...
2022-03-27 16:36:52
1850
原创 基于VS2019 C++的跨平台(Linux)开发(2.2)——SOCKET网络编程
socket概述 为了简化开发通信程序的工作,由Berkely学校开发了一套网络通信程序的API函数标准 socket标准被扩展成window socket和unix socket linux中的网络编程通过socket接口实现。Socket既是一种特殊的IO,它也是一种文件描述符。一个完整的Socket 都有一个相关描述{协议,本地地址,本地端口,远程地址,远程端口};每一个Socket 有一个本地的唯一Socket 号,由操作系统分配。...
2022-03-26 09:57:43
5349
2
原创 基于VS2019 C++的跨平台(Linux)开发(2.1)——网络基础
一、知识点SOCKET利用了网络在两台电脑中实现通信,也是属于ipc通信服务器达到了中转站的效果(qq两端聊天经过腾讯公司的服务器)那么中间为什么要经过这个服务器呢(对方主机不在线也能给他发消息)IP地址:确定网络中某一台计算机的位置ipconfig中ipv4地址是虚拟的,连接的wifi的ip地址,通过路由器转换的网络中如何找到对方呢?向运营商申请域名,通过这个域名找到ip地址,域名方便用户使用记忆端口号用来确定是哪个应用程序(进程)收,注意不是pid通信协议:通信
2022-03-25 20:06:04
6271
原创 C++跨平台开发——共享内存实现进程间发送消息
一、实现要求二、实现思路连接共享内存 读取数据(内存拷贝) 读取数据(内存拷贝) 断开共享内存的连接三、代码#include <iostream>#include <sys/shm.h>#include <sys/ipc.h>#include <stdio.h>#include <string.h>using namespace std;typedef struct chat{ char uid[10];
2022-03-24 16:52:10
1491
原创 C++跨平台开发——有名管道的通信实现回合制伪聊天
一、实现要求二、实现思路A到B,先写再读;B到A,先读再写 读是阻塞函数,如果A不给B发,则B读不到内容就不能发下一句。要读到内容走完循环才能再写(输入),然后发送给A,以此实现回合制聊天。 管道是半双工的,不能同时用一个管道写和读,要创建两个。三、代码A进程代码如下,B进程类似#include <unistd.h>#include <stdio.h>#include <fcntl.h>#include <iostream&g
2022-03-24 15:17:26
592
原创 C++跨平台开发——带参数信号实现进程间数据传递
一、实现要求二、实现思路大致结构:信号绑定函数(触发函数)如下确定A\B\C\D四个进程的关系是父子关系:A fork B、B fork C、C fork D(或者A是父亲,BCD都是A的孩子;再或者main函数是父亲,ABCD是兄弟也可以)此时D就是A的重孙子,可以看出B、C既有父亲也有孩子;A有孩子没有父亲;D有父亲没有孩子。那么怎么区分B、C呢?因为触发函数中有num(收到的信号编号),B、C收到的信号不同,所以可以根据num判断(num为10表示信号SIGUSER1.
2022-03-24 10:46:38
1518
2
原创 基于VS2019 C++的跨平台(Linux)开发(1.5)——共享内存
一、引言之前的管道学习中,我们利用命名管道生成了两个.fifo的文件,如果用户不懂技术,以为这个文件没用就可能把它们删除了。此外,因为管道(不管是命名管道还是匿名管道)能够容纳的最大数据是有限的(65535字节),你不断的往管道里面写数据, 如果超过这个容量就可能导致管道损坏。(就像水管承载的水量是有限的,超过一定的水压就可能爆裂),所以总结起来就是管道容易被误删,管道容量有上限。那么接下来就涉及到了共享内存。二、共享内存概述共享内存是由IPC为一个进程创建的一个特殊的地址范围,它将出现在进程的
2022-03-23 22:23:48
2461
原创 基于VS2019 C++的跨平台(Linux)开发(1.4.3)——信号屏蔽
信号集操作函数#include <signal.h>/* Clear all signals from SET. */int sigemptyset(sigset_t *set);// 清空信号集/* Set all signals in SET. */int sigfillset(sigset_t *set);// 所有信号加进去 32 33 是没有的int sigaddset(sigset_t *set, int signo);// 增加信号int sigdelset...
2022-03-23 12:33:32
816
原创 基于VS2019 C++的跨平台(Linux)开发(1.5)——管道
一、管道概述1.1、管道概念管道是Unix中最古老的进程间通信的形式。我们把从一个进程连接到另一个进程的一个数据流(文件IO流)称为一个“管道”。1.2、管道特点管道是半双工的,数据只能向一个方向流动(单行道);如果要进行双向通信,必须建立起两个管道(从定义后就不能更改)。 只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程)进行通信;通常,一个管道由一个进程创建,然后该进程调用fork,此后父、子进程之间就可应用该管道。 单独构成一种独立的文件系统:管道对于管道两端的进程而
2022-03-19 20:50:26
2284
原创 c++ 文件拆分与合并——结合linux进程管理wait/waitpid
一、主线思路1、拆分:读一个文件写多个文件2、合并:读多个文件写入到一个文件3、父子进程:必须等待子进程拆分之后才合并(if 、else if结构,如下)
2022-03-18 09:55:25
2787
4
原创 基于VS2019 C++的跨平台(Linux)开发(1.4.2)——带参数信号
信号在内核中的表示(2-1)执行信号的处理动作称为信号递达(Delivery),信号从产生到递达之间的状态,称为信号未决(Pending)。进程可以选择阻塞(Block)某个信号。被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作。注意,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作。信号在内核中的表示可以看作是这样的:信号在内核中的表示(2-2)实时信号早期Unix系统只定义了32种信号,Ret hat7.2支持64种信号,编号0-63(.
2022-03-18 00:36:15
1440
原创 基于VS2019 C++的跨平台(Linux)开发(1.4)——不带参数信号
一、目标信号概念 信号安装signal、sigaction 信号集操作函数 时钟二、信号1、概念信号是系统响应某些状况而产生的事件,进程在接收到信号时会采取相应的行动。可以是因为某些错误条件而产生的,比如内存段冲突、浮点处理器错误或者非法指令等 进程可以生成信号、捕捉并响应信号或屏蔽信号2、用途进程间通信,之前提到进程之间的数据是不能进行互通的,所以就要用到进程间通信技术,这个信号就是其中之一 ,就类似Qt里面的信号和槽(在界面切换的时候可以用到),(开发Qt的时候实际他就是参照
2022-03-17 22:13:54
875
1
原创 基于VS2019 C++的跨平台(Linux)开发(1.3.3)——进程管理
二、守护进程守护进程,也就是通常所说的精灵进程,是Linux中的后台服务进程,生存期较长的进程,通常独立于控制终端并且周期性的执行某种任务或者等待处理某些发生的事情。守护进程是在后台运行不受终端控制的进程;是能自动转到后台并且脱落与终端的联系;linux系统中一般有很多守护进程在后台运行 ,执行不同的管理任务。守护进程的特性:后台运行 必须与运行钱的环境隔离开来 启动方式尤其特殊之处守护进程运行环境:包括未关闭的文件描述符、控制终端、会话和进程组,工作目录以及文件创建掩膜等这些
2022-03-16 11:51:03
739
3
原创 基于VS2019 C++的跨平台(Linux)开发(1.3.2)——进程管理
二、wait和waitpid什么是阻塞?可以理解为堵在了程序某个地方无法往下走如read函数,读不到任何字符的时候就会阻塞,直到读到一个字符为止。(有一个状态会让它结束阻塞,即读到一个字符)。 阻塞后,这时这个函数也没有返回值,后面一系列所有的函数都不能运行。阻塞不是死循环,死循环没法结束,但是阻塞是可以结束的,等待某一个状态就结束卡死的状态
2022-03-13 16:33:44
3550
5
原创 基于VS2019 C++的跨平台(Linux)开发——引入
一、前言先声明我的服务器是Ubuntu16.04,由标题可知,我的开发工具采用Visual Studio2019,使用c++y语言来实现windows-linux的跨平台开发。二、关于跨平台1. 什么是跨平台?由百度百科可知,跨平台概念是软件开发中一个重要的概念,即不依赖于操作系统,也不依赖硬件环境。一个操作系统下开发的应用,放到另一个操作系统下依然可以运行。跨平台的定义就是指程序语言、软件或硬件设备可以在多种作业系统或不同硬件架构的电脑上运作。简单来说,本文的跨平台就是,一份代码,在
2022-03-11 12:37:38
6043
1
原创 基于VS2019 C++的跨平台(Linux)开发(1.3)——进程管理
一、引言进程、子进程和僵进程 子进程的创建以及父子进程关系 fork,exec,system,wait,waitpid系统调用 如何避免“僵尸”进程?二、进程概念1、进程与程序程序是一个简单的实体,说白了,程序是存放在磁盘文件中的可执行文件,某些操作系统用任务表示正被执行的程序。进程是程序的一次执行,是运行在自己的虚拟地址空间的一个具有独立功能的程序。2、进程与进程ID程序的执行实例被称为进程,每个进程都一定有一个唯一的数字标识符,称为进程ID,(一定是非负整数)3、linu
2022-03-09 20:50:11
1383
7
原创 基于VS2019 C++的跨平台(Linux)开发(1.2.2)——设备管理及文件IO
接上一篇文章,我们来学习其他的一些系统调用等等Linux——设备管理及文件IO(一)9、lseek系统调用作用:通过指定相对于开始位置、当前位置或末尾位置的字节数来重定位 curp,这取决于 lseek() 函数中指定的位置函数原型:off_t lseek(int fd, off_t offset, int base);参数: fd:需设置的文件标识符 offset:偏移量 base:搜索的起始位置返回值: 返回新的文件偏移值...
2022-03-09 08:29:59
1349
4
Python实现简单的HTTP服务器(GET/POST)
2022-08-12
基于VS2019 C++的跨平台(Linux)开发的项目——360 度智能行车辅助系统
2022-05-29
Qt基于FFmpeg读取摄像头并进行H264编码
2022-01-20
Qt基于FFmpeg解码本地视频生成YUV及RGB源码
2022-01-14
Qt基于FFmpeg解码本地视频生成 H.264文件并播放
2022-01-14
基于c++的捕鱼达人小游戏
2022-01-10
基于c++的动态生成自定义圣诞树
2022-01-10
基于c++的仓储盘点机系统
2022-01-10
基于Android“我的小金库”记账app的源代码
2021-12-18
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人