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 {//5B
		char c1[3];//3B
		union{
			char arm_red;
			unsigned char arm_blue;
		}c2;//1B
		char 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/event1
	int 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:32
		case 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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++vector的简单模拟实现

文章目录 目录 文章目录 前言 一、vector使用时的注意事项 1.typedef的类型 2.vector不是string 3.vector 4.算法sort 二、vector的实现 1.通过源码进行猜测vector的结构 2.初步vector的构建 2.1 成员变量 2.2成员函数 2.2.1尾插和扩容 2.2.2operator[] 2.2.3 迭代器 2…

Linux基础(五):常用基本命令

从本节开始&#xff0c;我们正式进入Linux的学习&#xff0c;通过前面的了解&#xff0c;我们知道我们要以命令的形式使用操作系统&#xff08;使用操作系统提供的各类命令&#xff0c;以获得字符反馈的形式去使用操作系统。&#xff09;&#xff0c;因此&#xff0c;我们是很有…

纯代码如何实现WordPress搜索包含评论内容?

WordPress自带的搜索默认情况下是不包含评论内容的&#xff0c;不过有些WordPress网站评论内容比较多&#xff0c;而且也比较有用&#xff0c;所以想要让用户在搜索时也能够同时搜索到评论内容&#xff0c;那么应该怎么做呢&#xff1f; 网络上很多教程都是推荐安装SearchWP插…

shelll 正则表达式

sort sort命令对行内容进行排序 sort语法&#xff1a; 1.sort &#xff08;选项&#xff09; 参数 2.cat file | sort 选项 选项&#xff1a; -n 按照数字进行排序 -r 反向排序 -k 指定排序 -f 忽略大小写 会将小写字母转化成大写字母来比较 -b 忽略每行前面的空格 .........…

CentOS上升级glibc2.17至glibc2.31

glibc是Linux系统中的重要组件之一。在CentOS中&#xff0c;glibc通常是作为系统的默认C标准库使用的&#xff0c;因为它是许多软件的基础库。在CentOS中&#xff0c;glibc的版本通常与CentOS版本一起发布。因为CentOS通常会优先选择稳定性而不是最新性&#xff0c;所以CentOS使…

【linux】docker下nextcloud安装人脸识别插件

一、插件源码地址&#xff1a; GitCode - 开发者的代码家园 二、插件官网地址&#xff1a; Releases - Face Recognition - Apps - App Store - Nextcloud 三、插件安装教程&#xff1a; 1、查看本地nextcloud版本号 http://ipAddress:8080/settings/admin/overview 2、找…

基于51单片机的火灾检测设计(仿真+程序+原理图+论文报告+讲解视频)

基于51单片机的火灾检测设计 基于51单片机的火灾检测设计&#xff08;仿真程序原理图论文报告&#xff09;功能要求仿真图&#xff1a;原理图&#xff1a;源程序&#xff1a;论文/报告&#xff1a;资料清单&#xff1a; 基于51单片机的火灾检测设计&#xff08;仿真程序原理图论…

论文阅读--CLIPasso

让计算机把真实图片抽象成简笔画&#xff0c;这个任务很有挑战性&#xff0c;需要模型捕获最本质的特征 以往的工作是找了素描的数据集&#xff0c;而且抽象程度不够高&#xff0c;笔画是固定好的&#xff0c;素描对象的种类不多&#xff0c;使得最后模型的效果十分受限 之所以…

在ubuntu中关于驱动得问题:如何将nouveau驱动程序加入黑名单和安装NVIDIA显卡驱动

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、nouveau驱动程序加入黑名单二、安装NVIDIA显卡驱动 一、nouveau驱动程序加入黑名单 (1) 打开黑名单列表文件 终端输入&#xff1a; sudo gedit /etc/modprobe…

共享单车(八):数据库

实现后台数据库访问模块的框架&#xff0c;能够实现验证请求并响应&#xff08;支持数据库操作&#xff09;。 数据库设计 class SqlTabel //负责数据库表的创建 { public:SqlTabel(std::shared_ptr<MysqlConnection> sqlconn) :sqlconn_(sqlconn) {}bool CreateUserI…

Mysql之基本架构

1.Mysql简介 mysql是一种关系型数据库&#xff0c;由表结构来存储数据与数据之间的关系&#xff0c;同时为sql(结构化查询语句)来进行数据操作。 sql语句进行操作又分为几个重要的操作类型 DQL: Data Query Language 数据查询语句 DML: Data Manipulation Language 添加、删…

Windows下安装部署rocketmq

1.1.下载安装rocketmq 下载 | RocketMQ 下载完后解压到自定义目录&#xff0c;MQ解压路径\rocketmq-all-4.6.0-bin-release&#xff1b;&#xff08;Windows10系统解压路径不要出现空格&#xff09; 1.2.配置环境变量 配置环境变量&#xff0c;变量名&#xff1a;ROCKETM…

Git 仓库中 -- 代码冲突产生、定位、解决的流程

目录 前置知识1 工具环境2 冲突的产生2.1 仓库中的源代码2.2 人员 A 首先更改代码2.3 人员 B 更改代码&#xff0c;产生冲突2.3.1 第一次错误提示&#xff1a;2.3.2 第二次错误提示&#xff1a; 3 查看冲突4 手动解决冲突4.1 方式一4.2 方式二&#xff08;tortoisegit&#xff…

mysql设置密码,修改密码,破解密码

目录 mysql官方文档 1. mysql中文文档地址&#xff1a; 2. mysql英文文档地址&#xff1a; 一、数据库设置密码&#xff1a; 1.命令行模式&#xff1a; 2.进入数据库设置密码&#xff1a; 二、数据库修改密码&#xff08;需要知道旧密码&#xff09;&#xff1a; 1.命令…

vue 展示svg矢量图可缩放拖动

使用插件&#xff1a;svg-pan-zoom <template> <!-- svg图--><div id"svgContainer"></div> </template><script> import svgPanZoom from svg-pan-zoom import svgFile from ../datav/img/220kVscb.svg // 路径根据实际情况调…

同旺科技 FLUKE ADPT 隔离版发布 ---- 说明书

所需设备&#xff1a; 1、FLUKE ADPT 隔离版 内附链接&#xff1b; 应用于&#xff1a;福禄克Fluke 12E / 15BMax / 17B Max / 101 / 106 / 107 应用于&#xff1a;福禄克Fluke 15B / 17B / 18B

Spring 事件监听

参考&#xff1a;Spring事件监听流程分析【源码浅析】_private void processbean(final string beanname, fi-CSDN博客 一、简介 Spring早期通过实现ApplicationListener接口定义监听事件&#xff0c;Spring 4.2开始通过EventListener注解实现监听事件 FunctionalInterface p…

栈和队列的经典例题,LeetCode 括号匹配问题;栈实现队列;队列实现栈;队列带环问题

1.前序 又有很久没有更新文章了&#xff0c;这次带你们手撕几道基础题&#xff1b;真的就和康纳吃饭一样简单&#xff01;&#xff01;&#xff01; 如果还不会队列和栈的可以去看看之前写的博客&#xff1b; 栈的实现 队列概念以及实现 <- 快速传送 目录 1.前序 …

HTTP响应的基本概念

目录 HTTP响应中的一些信息 HTTPS HTTP响应中的一些信息 状态码&#xff1a;描述了这次HTTP请求是否成功&#xff0c;以及失败的原因。 1&#xff09;200 ---OK 表示这次访问成功了。 2&#xff09;404 ---Not Found 表示客户端请求的资源在服务器这边不存在。 3&a…

线性表(从数据结构的三要素出发)

文章目录 逻辑结构存储结构顺序存储链式存储单链表双链表循环单链表循环双链表静态链表 数据的操作顺序结构链式结构单链表双链表 逻辑结构 线性表是具有相同数据类型的 n ( n ≥ 0 ) n(n≥0) n(n≥0)个数据元素的有限序列&#xff0c;其中 n n n为表长&#xff0c;当 n 0 n0…