TCP机械臂控制

news2025/1/14 0:55:30

通过w(红色臂角度增大)s(红色臂角度减小)d(蓝色臂角度增大)a(蓝色臂角度减小)按键控制机械臂

注意:关闭计算机的杀毒软件,电脑管家,防火墙

1)基于TCP服务器的机械臂,端口号是8888, ip是Windows的ip;

查看Windows的IP:按住Windows+r 按键,输入cmd , 输入ipconfig

2)点击软件中的开启监听;

3)机械臂需要发送16进制数,共5个字节,协议如下

0xff 0x02 x y 0xff 0xff:起始结束协议,固定的; 0x02:控制机械手臂协议,固定的; x:指定要操作的机械臂 0x00 红色摆臂 0x01 蓝色摆臂 y:指定角度

#include <head.h>
#include <linux/input.h>
#define SER_PORT 8888            // 服务器端口号
#define SER_IP "192.168.118.58"  // 服务器IP
#define CLI_PORT 9000            // 客户端端口号
#define CLI_IP "192.168.250.100" // 客户端IP

int main(int argc, const char *argv[])
{
    // 1、创建用于连接的客户端套接字
    int cfd = socket(AF_INET, SOCK_STREAM, 0);
    if (cfd == -1)
    {
        perror("socket error");
        return -1;
    }
    printf("socket success cfd = %d\n", cfd); // 3

    // 设置端口号快速重用
    int reuse = 1;
    if (setsockopt(cfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) == -1)
    {
        perror("setsockopt error");
        return -1;
    }
    printf("端口号快速重用成功\n");

    // 2、绑定端口号和ip地址(非必须)
    // 2.1 填充客户端地址信息结构体
    struct sockaddr_in cin;
    cin.sin_family = AF_INET;
    cin.sin_port = htons(CLI_PORT);
    cin.sin_addr.s_addr = inet_addr(CLI_IP);

    /*2.2 绑定端口号和IP
    if(bind(cfd, (struct sockaddr*)&cin, sizeof(cin)) == -1)
    {
        perror("bind error");
        return -1;
    }
    printf("bind success\n");
    */

    // 3、连接服务器
    // 3.1 填充要连接服务器的地址信息结构体
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;                // 地址族
    sin.sin_port = htons(SER_PORT);          // 服务器端口号
    sin.sin_addr.s_addr = inet_addr(SER_IP); // 服务器的IP地址

    // 3.2 连接服务器
    if (connect(cfd, (struct sockaddr *)&sin, sizeof(sin)) == -1)
    {
        perror("connect error");
        return -1;
    }
    printf("连接成功!\n");

    // 定义控制机械臂的容器
    char buf_red[5] = {0xff, 0x02, 0x00, 0x00, 0xff};           // 红色臂容器
    unsigned char buf_blue[5] = {0xff, 0x02, 0x01, 0x00, 0xff}; // 蓝色臂容器

    // 将数据发送给服务器以初始化
    send(cfd, buf_red, sizeof(buf_red), 0);
    sleep(1);
    send(cfd, buf_blue, sizeof(buf_blue), 0);

    // 定义一个读取数据的结构体变量
    struct input_event ie;
    // 打开 /dev/input/event1文件
    int fd = open("/dev/input/event1", O_RDONLY);
    if (fd == -1)
    {
        perror("open error");
        return -1;
    }

    // 4、收发数据
    char ctrl = 0; // 用户输入的控制键
    while (1)
    {
        // scanf("%c", &ctrl);        //用户输入键
        // getchar();

        // 从文件中读取当前文件中的数据
        // read(fd, &ie, sizeof(ie));
        scanf("%c", &ctrl);
        while (getchar() != '\n')
            ;
        // 输出从键盘事件文件中读取的数据
        // printf("ie.type = %d, ie.code = %d, ie.value = %d\n", ie.type, ie.code, ie.value);

        // 对输入的字符进行多分支选择
        switch (ctrl)
        {
        case 'w':
        {
            // 红色臂角度增大
            buf_red[3] += 2;
            if (buf_red[3] >= 90)
            {
                buf_red[3] = 90;
            }

            // 将数据发送给服务器
            send(cfd, buf_red, sizeof(buf_red), 0);
        }
        break;
        case 's':
        {
            // s键按下
            buf_red[3] -= 2;
            if (buf_red[3] <= -90)
                buf_red[3] = -90;
            // 将数据发送给服务器
            send(cfd, buf_red, sizeof(buf_red), 0);
        }
        break;
        case 'a':
        {
            // A键按下
            buf_blue[3] += 2;
            if (buf_blue[3] >= 180)
                buf_blue[3] = 180;
            // 将数据发送给服务器
            send(cfd, buf_blue, sizeof(buf_blue), 0);
        }
        break;
        case 'd':
        {
            // D键按下
            buf_blue[3] -= 2;
            if (buf_blue[3] <= 0)
                buf_blue[3] = 0;
            // 将数据发送给服务器
            send(cfd, buf_blue, sizeof(buf_blue), 0);
        }
        break;
        case 16:
            goto END;
        }
    }

END:
    // 5、关闭套接字
    close(cfd);

    return 0;
}

效果:

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

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

相关文章

数据泄露态势(2024年2月)

监控说明&#xff1a;以下数据由零零信安0.zone安全开源情报系统提供&#xff0c;该系统监控范围包括约10万个明网、深网、暗网、匿名社交社群威胁源。在进行抽样事件分析时&#xff0c;涉及到我国的数据不会选取任何政府、安全与公共事务的事件进行分析。如遇到影响较大的伪造…

专业款希亦、小米、必胜、云鲸洗地机怎么样?深度测评利弊

洗地机可以说是一种非常实用的清洁工具&#xff0c;尤其是对于那些需要经常给家里地板清洁的人来说。它能够高效、彻底清洁地板&#xff0c;去除顽固污渍、灰尘和细菌&#xff0c;让家居环境更加洁净卫生。可是面对型号繁多的洗地机&#xff0c;我们应该怎么挑选呢&#xff1f;…

架构设计-复杂度来源:高性能

对性能孜孜不倦的追求是整个人类技术不断发展的根本驱动力。例如计算机&#xff0c;从电子管计算机到晶体管计算机再到集成电路计算机&#xff0c;运算性能从每秒几次提升到每秒几亿次。但伴随性能越来越高&#xff0c;相应的方法和系统复杂度也是越来越高。现代的计算机 CPU 集…

实现elasticsearch和数据库的数据同步

1. 数据同步 elasticsearch中的酒店数据来自于mysql数据库&#xff0c;因此mysql数据发生改变时&#xff0c;elasticsearch也必须跟着改变&#xff0c;这个就是elasticsearch与mysql之间的数据同步。 1.1. 思路分析 常见的数据同步方案有三种&#xff1a; 同步调用 异步通知…

element-plus表格,多样本比较,动态渲染表头

问题&#xff1a; 公司给了个excel表格&#xff0c;让比较两个样本之间的数据&#xff0c;并且动态渲染&#xff0c;搞了半天没搞出来&#xff0c;最后让大佬解决了&#xff0c;特此写篇博客记录一下。 我之前的思路是合并行&#xff0c;大概效果是这样&#xff1a; 但是最终…

微服务学习day02 -- nacos配置管理 -- Feign远程调用 -- Gateway服务网关

0.学习目标 1.Nacos配置管理 Nacos除了可以做注册中心&#xff0c;同样可以做配置管理来使用。 1.1.统一配置管理 当微服务部署的实例越来越多&#xff0c;达到数十、数百时&#xff0c;逐个修改微服务配置就会让人抓狂&#xff0c;而且很容易出错。我们需要一种统一配置管理…

雷卯有多种封装的超低电容ESD供您选择

1.应用 HDMI 1.3、1.4、2.0、2.1 接口 LCD、HDTV MIPI 接口 手机、 天线&#xff08;手机、GPS...&#xff09; 高速以太网 100/1000 以太网 USB 2.0 和 USB3.0、DVI、LVDS、IEEE 1394 接口 车载信息箱、VN&#xff08;车载导航&#xff09; 卫星导航、便携式导航 …

3.2网安学习第三阶段第二周回顾(个人学习记录使用)

本周重点 ①SQL语句的基本用法 ②SQL注入的基本概念和原理 ③SQL注入类型(**重点) ④SQL注入的防御和绕过手段 本周主要内容–SQL 一、SQL语句的基本用法 limit用法&#xff1a;显示查询结果中从第n条开始显示m条记录 select * from tb_user limit 1,2union用法&#x…

构建部署_Docker常用命令

构建部署_Docker常见命令 启动命令镜像命令容器命令 启动命令 启动docker&#xff1a;systemctl start docker 停止docker&#xff1a;systemctl stop docker 重启docker&#xff1a;systemctl restart docker 查看docker状态&#xff1a;systemctl status docker 开机启动&…

【Shiro反序列化漏洞】Shiro-550反序列化漏洞复现

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收…

腾讯云4核8G服务器性能怎么样?搭建网站够用吗?

腾讯云轻量4核8G12M服务器配置446元一年&#xff0c;646元12个月&#xff0c;腾讯云轻量应用服务器具有100%CPU性能&#xff0c;系统盘为180GB SSD盘&#xff0c;12M带宽下载速度1536KB/秒&#xff0c;月流量2000GB&#xff0c;折合每天66.6GB流量&#xff0c;超出月流量包的流…

【Datawhale组队学习:Sora原理与技术实战】训练一个 sora 模型的准备工作,video caption 和算力评估

训练 Sora 模型 在 Sora 的技术报告中&#xff0c;Sora 使用视频压缩网络将各种大小的视频压缩为潜在空间中的时空 patches sequence&#xff0c;然后使用 Diffusion Transformer 进行去噪&#xff0c;最后解码生成视频。 Open-Sora 在下图中总结了 Sora 可能使用的训练流程。…

快手发布革命性视频运动控制技术 DragAnything,拖动锚点精准控制视频物体和镜头运动

快手联合浙江大学、新加坡国立大学发布了DragAnything &#xff0c;利用实体表示实现对任何物体的运动控制。该技术可以精确控制物体的运动&#xff0c;包括前景、背景和相机等不同元素。 该项目提供了对实体级别运动控制的新见解&#xff0c;通过实体表示揭示了像素级运动和实…

layuiAdmin-通用型后台模板框架【广泛用于各类管理平台】

1. 主页 1.1 控制台 2. 组件 3. 页面 3.1 个人主页 3.2 通讯录 3.3 客户列表 3.4 商品列表 3.5 留言板 3.6 搜索结果 3.7 注册 3.8 登入 3.9 忘记密码 4. 应用 4.1 内容系统 4.1.1 文章列表 4.1.2 分类管理 4.1.3 评论管理 4.2 社区系统 4.2.1 帖子列表 4.2.2 回…

数据结构---C语言栈队列

知识点&#xff1a; 栈&#xff1a; 只允许在一端进行插入或删除操作的线性表&#xff0c;先进后出LIFO 类似一摞书&#xff0c;按顺序拿&#xff0c;先放的书只能最后拿&#xff1b; 顺序栈&#xff1a;栈的顺序存储 typedef struct{Elemtype data[50];int top; }SqStack; SqS…

724.寻找数组的中心下标

题目&#xff1a;给你一个整数数组 nums &#xff0c;请计算数组的 中心下标 。 数组 中心下标 是数组的一个下标&#xff0c;其左侧所有元素相加的和等于右侧所有元素相加的和。 如果中心下标位于数组最左端&#xff0c;那么左侧数之和视为 0 &#xff0c;因为在下标的左侧不…

力扣爆刷第96天之hot100五连刷66-70

力扣爆刷第96天之hot100五连刷66-70 文章目录 力扣爆刷第96天之hot100五连刷66-70一、33. 搜索旋转排序数组二、153. 寻找旋转排序数组中的最小值三、4. 寻找两个正序数组的中位数四、20. 有效的括号五、155. 最小栈 一、33. 搜索旋转排序数组 题目链接&#xff1a;https://le…

回归预测 | Matlab实现SO-BP蛇算法优化BP神经网络多变量回归预测

回归预测 | Matlab实现SO-BP蛇算法优化BP神经网络多变量回归预测 目录 回归预测 | Matlab实现SO-BP蛇算法优化BP神经网络多变量回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab实现SO-BP蛇算法优化BP神经网络多变量回归预测&#xff08;完整源码和数据) …

MyBatis学习笔记|2024最新版Mybatis

Mybatis简介 MyBatis历史 MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下,iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到GithubiBatis一词来源于“internet”和“aba…

2024年【天津市安全员C证】考试内容及天津市安全员C证考试报名

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 天津市安全员C证考试内容是安全生产模拟考试一点通生成的&#xff0c;天津市安全员C证证模拟考试题库是根据天津市安全员C证最新版教材汇编出天津市安全员C证仿真模拟考试。2024年【天津市安全员C证】考试内容及天津市…