【网络编程】 TCP机械臂测试(C语言)

目录

前言:

代码实现:

输出结果如下:


前言:

1、通过以下操作实现机械臂控制

w(红色臂角度增大)

s(红色臂角度减小)

d(蓝色臂角度增大)

a(蓝色臂角度减小)按键控制机械臂

>>需要对机械臂发送的16进制数,共5个字节,协议如下<<

1、char rbuf[5] = {0xff, 0x02, 0x00, 0x00, 0xff}

2、0xff:起始结束协议,固定的

3、0x02:控制机械手臂协议,固定的

4、x:指定要操作的机械臂

0x00 红色摆臂

0x01 蓝色摆臂

5、y:指定角度

代码实现:

cs 复制代码
#include <myhead.h>
#define SER_PORT 8888               //端口号为8888
#define SER_IP "192.168.2.71"          
#define CLI_PORT 6666
#define CLI_IP "192.168.83.128"


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("cfd = %d\n",cfd);

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

	//2、绑定IP地址和端口号
	//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); // ip地址

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


	//3、连接到服务器
	struct sockaddr_in sin;
	sin.sin_family = AF_INET;
	sin.sin_port = htons(SER_PORT);
	sin.sin_addr.s_addr = inet_addr(SER_IP);

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

	//4、数据收发
    //以下两个数组为机械臂的初始状态设置
	char rbuf[5] = {0xff, 0x02, 0x00, 0x00, 0xff};
	unsigned char bbuf[5] =  {0xff, 0x02, 0x01, 0x00, 0xff};

	//发送给服务器当做初始值
	send(cfd, rbuf, sizeof(rbuf), 0);
	sleep(1);
	send(cfd, bbuf, sizeof(bbuf), 0);

	char key = 0;            //接收键盘输入的字符

	while(1)
	{

		scanf("%c", &key);        //键盘输入一个字符
		getchar();                //吸收回车

		switch(key)
		{
		case 'W':
		case 'w':
			{
				rbuf[3] += 2;       //每次操作的角度偏移2度
				
				send(cfd, rbuf, sizeof(rbuf), 0);
			}
			break;

		case 'S':
		case 's':
			{
				rbuf[3] -= 2;
				
				send(cfd,rbuf,sizeof(rbuf),0);
			}
			break;

		case 'A':
		case 'a':
			{
				bbuf[3] -= 2;       //每次操作的角度偏移2度
				
				send(cfd, bbuf, sizeof(bbuf), 0);
			}
			break;

		case 'D':
		case 'd':
			{
				bbuf[3] += 2;       //每次操作的角度偏移2度
			
				send(cfd, bbuf, sizeof(bbuf), 0);
			}
			break;
		case 'q':
			goto END;
		default:
			break;
		}
	}

	END:

	//5、关闭套接字
	close(cfd);
	return 0;
}

输出结果如下:

能够通过TCP通信,成功通过"w,s,a,d"键盘输入去控制机械臂的旋转

相关推荐
2601_949146532 小时前
C语言语音通知接口接入教程:如何使用C语言直接调用语音预警API
c语言·开发语言
wdfk_prog2 小时前
[Linux]学习笔记系列 -- [drivers][input]input
linux·笔记·学习
盟接之桥3 小时前
盟接之桥说制造:引流品 × 利润品,全球电商平台高效产品组合策略(供讨论)
大数据·linux·服务器·网络·人工智能·制造
忆~遂愿3 小时前
ops-cv 算子库深度解析:面向视觉任务的硬件优化与数据布局(NCHW/NHWC)策略
java·大数据·linux·人工智能
湘-枫叶情缘3 小时前
1990:种下那棵不落叶的树-第6集 圆明园的对话
linux·系统架构
会员源码网3 小时前
理财源码开发:单语言深耕还是多语言融合?看完这篇不踩坑
网络·个人开发
知南x4 小时前
【Ascend C系列课程(高级)】(1) 算子调试+调优
c语言·开发语言
米羊1214 小时前
已有安全措施确认(上)
大数据·网络
Fcy6484 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满4 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器