0
点赞
收藏
分享

微信扫一扫

通过Ubuntu来控制树莓派小车用<<tcp/ip网络编程>>和键盘响应实现,c++来写ubuntu端控制小车的软件,c写的软件放进树莓派芯片里.

就是耍帅 2022-02-13 阅读 75
/*
   本代码是由linux系统捕获w,a,s,d键盘抬起放下
   的c++代码由于本人是初学者,里面注释可能误
   导大家对学术的认知不要见怪,这些api我也找了
   一晚才写出来---------最后如果大家打不开的
   话换要打开的文件把event1到event4都试以下
   在此希望能帮助大家爱------作者:拼命三郎
 */

#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<linux/input.h>
#include<cstdio>
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<arpa/inet.h>
#include<sys/socket.h>

class JP //声明一个键盘类
{
	public: 


		void error_handling( const char *message);

		void jcdqhax(int argc ,char* argv[] );  //实现参成员法
};
int main(int argc ,char* argv[])
{
	int mz=argc;
	char **macha=argv;       
	JP tkcjp;//创建对象
	tkcjp.jcdqhax(mz,macha);  //创建一个键盘对象
	return 0;

}

//检测输入抬起还是按下是生马等等
void  JP::jcdqhax( int argc ,char* argv[]) {
	struct input_event mykey;   //定义一个读取按键的结构体
	int fd;
	if((fd=open("/dev/input/event1",O_RDONLY))==-1)  //打开按键文件
	{

		perror("open error");
		exit(0); 

	}






	int serv_sock;
	int clnt_sock;

	struct sockaddr_in serv_addr;
	struct sockaddr_in clnt_addr;
	socklen_t clnt_addr_size;

	char message[] = "Hello World!";
	char ws[]="11";
	char wx[]="12";
	char ds[]="13";
	char dx[]="14";
	char ss[]="15";
	char sx[]="16";
	char as[]="17";
	char ax[]="18";

	if (argc != 2)
	{
		printf("Usage : %s <port>\n", argv[0]);
		exit(1);
	}

	serv_sock = socket(PF_INET, SOCK_STREAM, 0);
	if (serv_sock == -1)
	{
		error_handling("socket() error"); 
	}

	memset(&serv_addr, 0, sizeof(serv_addr));
	serv_addr.sin_family = AF_INET;
	serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	serv_addr.sin_port = htons(atoi(argv[1]));

	if (bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1)
	{
		error_handling("bind() error");
	}

	if (listen(serv_sock, 5) == -1)
	{
		error_handling("listen() error");
	}

	clnt_addr_size = sizeof(clnt_addr);
	clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size);
	if (clnt_sock == -1)
	{
		error_handling("accept() error");
	}

	write(clnt_sock, message, sizeof(message));




	while(1)
	{

		read(fd,&mykey,sizeof(mykey));
		if(mykey.type==EV_KEY)
		{
			printf("type:%#x,code:%d,value:%#x\n",mykey.type,mykey.code,mykey.value);

			switch(mykey.code)
			{
				case 17:

					if(mykey.value==1)
					{

						std::cout<<"w键按下了"<<std::endl;
						write(clnt_sock, ws, sizeof(ws));

					}

					if(mykey.value==0)
					{
						printf("w按键台起了\n");
						write(clnt_sock, wx, sizeof(wx));
					}
					if(mykey.value==2)
					{
						printf("w按键一直按下\n");
					}
					break;

				case 30:

					if(mykey.value==1)
					{
						//switch(mykey.code)

						printf("a按键按下了\n");
						write(clnt_sock, as, sizeof(as));
					}

					if(mykey.value==0)
					{
						printf("a按键台起了\n");
						write(clnt_sock, ax, sizeof(ax));
					}
					if(mykey.value==2)
					{
						printf("a按键一直按下\n");

					}
					break;

				case 31:

					if(mykey.value==1)
					{


						printf("s按键按下了\n");
						write(clnt_sock, ss, sizeof(ss));
					}

					if(mykey.value==0)
					{
						printf("s按键台起了\n");
						write(clnt_sock, sx, sizeof(sx));
					}
					if(mykey.value==2)
					{
						std::cout<<"s键一直按下"<<std::endl;
					}
					break;

				case 32:


					if(mykey.value==1)
					{

						printf("d按键按下了\n");
						write(clnt_sock, ds, sizeof(sx));
					}

					if(mykey.value==0)
					{
						printf("d按键台起了\n");

						write(clnt_sock, dx, sizeof(dx));
					}
					if(mykey.value==2)
					{
						printf("d按键一直按下\n");

					}
					break;
			}
		}


	}
	close(clnt_sock);
	close(serv_sock);


}



void JP::error_handling( const char *message)
{
	fputs(message, stderr);
	fputc('\n', stderr);
	exit(1);
}

上面的是控制代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
void error_handling(char *message);

int main(int argc, char* argv[])
{
    int sock;
    struct sockaddr_in serv_addr;
    char message[30];
    int str_len;

    if (argc != 3)
    {
        printf("Usage : %s <IP> <port>\n", argv[0]);
        exit(1);
    }

    sock = socket(PF_INET, SOCK_STREAM, 0);
    if (sock == -1)
    {
        error_handling("socket() error");
    }

    memset(&serv_addr, 0, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
    serv_addr.sin_port = htons(atoi(argv[2]));

    if (connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1)
    {
        error_handling("connect() error!");
    }

    str_len = read(sock, message, sizeof(message) - 1);
    if (str_len == -1)
    {
        error_handling("read() error!");
    }

    printf("Message from server : %s \n", message);
    while(1)
    {
    
    str_len = read(sock, message, sizeof(message) - 1);
    if (str_len == -1)
    {
        error_handling("read() error!");
    }
    if(strcmp(message,"11")==0)
    {
    printf("小车向前走\n");
    printf("Message from server : %s \n", message);
    }
    
    if(strcmp(message,"12")==0)
    {
    printf("小车向前走这走这突然停下来了\n");
    printf("Message from server : %s \n", message);
    }

    if(strcmp(message,"15")==0)
    {
    printf("小车向后退\n");
    printf("Message from server : %s \n", message);
    }

    if(strcmp(message,"16")==0)
    {
    printf("小车向后退这突然停了下来\n");
    printf("Message from server : %s \n", message);
    }
    

    if(strcmp(message,"17")==0)
    {
    printf("小车向左走\n");
    printf("Message from server : %s \n", message);
    }

    if(strcmp(message,"18")==0)
    {
    printf("小车向左走突然停下来了\n");
    printf("Message from server : %s \n", message);
    }

    if(strcmp(message,"13")==0)
    {
    printf("小车向右走\n");
    printf("Message from server : %s \n", message);
    }

    if(strcmp(message,"14")==0)
    {
    printf("小车向右走突然停下来了\n");
    printf("Message from server : %s \n", message);
    }
    }
    close(sock);
    return 0;
}

void error_handling(char *message)
{
    fputs(message, stderr);
    fputc('\n', stderr);
    exit(1);
}

下面的是放到树莓派里面的

控制端:a.out  8989

树莓派芯片linux: a.out  127.0.0.1(根据不同情况来写的ubuntuIP地址)   8989

我在补充一点端口号尽量不要小于500!

举报

相关推荐

0 条评论