Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android uart_sendevent_键盘(dev_kb,0,0,0); uart_sendevent_键盘(dev_kb,1105,0); uart_sendevent_键盘(dev_kb,0,0,0); } else if(输出_buf[i+2]==6){ printf(“==>Detect RIGHT\n”); uart_sendevent_键盘(dev_kb,1106,1); uart_sendevent_键盘(dev_kb,0,0,0); uart_sendevent_键盘(dev_kb,1106,0); uart_sendevent_键盘(dev_kb,0,0,0); } } } //记录时间 gettimeofday(&last_receive_time,NULL); //如果我们从uart获取命令,则将其发送到套接字 pthread_create(&send_thread,NULL,socket_send_handler,(void*)output_buf); } FD_CLR(ut.FD和readFds); 关闭_端口(); 返回0; } void*socket\u receive\u处理程序(){ 内特莱尼特,i; adr clnt中的结构sockaddr\u; 未签名字符socket_buf[bufsize],socket_buf_show[bufsize]; 我的地址中的结构sockaddr\u; pthread_t write_线程; 我的地址sin家庭=AFINET; 我的地址sin港口=htons(10000); my_addr.sin_addr.s_addr=htonl(INADDR_ANY); bzero(&(我的地址sin_zero),8); if((sockfd=socket(AF_INET,SOCK_DGRAM,0))=-1){ 佩罗(“插座”); 出口(1); } if(bind(sockfd,(struct sockaddr*)和my_addr,sizeof(struct sockaddr))=-1){ perror(“绑定错误”); 出口(1); } 而(1){ len_inet=日均房价的大小; memset(插座尺寸,0,尺寸); udp_receive=recvfrom(sockfd,//Socket socket\u buf,//接收缓冲区 插槽大小\u buf,//最大recv buf大小 0,//标志:无选项 (结构sockaddr*)&adr\u clnt,//Addr &len_inet);//添加len,输入和输出 如果(udp_接收_Android_C_Select - Fatal编程技术网

Android uart_sendevent_键盘(dev_kb,0,0,0); uart_sendevent_键盘(dev_kb,1105,0); uart_sendevent_键盘(dev_kb,0,0,0); } else if(输出_buf[i+2]==6){ printf(“==>Detect RIGHT\n”); uart_sendevent_键盘(dev_kb,1106,1); uart_sendevent_键盘(dev_kb,0,0,0); uart_sendevent_键盘(dev_kb,1106,0); uart_sendevent_键盘(dev_kb,0,0,0); } } } //记录时间 gettimeofday(&last_receive_time,NULL); //如果我们从uart获取命令,则将其发送到套接字 pthread_create(&send_thread,NULL,socket_send_handler,(void*)output_buf); } FD_CLR(ut.FD和readFds); 关闭_端口(); 返回0; } void*socket\u receive\u处理程序(){ 内特莱尼特,i; adr clnt中的结构sockaddr\u; 未签名字符socket_buf[bufsize],socket_buf_show[bufsize]; 我的地址中的结构sockaddr\u; pthread_t write_线程; 我的地址sin家庭=AFINET; 我的地址sin港口=htons(10000); my_addr.sin_addr.s_addr=htonl(INADDR_ANY); bzero(&(我的地址sin_zero),8); if((sockfd=socket(AF_INET,SOCK_DGRAM,0))=-1){ 佩罗(“插座”); 出口(1); } if(bind(sockfd,(struct sockaddr*)和my_addr,sizeof(struct sockaddr))=-1){ perror(“绑定错误”); 出口(1); } 而(1){ len_inet=日均房价的大小; memset(插座尺寸,0,尺寸); udp_receive=recvfrom(sockfd,//Socket socket\u buf,//接收缓冲区 插槽大小\u buf,//最大recv buf大小 0,//标志:无选项 (结构sockaddr*)&adr\u clnt,//Addr &len_inet);//添加len,输入和输出 如果(udp_接收

Android uart_sendevent_键盘(dev_kb,0,0,0); uart_sendevent_键盘(dev_kb,1105,0); uart_sendevent_键盘(dev_kb,0,0,0); } else if(输出_buf[i+2]==6){ printf(“==>Detect RIGHT\n”); uart_sendevent_键盘(dev_kb,1106,1); uart_sendevent_键盘(dev_kb,0,0,0); uart_sendevent_键盘(dev_kb,1106,0); uart_sendevent_键盘(dev_kb,0,0,0); } } } //记录时间 gettimeofday(&last_receive_time,NULL); //如果我们从uart获取命令,则将其发送到套接字 pthread_create(&send_thread,NULL,socket_send_handler,(void*)output_buf); } FD_CLR(ut.FD和readFds); 关闭_端口(); 返回0; } void*socket\u receive\u处理程序(){ 内特莱尼特,i; adr clnt中的结构sockaddr\u; 未签名字符socket_buf[bufsize],socket_buf_show[bufsize]; 我的地址中的结构sockaddr\u; pthread_t write_线程; 我的地址sin家庭=AFINET; 我的地址sin港口=htons(10000); my_addr.sin_addr.s_addr=htonl(INADDR_ANY); bzero(&(我的地址sin_zero),8); if((sockfd=socket(AF_INET,SOCK_DGRAM,0))=-1){ 佩罗(“插座”); 出口(1); } if(bind(sockfd,(struct sockaddr*)和my_addr,sizeof(struct sockaddr))=-1){ perror(“绑定错误”); 出口(1); } 而(1){ len_inet=日均房价的大小; memset(插座尺寸,0,尺寸); udp_receive=recvfrom(sockfd,//Socket socket\u buf,//接收缓冲区 插槽大小\u buf,//最大recv buf大小 0,//标志:无选项 (结构sockaddr*)&adr\u clnt,//Addr &len_inet);//添加len,输入和输出 如果(udp_接收,android,c,select,Android,C,Select,#include "ts_uart_common.h" int writeport(int *fd, unsigned char *chars,int len) { int lock_result = -1; /* Lock. */ do{ lock_result = pthread_mutex_lock(&params.mutex); }while(lock_result != 0); /* Work. */ i



#include "ts_uart_common.h"

int writeport(int *fd, unsigned char *chars,int len) {
    int lock_result = -1;

    /* Lock.  */
    do{
        lock_result = pthread_mutex_lock(&params.mutex);
    }while(lock_result != 0);

    /* Work.  */
    int n = write(*fd, chars,len);

    /* Unlock and signal completion.  */
    pthread_mutex_unlock(&params.mutex);
    pthread_cond_signal (&params.done);

    if (n < 0) {
        fputs("write failed!\n", stderr);
        return 0;
    }
    return n;
}

int readport(int *fd, unsigned char *result) {
    int iIn=0;
    iIn = read(*fd, result, bufsize);
    tcflush(*fd, TCIFLUSH);
    if (iIn < 0) {
        if (errno == EAGAIN) {
                //printf("SERIAL EAGAIN ERROR\n");
                return 0;
        } else {
              //printf("SERIAL read error %d %s\n", errno, strerror(errno));
                return 0;
        }
    }
        return iIn;
}


int getbaud(int fd) {
        struct termios termAttr;
        int Speed = -1;
        speed_t baudRate;
        tcgetattr(fd, &termAttr);
        /* Get the input speed.                              */
        baudRate = cfgetispeed(&termAttr);
    switch (baudRate) {
            case B300:    Speed = 300; break;
            case B600:    Speed = 600; break;
            case B1200:   Speed = 1200; break;
            case B1800:   Speed = 1800; break;
            case B2400:   Speed = 2400; break;
            case B4800:   Speed = 4800; break;
            case B9600:   Speed = 9600; break;
            case B19200:  Speed = 19200; break;
            case B38400:  Speed = 38400; break;
            case B115200: Speed = 115200; break;
            case B230400: Speed = 230400; break;
            case B460800: Speed = 460800; break;
            case B500000: Speed = 500000; break;
            case B576000: Speed = 576000; break;
            case B921600: Speed = 921600; break;
            case B1000000:Speed = 1000000; break;
            case B1152000:Speed = 1152000; break;
            case B1500000:Speed = 1500000; break;
            case B2000000:Speed = 2000000; break;
            case B2500000:Speed = 2500000; break;
            case B3000000:Speed = 3000000; break;
            case B3500000:Speed = 3500000; break;
    }
    return Speed;
}

int initport(int fd,long baudrate,int flow_ctrl) 
{
    struct termios options;
        memset(&options, 0 , sizeof(options));
        if(ERROR == tcgetattr(fd, &options)) {
                perror("tcgetattr: ");
                return ERROR;
        }

    switch (baudrate) {
        case 300:   cfsetispeed(&options,B300); 
                cfsetospeed(&options,B300);
                options.c_cflag |= B300 | CBAUD;
                break;
        case 600:   cfsetispeed(&options,B600);
                cfsetospeed(&options,B600);
                options.c_cflag |= B600 | CBAUD;
                break;
        case 1200:  cfsetispeed(&options,B1200);
                cfsetospeed(&options,B1200);
                options.c_cflag |= B1200 | CBAUD;
                break;
        case 1800:  cfsetispeed(&options,B1800);
                cfsetospeed(&options,B1800);
                options.c_cflag |= B1800 | CBAUD;
                break;
        case 2400:  cfsetispeed(&options,B2400);
                cfsetospeed(&options,B2400);
                options.c_cflag |= B2400 | CBAUD;
                break;
        case 4800:  cfsetispeed(&options,B4800);
                cfsetospeed(&options,B4800);
                options.c_cflag |= B4800 | CBAUD;
                break;
        case 9600:  
        default:    cfsetispeed(&options,B9600);
                cfsetospeed(&options,B9600);
                options.c_cflag |= B9600 | CBAUD;
                break;
        case 19200: cfsetispeed(&options,B19200);
                cfsetospeed(&options,B19200);
                options.c_cflag |= B19200 | CBAUD;
                break;
        case 38400: cfsetispeed(&options,B38400);
                cfsetospeed(&options,B38400);
                options.c_cflag |= B38400 | CBAUD;
                break;
        case 115200:    cfsetispeed(&options,B115200);
                cfsetospeed(&options,B115200);
                options.c_cflag |= B115200 | CBAUDEX;
                break;
        case 230400:    cfsetispeed(&options,B230400);
                cfsetospeed(&options,B230400);
                options.c_cflag |= B230400 | CBAUDEX;
                break;
        case 460800:    cfsetispeed(&options,B460800);
                cfsetospeed(&options,B460800);
                options.c_cflag |= B460800 | CBAUDEX;
                break;
        case 500000:    cfsetispeed(&options,B500000);
                cfsetospeed(&options,B500000);
                options.c_cflag |= B500000 | CBAUDEX;
                break;
        case 576000:    cfsetispeed(&options,B576000);
                cfsetospeed(&options,B576000);
                options.c_cflag |= B576000 | CBAUDEX;
                break;
        case 921600:    cfsetispeed(&options,B921600);
                cfsetospeed(&options,B921600);
                options.c_cflag |= B921600 | CBAUDEX;
                break;
        case 1000000:   cfsetispeed(&options,B1000000);
                cfsetospeed(&options,B1000000);
                options.c_cflag |= B1000000 | CBAUDEX;
                break;
        case 1152000:   cfsetispeed(&options,B1152000);
                cfsetospeed(&options,B1152000);
                options.c_cflag |= B1152000 | CBAUDEX;
                break;
        case 1500000:   cfsetispeed(&options,B1500000);
                cfsetospeed(&options,B1500000);
                options.c_cflag |= B1500000 | CBAUDEX;
                break;
        case 2000000:   cfsetispeed(&options,B2000000);
                cfsetospeed(&options,B2000000);
                options.c_cflag |= B2000000 | CBAUDEX;
                break;
        case 2500000:   cfsetispeed(&options,B2500000);
                cfsetospeed(&options,B2500000);
                options.c_cflag |= B2500000 | CBAUDEX;
                break;
        case 3000000:   cfsetispeed(&options,B3000000);
                cfsetospeed(&options,B3000000);
                options.c_cflag |= B3000000 | CBAUDEX;
                break;
        case 3500000:   cfsetispeed(&options,B3500000);
                cfsetospeed(&options,B3500000);
                options.c_cflag |= B3500000 | CBAUDEX;
                break;
    }

    /* Enable or Disable Hardware flow control. */
    if(!flow_ctrl) {
        options.c_cflag &= ~CRTSCTS;
        //printf("Flow control disabled \n");
    }
    else {
        options.c_cflag |= CRTSCTS;
        //printf("Flow control enabled \n");
    }

        /* No Parity, 8N1. */
        options.c_cflag &= ~PARENB; // No parity bit
        options.c_cflag &= ~CSTOPB; // 1 stop bit
        options.c_cflag &= ~CSIZE;  // character size 8
        options.c_cflag |=  CS8 ;

        /* Hardware Control Options - Set local mode and Enable receiver to receive characters */
        options.c_cflag     |= (CLOCAL | CREAD );

        /* Terminal Control options */
        /* - Disable signals. Disable canonical input processing. Disable echo. */
        options.c_lflag     &= ~(ICANON | IEXTEN | ECHO | ISIG); /* Line options - Raw input */

        options.c_iflag     &= ~(ICRNL | INPCK | ISTRIP | BRKINT | IXON | IXOFF | IXANY);
        /* Output processing - Disable post processing of output. */
        options.c_oflag     &= ~OPOST;      /* Output options - Raw output */
        /* Control Characters - Min. no. of characters */
        options.c_cc[VMIN]  = 0;
        /* Character/Packet timeouts. */
        options.c_cc[VTIME] = 3;

    if(ERROR == tcflush(fd,TCOFLUSH) ) {
                  //printf("tcflush failed");
                  return ERROR;
        }

    if(ERROR == tcsetattr(fd, TCSANOW, &options))  {
                //printf("Error: Couldn't configure Serial port " );
                return ERROR;
        }

/*
    //printf("\n\n");
    system("stty -F /dev/ttyS0 -a");
    //printf("\n\n"); 
*/
    return SUCCESS;
}


void signalHandler()
{
    //printf("\n Closing device %s\n",UART_DEV_NAME);
    close_port();
}

void close_port()
{
    /* Destroy all synchronization primitives.  */    
    pthread_mutex_destroy (&params.mutex);
    pthread_cond_destroy (&params.done);

    tcsetattr(ut.fd, TCSANOW, &oldtio);
    if(tx_rx == 'r')
        close(fd2);
    else
     close(fd1);

    close(ut.fd);
    exit(1);
}

int uart_sendevent_keyboard(int dev_kb, int type, int code, int value) {
    int i;
    int fd;
    int ret;
    int version;
    struct input_event event;

    if (ioctl(dev_kb, EVIOCGVERSION, &version)) {
        return 1;
    }
    memset(&event, 0, sizeof(event));
    event.type = type;
    event.code = code;
    event.value = value;
    ret = write(dev_kb, &event, sizeof(event));
    if(ret < sizeof(event)) {
        return -1;
    }

    return 0;
}

 int timeval_subtract (struct timeval * result, struct timeval * x, struct timeval * y) {
   /* Perform the carry for the later subtraction by updating y. */
   if (x->tv_usec < y->tv_usec) {
     int nsec = (y->tv_usec - x->tv_usec) / 1000000 + 1;
     y->tv_usec -= 1000000 * nsec;
     y->tv_sec += nsec;
   }
   if (x->tv_usec - y->tv_usec > 1000000) {
     int nsec = (x->tv_usec - y->tv_usec) / 1000000;
     y->tv_usec += 1000000 * nsec;
     y->tv_sec -= nsec;
   }

   /* Compute the time remaining to wait.
      tv_usec is certainly positive. */
   result->tv_sec = x->tv_sec - y->tv_sec;
   result->tv_usec = x->tv_usec - y->tv_usec;

   /* Return 1 if result is negative. */
   return x->tv_sec < y->tv_sec;
 }

 int read_ints (const char* file_name) {
     int i = 50;
     if( access( file_name, F_OK ) == 0 ) {
       FILE* file = fopen (file_name, "r");
       fscanf (file, "%d", &i);    
       while (!feof (file)) {
         fscanf (file, "%d", &i);      
       }
       fclose (file);
    }

    return i * 1000;  
}

 void write_ints (const char* file_name, int value) {
    FILE* file = fopen (file_name, "w+");
    fprintf(file, "%d", value);
    fclose (file);
}
t\u uart\u common.c

#include "ts_uart_common.h"

int writeport(int *fd, unsigned char *chars,int len) {
    int lock_result = -1;

    /* Lock.  */
    do{
        lock_result = pthread_mutex_lock(&params.mutex);
    }while(lock_result != 0);

    /* Work.  */
    int n = write(*fd, chars,len);

    /* Unlock and signal completion.  */
    pthread_mutex_unlock(&params.mutex);
    pthread_cond_signal (&params.done);

    if (n < 0) {
        fputs("write failed!\n", stderr);
        return 0;
    }
    return n;
}

int readport(int *fd, unsigned char *result) {
    int iIn=0;
    iIn = read(*fd, result, bufsize);
    tcflush(*fd, TCIFLUSH);
    if (iIn < 0) {
        if (errno == EAGAIN) {
                //printf("SERIAL EAGAIN ERROR\n");
                return 0;
        } else {
              //printf("SERIAL read error %d %s\n", errno, strerror(errno));
                return 0;
        }
    }
        return iIn;
}


int getbaud(int fd) {
        struct termios termAttr;
        int Speed = -1;
        speed_t baudRate;
        tcgetattr(fd, &termAttr);
        /* Get the input speed.                              */
        baudRate = cfgetispeed(&termAttr);
    switch (baudRate) {
            case B300:    Speed = 300; break;
            case B600:    Speed = 600; break;
            case B1200:   Speed = 1200; break;
            case B1800:   Speed = 1800; break;
            case B2400:   Speed = 2400; break;
            case B4800:   Speed = 4800; break;
            case B9600:   Speed = 9600; break;
            case B19200:  Speed = 19200; break;
            case B38400:  Speed = 38400; break;
            case B115200: Speed = 115200; break;
            case B230400: Speed = 230400; break;
            case B460800: Speed = 460800; break;
            case B500000: Speed = 500000; break;
            case B576000: Speed = 576000; break;
            case B921600: Speed = 921600; break;
            case B1000000:Speed = 1000000; break;
            case B1152000:Speed = 1152000; break;
            case B1500000:Speed = 1500000; break;
            case B2000000:Speed = 2000000; break;
            case B2500000:Speed = 2500000; break;
            case B3000000:Speed = 3000000; break;
            case B3500000:Speed = 3500000; break;
    }
    return Speed;
}

int initport(int fd,long baudrate,int flow_ctrl) 
{
    struct termios options;
        memset(&options, 0 , sizeof(options));
        if(ERROR == tcgetattr(fd, &options)) {
                perror("tcgetattr: ");
                return ERROR;
        }

    switch (baudrate) {
        case 300:   cfsetispeed(&options,B300); 
                cfsetospeed(&options,B300);
                options.c_cflag |= B300 | CBAUD;
                break;
        case 600:   cfsetispeed(&options,B600);
                cfsetospeed(&options,B600);
                options.c_cflag |= B600 | CBAUD;
                break;
        case 1200:  cfsetispeed(&options,B1200);
                cfsetospeed(&options,B1200);
                options.c_cflag |= B1200 | CBAUD;
                break;
        case 1800:  cfsetispeed(&options,B1800);
                cfsetospeed(&options,B1800);
                options.c_cflag |= B1800 | CBAUD;
                break;
        case 2400:  cfsetispeed(&options,B2400);
                cfsetospeed(&options,B2400);
                options.c_cflag |= B2400 | CBAUD;
                break;
        case 4800:  cfsetispeed(&options,B4800);
                cfsetospeed(&options,B4800);
                options.c_cflag |= B4800 | CBAUD;
                break;
        case 9600:  
        default:    cfsetispeed(&options,B9600);
                cfsetospeed(&options,B9600);
                options.c_cflag |= B9600 | CBAUD;
                break;
        case 19200: cfsetispeed(&options,B19200);
                cfsetospeed(&options,B19200);
                options.c_cflag |= B19200 | CBAUD;
                break;
        case 38400: cfsetispeed(&options,B38400);
                cfsetospeed(&options,B38400);
                options.c_cflag |= B38400 | CBAUD;
                break;
        case 115200:    cfsetispeed(&options,B115200);
                cfsetospeed(&options,B115200);
                options.c_cflag |= B115200 | CBAUDEX;
                break;
        case 230400:    cfsetispeed(&options,B230400);
                cfsetospeed(&options,B230400);
                options.c_cflag |= B230400 | CBAUDEX;
                break;
        case 460800:    cfsetispeed(&options,B460800);
                cfsetospeed(&options,B460800);
                options.c_cflag |= B460800 | CBAUDEX;
                break;
        case 500000:    cfsetispeed(&options,B500000);
                cfsetospeed(&options,B500000);
                options.c_cflag |= B500000 | CBAUDEX;
                break;
        case 576000:    cfsetispeed(&options,B576000);
                cfsetospeed(&options,B576000);
                options.c_cflag |= B576000 | CBAUDEX;
                break;
        case 921600:    cfsetispeed(&options,B921600);
                cfsetospeed(&options,B921600);
                options.c_cflag |= B921600 | CBAUDEX;
                break;
        case 1000000:   cfsetispeed(&options,B1000000);
                cfsetospeed(&options,B1000000);
                options.c_cflag |= B1000000 | CBAUDEX;
                break;
        case 1152000:   cfsetispeed(&options,B1152000);
                cfsetospeed(&options,B1152000);
                options.c_cflag |= B1152000 | CBAUDEX;
                break;
        case 1500000:   cfsetispeed(&options,B1500000);
                cfsetospeed(&options,B1500000);
                options.c_cflag |= B1500000 | CBAUDEX;
                break;
        case 2000000:   cfsetispeed(&options,B2000000);
                cfsetospeed(&options,B2000000);
                options.c_cflag |= B2000000 | CBAUDEX;
                break;
        case 2500000:   cfsetispeed(&options,B2500000);
                cfsetospeed(&options,B2500000);
                options.c_cflag |= B2500000 | CBAUDEX;
                break;
        case 3000000:   cfsetispeed(&options,B3000000);
                cfsetospeed(&options,B3000000);
                options.c_cflag |= B3000000 | CBAUDEX;
                break;
        case 3500000:   cfsetispeed(&options,B3500000);
                cfsetospeed(&options,B3500000);
                options.c_cflag |= B3500000 | CBAUDEX;
                break;
    }

    /* Enable or Disable Hardware flow control. */
    if(!flow_ctrl) {
        options.c_cflag &= ~CRTSCTS;
        //printf("Flow control disabled \n");
    }
    else {
        options.c_cflag |= CRTSCTS;
        //printf("Flow control enabled \n");
    }

        /* No Parity, 8N1. */
        options.c_cflag &= ~PARENB; // No parity bit
        options.c_cflag &= ~CSTOPB; // 1 stop bit
        options.c_cflag &= ~CSIZE;  // character size 8
        options.c_cflag |=  CS8 ;

        /* Hardware Control Options - Set local mode and Enable receiver to receive characters */
        options.c_cflag     |= (CLOCAL | CREAD );

        /* Terminal Control options */
        /* - Disable signals. Disable canonical input processing. Disable echo. */
        options.c_lflag     &= ~(ICANON | IEXTEN | ECHO | ISIG); /* Line options - Raw input */

        options.c_iflag     &= ~(ICRNL | INPCK | ISTRIP | BRKINT | IXON | IXOFF | IXANY);
        /* Output processing - Disable post processing of output. */
        options.c_oflag     &= ~OPOST;      /* Output options - Raw output */
        /* Control Characters - Min. no. of characters */
        options.c_cc[VMIN]  = 0;
        /* Character/Packet timeouts. */
        options.c_cc[VTIME] = 3;

    if(ERROR == tcflush(fd,TCOFLUSH) ) {
                  //printf("tcflush failed");
                  return ERROR;
        }

    if(ERROR == tcsetattr(fd, TCSANOW, &options))  {
                //printf("Error: Couldn't configure Serial port " );
                return ERROR;
        }

/*
    //printf("\n\n");
    system("stty -F /dev/ttyS0 -a");
    //printf("\n\n"); 
*/
    return SUCCESS;
}


void signalHandler()
{
    //printf("\n Closing device %s\n",UART_DEV_NAME);
    close_port();
}

void close_port()
{
    /* Destroy all synchronization primitives.  */    
    pthread_mutex_destroy (&params.mutex);
    pthread_cond_destroy (&params.done);

    tcsetattr(ut.fd, TCSANOW, &oldtio);
    if(tx_rx == 'r')
        close(fd2);
    else
     close(fd1);

    close(ut.fd);
    exit(1);
}

int uart_sendevent_keyboard(int dev_kb, int type, int code, int value) {
    int i;
    int fd;
    int ret;
    int version;
    struct input_event event;

    if (ioctl(dev_kb, EVIOCGVERSION, &version)) {
        return 1;
    }
    memset(&event, 0, sizeof(event));
    event.type = type;
    event.code = code;
    event.value = value;
    ret = write(dev_kb, &event, sizeof(event));
    if(ret < sizeof(event)) {
        return -1;
    }

    return 0;
}

 int timeval_subtract (struct timeval * result, struct timeval * x, struct timeval * y) {
   /* Perform the carry for the later subtraction by updating y. */
   if (x->tv_usec < y->tv_usec) {
     int nsec = (y->tv_usec - x->tv_usec) / 1000000 + 1;
     y->tv_usec -= 1000000 * nsec;
     y->tv_sec += nsec;
   }
   if (x->tv_usec - y->tv_usec > 1000000) {
     int nsec = (x->tv_usec - y->tv_usec) / 1000000;
     y->tv_usec += 1000000 * nsec;
     y->tv_sec -= nsec;
   }

   /* Compute the time remaining to wait.
      tv_usec is certainly positive. */
   result->tv_sec = x->tv_sec - y->tv_sec;
   result->tv_usec = x->tv_usec - y->tv_usec;

   /* Return 1 if result is negative. */
   return x->tv_sec < y->tv_sec;
 }

 int read_ints (const char* file_name) {
     int i = 50;
     if( access( file_name, F_OK ) == 0 ) {
       FILE* file = fopen (file_name, "r");
       fscanf (file, "%d", &i);    
       while (!feof (file)) {
         fscanf (file, "%d", &i);      
       }
       fclose (file);
    }

    return i * 1000;  
}

 void write_ints (const char* file_name, int value) {
    FILE* file = fopen (file_name, "w+");
    fprintf(file, "%d", value);
    fclose (file);
}
#包括“ts_uart_common.h”
int writeport(int*fd,无符号字符*chars,int len){
int lock_result=-1;
/*锁*/
做{
lock_result=pthread_mutex_lock(¶ms.mutex);
}while(lock_result!=0);
/*工作*/
int n=写入(*fd,chars,len);
/*解锁和信号完成*/
pthread_mutex_unlock(¶ms.mutex);
pthread_cond_信号(¶ms.done);
if(n<0){
fputs(“写入失败!\n”,stderr);
返回0;
}
返回n;
}
int readport(int*fd,无符号字符*结果){
int-iIn=0;
iIn=读取(*fd,结果,bufsize);
tcflush(*fd,TCIFLUSH);
如果(iIn<0){
if(errno==EAGAIN){
//printf(“串行EAGAIN错误\n”);
返回0;
}否则{
//printf(“串行读取错误%d%s\n”,errno,strerror(errno));
返回0;
}
}
返回iIn;
}
int getbaud(int fd){
结构termios termAttr;
整数速度=-1;
速率;
tcgetattr(fd和termAttr);
/*获取输入速度*/
波特率=cfgetispeed(&termAttr);
交换机(波特率){
案例B300:速度=300;中断;
案例B600:速度=600;中断;
案例B1200:速度=1200;中断;
案例B1800:速度=1800;中断;
案例B2400:速度=2400;中断;
案例B4800:速度=4800;中断;
案例B9600:速度=9600;中断;
案例B19200:速度=19200;中断;
案例B38400:速度=38400;中断;
案例B115200:速度=115200;中断;
案例B230400:速度=230400;中断;
案例B460800:速度=460800;中断;
案例B500000:速度=500000;中断;
案例B576000:速度=576000;断裂;
案例B921600:速度=921600;中断;
案例B1000000:速度=1000000;中断;
案例B1152000:速度=1152000;中断;
案例B1500000:速度=1500000;中断;
案例B2000000:速度=2000000;中断;
案例B2500000:速度=2500000;中断;
案例B3000000:速度=3000000;中断;
案例B3500000:速度=3500000;中断;
}
返回速度;
}
int initport(int fd、长波特率、int flow\u ctrl)
{
结构termios选项;
memset(&options,0,sizeof(options));
如果(错误==tcgetattr(fd和选项)){
佩罗尔(“tcgetattr:”);
返回错误
while (1) {
    FD_ZERO(&readFds);
    FD_SET(ut.fd, &readFds);
    respTime.tv_sec = 0;
    respTime.tv_usec = timeout;

    retval = select(FD_SETSIZE, &readFds, NULL, NULL, &respTime);

    if (retval == 0) {
        //determine send heartbeat signal or not
        struct timeval now_time, result;
        gettimeofday(&now_time, NULL);
        timeval_subtract(&result, &now_time, &last_send_time);

        if(result.tv_sec > 5) {
            int r = pthread_create( &watchdog_thread , NULL ,  send_watchdog , (void*) NULL);
            gettimeofday(&last_send_time, NULL);
        }
        continue;
    }
    else if (retval == ERROR) {
        printf("select: error :: %d\n", retval);
    }
    usleep(10 * 10000);

    ...
    ...
    ...
}