一、思维导图
二、机械臂
#include<myhead.h>
#define SER_IP "192.168.0.140"
#define SER_PORT 8888
#define CLI_PORT 9999
#define CLI_IP "192.168.0.148"
//初始化数据
char rbuf[5] = {0xff, 0x02, 0x00, 0x00, 0xff};
char bbuf[5] = {0xff, 0x02, 0x01, 0x00, 0xff};
int main(int argc,char *argv[])
{
//1、创建套接字
int cfd = socket(AF_INET,SOCK_STREAM,0);
if(cfd == -1)
{
perror("socket error");
return -1;
}
//端口号快速重用
int opt = 1;
if(setsockopt(cfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) == -1)
{
perror("setsockopt error");
return -1;
}
printf("端口号快速重用成功\n");
//2、绑定IP和端口号
//2.1、创建结构体
struct sockaddr_in cin;
bzero(&cin,sizeof(cin));
cin.sin_family = AF_INET;
cin.sin_port = htons(CLI_PORT);
cin.sin_addr.s_addr = inet_addr(CLI_IP);
//2.2、绑定
if(bind(cfd,(struct sockaddr*)&cin,sizeof(cin)) == -1)
{
perror("bind error");
return -1;
}
printf("绑定IP和端口号成功\n");
//3、连接到服务器
//3.1、创建结构体
struct sockaddr_in sin;
bzero(&sin,sizeof(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.2、发送给服务器,以初始化机械臂
send(cfd, rbuf,sizeof(rbuf), 0);
usleep(100000);
send(cfd, bbuf,sizeof(bbuf), 0);
//4.3、接收终端数据
printf("'w/W' 红色臂角度增大\n");
printf("'s/S' 红色臂角度减小\n");
printf("'d/D' 蓝色臂角度增大\n");
printf("'a/A' 蓝色臂角度减小\n");
printf("'q/Q' 退出\n");
//获取终端输入
char ch;
while(1)
{
//清空ch
ch = '\0';
//获取终端输入
initscr(); // 初始化ncurses模式
//noecho(); // 关闭回显
cbreak(); // 立即获取用户输入,无需等待回车
ch = getch();
//红色臂
if(ch == 'w' || ch == 'W'||ch == 's' || ch == 'S')
{
if((ch == 'w' || ch == 'W') && rbuf[3] < 90)
{
rbuf[3] += 1;
}
else if((ch == 's' || ch == 'S') && rbuf[3] > -90)
{
rbuf[3] -= 1;
}
}
//蓝色臂
else if(ch == 'd' || ch == 'D' || ch == 'a' || ch == 'A')
{
if((ch == 'd' || ch == 'D') && bbuf[3] < 180)
{
bbuf[3] += 1;
}
else if((ch == 'a' || ch == 'A') && bbuf[3] > 0)
{
bbuf[3] -= 1;
}
}
//退出
else if(ch == 'q' || ch == 'Q')
{
break;
}
//发送给服务器
send(cfd, rbuf,sizeof(rbuf), 0);
usleep(100000); //延迟100ms防止粘包
send(cfd, bbuf,sizeof(bbuf), 0);
}
endwin(); // 结束ncurses模式
//5、关闭套接字
close(cfd);
return 0;
}
演示视频
RobArm