5.18 TCP机械臂模拟
#include <netinet/tcp.h>//包含TCP选项的头文件
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <linux/input.h>//读取输入事件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>#define SER_PORT 8888
#define SER_IP "192.168.125.75"
#define CLI_PORT 6666
#define CLI_IP "192.168.125.114"int main(int argc, const char *argv[])
{int cfd = socket(AF_INET, SOCK_STREAM, 0);if(-1 == cfd){perror("socket");return 1;}printf("cfd = %d\n", cfd);struct sockaddr_in cin = {.sin_family = AF_INET,//注释下行启用动态端口号.sin_port = htons(CLI_PORT),.sin_addr = { inet_addr(CLI_IP) },};if(-1 == bind(cfd, (struct sockaddr*)&cin, sizeof(cin))){perror("bind");return 1;}puts("bind success");struct sockaddr_in sin = {.sin_family = AF_INET,.sin_port = htons(SER_PORT),.sin_addr = { .s_addr = inet_addr(SER_IP) },}; if(-1 == connect(cfd, (struct sockaddr*)&sin, sizeof(sin))){perror("connect");return 1;}puts("connect success");//设置TCP push位int val = 1;//TCP_NODELAY表示Nagle算法(导致粘包现象),默认置0(不关闭),置1即可关闭if(-1 == setsockopt(cfd, IPPROTO_TCP, TCP_NODELAY, &val, sizeof(val))){perror("setsockopt");return 1;}/*val = 0;if(-1 == setsockopt(cfd, IPPROTO_TCP, TCP_CORK, &val, sizeof(val))){perror("setsockopt");return 1;}*///设置端口快速重用printf("val = %d\n", val);if(-1 == setsockopt(cfd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val))){perror("setsockopt");return 1;}//定义指令格式结构体//注意字节对齐填充导致的问题,且大于1B的数据类型会自动补0//均会导致协议解析失败struct {//5Bchar c1[3];//3Bunion{char arm_red;unsigned char arm_blue;}c2;//1Bchar c3;//1B}cmd = { 0xff, 0x02, 0x00, 0x00, 0xff };//机械臂初始化send(cfd, &cmd, sizeof(cmd), 0);cmd.c1[2] = 0x01;usleep(50000);send(cfd, &cmd, sizeof(cmd), 0);char ang_r = 0x00;unsigned char ang_b = 0x00;//打开/dev/input/event1int fd = open("/dev/input/event1", O_RDONLY);if(-1 == fd){perror("open");return 1;}//准备读取数据的结构体变量struct input_event input;
#include <linux/input.h>
/* 结构体形式如下:* struct input_event {struct timeval time;__u16 type;__u16 code;__s32 value;};
*/// system("stty raw -echo");while(1){//char ch = getchar();read(fd, &input, sizeof(input));//switch(ch){switch(input.value * input.code){//code按下为0,弹起为1,长按为2//case 'w'://红增 //w:17 a:30 s:31 d:32case 17*2:if(ang_r < 0x5A)//最大90度ang_r += 0x02;cmd.c2.arm_red = ang_r;cmd.c1[2] = 0x00;break;//case 's'://红减case 31*2:if(ang_r > -0x5A)ang_r -= 0x02;cmd.c2.arm_red = ang_r;cmd.c1[2] = 0x00;break;//case 'd'://蓝增case 32*2:if(ang_b < 0xB4)ang_b += 0x02;cmd.c2.arm_blue = ang_b;cmd.c1[2] = 0x01;break;//case 'a'://蓝减case 30*2:if(ang_b > 0x00)ang_b -= 0x02;cmd.c2.arm_blue = ang_b;cmd.c1[2] = 0x01;break;default:continue;break;}send(cfd, &cmd, sizeof(cmd), 0);}// system("stty -raw echo");close(cfd);close(fd);return 0;
}
相关文章:

5.18 TCP机械臂模拟
#include <netinet/tcp.h>//包含TCP选项的头文件 #include <arpa/inet.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <linux/input.h>//读取输入事件 #include <sys/types.h> #include <sys/stat.h&…...

linux---线程控制
线程和进程 以前我们要同时跑多个程序,可以通过fork()多个子进程,然后通过系统函数进行程序的替换,但是创建进程代价大,不仅要拷贝一份父进程的地址空间,页表,文件表述符表等。但是线程不需要因为是进程的…...

低代码开发:拖拽式可视化构建工业物联网系统
什么是低代码? 低代码(Low Code)是一种可视化的软件开发方法,通过最少的手动编码可以更快地交付应用程序。低代码平台的图形用户界面和拖放功能可自动执行开发过程的各个方面,从而消除对传统计算机编程方法的依赖。 什么是低代码平台&#…...

【撸源码】【ThreadPoolExecutor】线程池的工作原理深度解析——上篇
1. 前言 线程池这块,作为高频面试题,并且实际使用场景巨多,所以出了这篇文章,一块来研究一下线程池的实现原理,运行机制,从底层深挖,不再局限于面试题。 2. 线程池概览 2.1. 构造器 线程池总…...
webpack 学习之 五大核心
为什么用 webpack webpack 官网传送门 … 官网:webpack 是一个用于现代 JavaScript 应用程序的 静态模块打包工具。将你项目中所需的每一个模块组合成一个或多个 bundles,它们均为静态资源,用于展示你的内容。总结:汇总所有模块…...
Android逆向抓包技巧 - Hook 底层通信
一,请求的本质 平时开发使用的 http 或 https 均属于应用层的协议,其本质都会调用 TCP 发送请求。 例如:你在 Python 中使用 requests 模块发送一个 http 请求,其底层就是使用 socket 模块 + TCP 实现发送的请求。 import requestsres = requests.get("http://wiki…...

深入解析力扣162题:寻找峰值(线性扫描与二分查找详解)
❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容,和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣! 推荐:数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航: LeetCode解锁100…...
模板方法及设计模式——Java笔记
模板方法及设计模式 抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会保留抽象类的行为方式。 解决的问题: 当功能内部一部分实现是确定的,另一…...

K8S认证|CKA题库+答案| 11. 创建PVC
11、创建PVC 您必须在以下Cluster/Node上完成此考题: Cluster Master node Worker node ok8s master …...

多微信如何高效管理?一台电脑就能搞定!
对于有多个微信号的人来说,管理这些微信无疑是一道难题。 今天,就给大家分享一个能够让你高效管理多个微信号的神器——个微管理系统,下面,就一起来看看它都有哪些功能吧! 1、多号同时登录在线 系统支持多个微信号同…...

安装harbor出现问题: Running 1/1 ✘ Network harbor_harbor Error
安装harbor出现问题: [] Running 1/1 ✘ Network harbor_harbor Error 0.2s failed to create network harbor_harbor: Error response from daemon: Fa…...
JVM解释器和即时编译器的工作原理
1、解释器: 当Java程序启动时,JVM的解释器首先读取Java字节码(通常存在于.class文件中)。 解释器将字节码解析为相应的指令,每条指令对应JVM中的一个操作。 解释器根据指令的类型和操作数,执行相应的计算或…...

【产品经理】输出
引言: 在最近频繁的产品管理职位面试中,我深刻体会到了作为产品经理需要的不仅仅是对市场和技术的敏锐洞察,更多的是在复杂多变的环境中,如何运用沟通、领导力和决策能力来引导产品从概念走向市场。这一系列博客将分享…...
MySQL入门学习.数据库组成.存储引擎
存储引擎是 MySQL 数据库的一个重要组成部分,它决定了数据的存储方式、索引方式、事务支持等特性。MySQL 支持多种存储引擎,常见的有 InnoDB、MyISAM、Memory 等。 存储引擎的特点和使用方法: 1. InnoDB: 是 MySQL 默认的存储引…...

【算法】分治 - 快速排序
快乐的流畅:个人主页 个人专栏:《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火,在为久候之人燃烧! 文章目录 引言一、颜色分类二、排序数组三、数组中的第k个数四、最小的k个数总结 引言 本节主要介绍快速排序…...

设计模式13——桥接模式
写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。 桥接模式(Bridge&a…...

第十六讲:数据在内存中的存储
第十六讲:数据在内存中的存储 1.整数在内存中的存储1.1存储方式1.2大小端字节序1.3大小端字节序排序规则1.4为什么要有大小端1.5练习1.5.1练习11.5.2练习21.5.3练习31.5.4练习41.5.5练习51.5.6练习61.5.7练习7 2.浮点数在内存中的存储2.1练习2.2浮点数的存储2.3浮点…...

【EXCEL_VBA_基础知识】15 使用ADO操作外部数据
课程来源:王佩丰老师的《王佩丰学VBA视频教程》,如有侵权,请联系删除! 目录 1. 使用ADO链接外部数据源 2. 常用SQL语句(Execute(SQL语句)) 2.1 查询数据、查询某几个字段、带条件查询、合并两表数据、插…...
如何在Spring中配置Bean?
在Spring框架中配置Bean,主要有以下几种方式: XML配置文件注解配置Java配置类 1. XML配置文件 早期的Spring版本广泛使用XML配置文件来定义和配置Bean。在XML中,可以通过 <bean> 标签定义Bean,指定其类、唯一标识符&…...

深入学习 torch.distributions
0. 引言 前几天分几篇博文精细地讲述了《von Mises-Fisher 分布》, 以及相应的 PyTorch 实现《von Mises-Fisher Distribution (代码解析)》, 其中以 Uniform 分布为例简要介绍了 torch.distributions 包的用法. 本以为已经可以了, 但这两天看到论文 The Power Spherical dist…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...