晴天有时下雨_ 2020-05-27 16:15 采纳率: 0%
浏览 190
已结题

如果在Linux下设计一个快捷键应用程序?

设计一个游戏快捷键app,使用键盘和串口进行组合,制定几个特殊的按键作为游戏快捷键,按下时通过串口输出相应的功能信息。可通过串口发送指令对各快捷键的功能进行重定义。并尝试使用Makefile文件实现代码的自动编译。
给了键盘和串口的源代码

键盘的代码如下:
#include <termio.h>
#include <stdio.h> 

int scanKeyboard()
{
    int in;
    struct termios new_settings;
    struct termios stored_settings;
    tcgetattr(0,&stored_settings);
    new_settings = stored_settings;
    //通过tcsetattr函数设置terminal的属性来控制需不需要回车来结束输入  ICANON
    new_settings.c_lflag &= (~ICANON);
    new_settings.c_cc[VTIME] = 0;
//  tcgetattr(0,&stored_settings);
    new_settings.c_cc[VMIN] = 1;
    tcsetattr(0,TCSANOW,&new_settings);

    in = getchar();

    tcsetattr(0,TCSANOW,&stored_settings);
    return in;
}

//测试函数
int main(){
while(1){
printf(":%d",scanKeyboard());
}
}

串口代码如下:
```#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/types.h>
#include <termios.h>
#include <sys/stat.h>
#include <errno.h>


int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)
{
        struct termios newtio,oldtio;
        if  ( tcgetattr( fd,&oldtio)  !=  0) { 
            perror("SetupSerial 1");
            return -1;
        }
        bzero( &newtio, sizeof( newtio ) );
        newtio.c_cflag  |=  CLOCAL | CREAD;
        newtio.c_cflag &= ~CSIZE;

        switch( nBits )
        {
            case 7:
                newtio.c_cflag |= CS7;
                break;
            case 8:
                newtio.c_cflag |= CS8;
                break;
        }

        switch( nEvent )
        {
        case 'O':
            newtio.c_cflag |= PARENB;
            newtio.c_cflag |= PARODD;
            newtio.c_iflag |= (INPCK | ISTRIP);
            break;
        case 'E': 
            newtio.c_iflag |= (INPCK | ISTRIP);
            newtio.c_cflag |= PARENB;
            newtio.c_cflag &= ~PARODD;
            break;
        case 'N':  
            newtio.c_cflag &= ~PARENB;
            break;
        }

        switch( nSpeed )
        {
            case 2400:
                cfsetispeed(&newtio, B2400);
                cfsetospeed(&newtio, B2400);
                break;
            case 4800:
                cfsetispeed(&newtio, B4800);
                cfsetospeed(&newtio, B4800);
                break;
            case 9600:
                cfsetispeed(&newtio, B9600);
                cfsetospeed(&newtio, B9600);
                break;
            case 115200:
                cfsetispeed(&newtio, B115200);
                cfsetospeed(&newtio, B115200);
                break;
            case 460800:
                cfsetispeed(&newtio, B460800);
                cfsetospeed(&newtio, B460800);
                break;
            default:
                cfsetispeed(&newtio, B9600);
                cfsetospeed(&newtio, B9600);
                break;
        }
        if( nStop == 1 )
            newtio.c_cflag &=  ~CSTOPB;
        else if ( nStop == 2 )
            newtio.c_cflag |=  CSTOPB;
            newtio.c_cc[VTIME]  = 0;
            newtio.c_cc[VMIN] = 0;
            tcflush(fd,TCIFLUSH);
        if((tcsetattr(fd,TCSANOW,&newtio))!=0)
        {
            perror("com set error");
            return -1;
        }

            printf("串口设置完成!\n\r");
        return 0;
}

void main()
{
    int fd,nByte;
    char *uart3 = "/dev/ttySAC3";
    char *uart_out="请输入:\n";
    char buff[512];
    memset(buff,0,sizeof(buff));
    if((fd=open(uart3,O_RDWR | O_NOCTTY))<0)
    {
        printf("打开失败\n");
    }else
    {
        set_opt(fd,115200,8,'N',1);
        write(fd,uart_out,strlen(uart_out));
        while(1)
        {
            while((nByte=read(fd,buff,512))>0)
            {
                buff[nByte+1]='\0';
                write(fd,buff,strlen(buff));
                memset(buff,0,strlen(buff));
                nByte=0;
            }
        }
    }

}

  • 写回答

2条回答 默认 最新

  • threenewbee 2020-05-27 16:49
    关注
    评论

报告相同问题?

悬赏问题

  • ¥20 matlab计算中误差
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制
  • ¥20 usb设备兼容性问题
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊