c ++ raspberry pi 4-在没有输入/验证的情况下获取键盘键输入吗?

问题描述 投票:-1回答:1

我已经搜索了一段时间,但没有找到任何方法来获取键盘的输入键,以便在程序中使用它们...

上下文:我开始使用机器人技术和C ++,我只是想命令电动机。这个想法是“如果我按下向上箭头,电动机转动,如果我按下向下箭头,电动机停止”,就是这样,不需要验证诸如此类的东西...

我通过VNC(由我的真实计算机控制)使用raspbian,并且实际代码在终端中执行。

我将在后面看到,使其变得更加复杂。

我浏览了20页或更多页面,但没有发现任何有用的信息……难道没有一种简单的方法来完成看上去如此有用的事情吗?

有人谈到了conio库,但是显然它已经过时了,curses / ncurses取代了它,但是我没有找到/有任何可用的方法...http://www.cplusplus.com/forum/general/74211/

Create a function to check for key press in unix using ncurses

Capture characters from standard input without waiting for enter to be pressed

而且,这显然是C代码,而不是C ++,我不太明白...How to detect key presses in a Linux C GUI program without prompting the user?

也许吧?但这对我来说没有任何意义(C ++初学者)How can I get the keyboard state in Linux?

这里他们说的是“ allegro”,但显然,它在PI 45上还不起作用...而且也不知道如何安装它http://www.cplusplus.com/forum/general/47357/

有人知道我可以复制粘贴的简单代码还是以任何方式?我很震惊,没有像Windows C ++编程那么简单的东西]

我的意思是类似“ Keyboard.GetKeyStates(Key)”

无论如何,我将继续我的研究,但请帮助!

编辑:

显然,库SDL(SDL2)可以帮助我做到这一点...我试图实现它,但没有得到任何结果...

这是我到目前为止所掌握的代码(基本上,我删除了这里没有用的大部分),基本上,这是来自Internet SDL官方网页的复制内容:

#include <iostream>
#include <wiringPi.h>   //Raspberry pi GPIO Library
#include <cstdio>
#include <csignal>
#include <ctime>
#include <chrono>   //library for counting time
#include <thread>   //for "this thread sleep"
#include <SDL2/SDL.h>   //for getting the keyboard buttons events

bool RUNNING = true;    // global flag used to exit from the main loop

/*XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  GPIO Pins definition
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX*/
int SPser = 13, SPclk = 19, SPrclk = 26; //Define the output pins used
int Optocoupler = 17; //define the input pins used

/*XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  SDL definition
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX*/

    //void PrintKeyInfo( SDL_KeyboardEvent *key );
    //void PrintModifiers( SDLMod mod );

//SOME CODE

// Callback handler if CTRL-C signal is detected
void my_handler(int s) {
    std::cout << "Detected CTRL-C signal no. " << s << '\n';
    RUNNING = false;
}

//###################################################################################
int main(int argc, char *args[]) {
    // Initialize wiringPi and allow the use of BCM pin numbering
    wiringPiSetupGpio();

    //Initialize SDL
    if (SDL_Init(SDL_INIT_EVENTS) != 0) {
        SDL_Log("Unable to initialize SDL: %s", SDL_GetError());
        return 1;
    }
    else
    {
        SDL_Log("SDL initialized");
    }
    SDL_Event event;

    // Register a callback function to be called if the user presses CTRL-C
    std::signal(SIGINT, my_handler);

    while(RUNNING) 
    {

    while( SDL_PollEvent( &event ) )
    {
    std::cout << "SDL While \n" << '\n';
        //When the user presses a key
        switch( event.type )
        {
        case SDL_KEYDOWN:
        std::cout << "Key press detected \n" << '\n';
            //printf( "Key press detected\n" );
        break;

        case SDL_KEYUP:
        std::cout << "Key release detected \n" << '\n';
            //printf( "Key release detected\n" );
        break;

        default:
        break;
        }
    }
//std::cout << "Works??" << '\n';

    /*for( i = 0; i <= 15; i++ )
    {
        //std::cout << "data input i =" << i << '\n';
        if (i==0){
        //std::cout << "if array " << i << '\n';
        DataArr[i]=1;
        DataArr[15]=0;
        }
        else{
            j=i-1;
            DataArr[j]=0;
            DataArr[i]=1;
            //std::cout << "in else i" << i << " and j " << j << '\n';
        }
    SendData(DataArr);
    }*/
    }
    std::cout << "Program ended ...\n";
}

当我按照本教程“笨拙地”进行操作时,这应该可以工作,但是while循环永远不会输入为“ std :: cout <

但是,当编译完成时,我猜正确安装了SDL库,一切正常...

[执行代码时,它会写“ SDL初始化”,然后,什么都没有...按任何键都不会执行]]

我仍然不确定如何检查该库是否正确安装,但是当我在命令提示符下输入“ sudo apt-get install libsdl2-dev”时,它显示几行并显示“ 0升级,0新已安装,0删除而0未升级“

我已经搜索了一段时间,但没有找到任何方法来获取键盘的输入键,也无法在程序中使用它们...上下文:我正在研究机器人技术和C ++ ,而我只是...

c++ raspberry-pi keyboard-events
1个回答
0
投票

如果您使用的是Linux,则应使用termios停止缓冲

© www.soinside.com 2019 - 2024. All rights reserved.