2013-04-21 75 views
0

我正在從一個USB控制桿獲取軸值並通過TCP發送它的程序。我所做的是首先讓TCP程序工作,這樣我就可以發送按預期工作的消息。然後我編寫了另一個程序,從操縱桿獲取數值並將它們打印到屏幕上,該屏幕也按預期工作。保持垃圾值

我最近試圖將這兩個單獨的程序合併爲一個,所以我有一個server程序和一個client程序。這就是我的問題開始的地方,在編譯期間我沒有遇到任何錯誤。看來該程序不再從遊戲杆獲取值並將它們存儲在變量axis[0]中。

現在我的過程是在連接操縱桿的電腦上啓動server.c文件。然後,我將在應該接收值的計算機上啓動client.c文件。我有幾個printf聲明,告訴我腳本到目前爲止的位置。當我執行server.c腳本時,它告訴我檢測到操縱桿並且有6個軸和12個按鈕。然後它將等待一個循環,直到嘗試連接客戶端。

一旦client.c程序被執行,它將打印出The value is -1093458243。在它下面將打印出Incoming connection from 192.168.254.15 - sending welcome.然後客戶端程序退出,這就是發生的一切。

The value is:應該是一個介於-32768和32767之間的行。所以它從某個地方得到一個垃圾值。我迷路了,一直試圖排除一整天的麻煩,但沒有運氣。我已經包含了幾個代碼示例,工作TCP serverclient腳本以及工作joystick腳本與我嘗試將兩者結合使用的代碼。如果有人可以看看我的代碼,看看他們是否發現錯誤或給我一些指針,我將不勝感激。提前致謝!

這裏是server.c結合的編碼:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <arpa/inet.h> 
#include <sys/types.h> 
#include <netinet/in.h> 
#include <sys/socket.h> 

//joysick libraries 
#include <sys/ioctl.h> 
#include <stdio.h> 
#include <fcntl.h> 
#include <linux/joystick.h> 

//Joysick device 
#define JOY_DEV "/dev/input/js0" 

//TCP Port number 
#define PORTNUM 2343 

int main(int argc, char *argv[]) 
{ 

//TCP connect 
    struct sockaddr_in dest; /* socket info about the machine connecting to us */ 
    struct sockaddr_in serv; /* socket info about our server */ 
    int mysocket;   /* socket used to listen for incoming connections */ 
    socklen_t socksize = sizeof(struct sockaddr_in); 

    memset(&serv, 0, sizeof(serv));   /* zero the struct before filling the fields */ 
    serv.sin_family = AF_INET;    /* set the type of connection to TCP/IP */ 
    serv.sin_addr.s_addr = htonl(INADDR_ANY); /* set our address to any interface */ 
    serv.sin_port = htons(PORTNUM);   /* set the server port number */  

    mysocket = socket(AF_INET, SOCK_STREAM, 0); 

    /* bind serv information to mysocket */ 
    bind(mysocket, (struct sockaddr *)&serv, sizeof(struct sockaddr)); 

    /* start listening, allowing a queue of up to 1 pending connection */ 
    listen(mysocket, 1); 
    int consocket = accept(mysocket, (struct sockaddr *)&dest, &socksize); 

//TCP variable 
     char msg1[10]; 


//Joystick variables 
     int xAxis; 
    int yAxis; 
     int xSpeed; 
     int ySpeed; 

//Joystick initialize 
    int joy_fd, *axis=NULL, num_of_axis=0, num_of_buttons=0, x; 
    char *button=NULL, name_of_joystick[80]; 
    struct js_event js; 

    if((joy_fd = open(JOY_DEV , O_RDONLY)) == -1) 
    { 
     printf("Couldn't open joystick\n"); 
     return -1; 
    } 

//Get number of axes, buttons and name of joystick. Print results to screen 
     ioctl(joy_fd, JSIOCGAXES, &num_of_axis); 
    ioctl(joy_fd, JSIOCGBUTTONS, &num_of_buttons); 
    ioctl(joy_fd, JSIOCGNAME(80), &name_of_joystick); 

    axis = (int *) calloc(num_of_axis, sizeof(int)); 
    button = (char *) calloc(num_of_buttons, sizeof(char)); 

    printf("Joystick detected: %s\n\t%d axis\n\t%d buttons\n\n" 
     , name_of_joystick 
     , num_of_axis 
     , num_of_buttons); 

//Use non blocking mode for joystick 
    fcntl(joy_fd, F_SETFL, O_NONBLOCK); /* use non-blocking mode */ 


    while(1) { 
//Test to read joystick state 
      /* read the joystick state */ 
     read(joy_fd, &js, sizeof(struct js_event)); 

      /* see what to do with the event */ 
     switch (js.type & ~JS_EVENT_INIT) 
     { 
      case JS_EVENT_AXIS: 
       axis [ js.number ] = js.value; 
       break; 
      case JS_EVENT_BUTTON: 
       button [ js.number ] = js.value; 
       break; 
     } 
//Give msg1 variable the value of axis[0] 
    sprintf(msg1, "%d", axis[0]); 

    //char msg1 = axis[0]; 
//TCP send 
    while(consocket) 
    { 
    printf("Value is: %6d\n", axis[0]); 
     printf("Incoming connection from %s - sending welcome\n", inet_ntoa(dest.sin_addr)); 
     send(consocket, msg1, strlen(msg1), 0); 
     consocket = accept(mysocket, (struct sockaddr *)&dest, &socksize); 
    } 

    close(consocket); 
    close(mysocket); 
    return EXIT_SUCCESS; 

//Print joystick state to screen 
    printf("Value is: %d", axis[0]); 
    //printf(" \r"); 
    //fflush(stdout); 
    } 


//Joystick close 
    close(joy_fd); /* too bad we never get here */ 
    return 0; 

//TCP message 
    //printf("Please enter info\n"); 
    //fgets(msg1, 20, stdin); 

} 

這裏是老工作server.c文件:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <arpa/inet.h> 
#include <sys/types.h> 
#include <netinet/in.h> 
#include <sys/socket.h> 

#define PORTNUM 2343 

int main(int argc, char *argv[]) 
{ 
    char msg1[] = "Hello World !\n"; 

    struct sockaddr_in dest; /* socket info about the machine connecting to us */ 
    struct sockaddr_in serv; /* socket info about our server */ 
    int mysocket;   /* socket used to listen for incoming connections */ 
    socklen_t socksize = sizeof(struct sockaddr_in); 

    memset(&serv, 0, sizeof(serv));   /* zero the struct before filling the fields */ 
    serv.sin_family = AF_INET;    /* set the type of connection to TCP/IP */ 
    serv.sin_addr.s_addr = htonl(INADDR_ANY); /* set our address to any interface */ 
    serv.sin_port = htons(PORTNUM);   /* set the server port number */  

    mysocket = socket(AF_INET, SOCK_STREAM, 0); 

    /* bind serv information to mysocket */ 
    bind(mysocket, (struct sockaddr *)&serv, sizeof(struct sockaddr)); 

    /* start listening, allowing a queue of up to 1 pending connection */ 
    listen(mysocket, 1); 
    int consocket = accept(mysocket, (struct sockaddr *)&dest, &socksize); 

    while(consocket) 
    { 
     printf("Incoming connection from %s - sending welcome\n", inet_ntoa(dest.sin_addr)); 
     send(consocket, msg1, strlen(msg1), 0); 
     consocket = accept(mysocket, (struct sockaddr *)&dest, &socksize); 
    } 

    close(consocket); 
    close(mysocket); 
    return EXIT_SUCCESS; 
} 

這裏是client.c文件:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <arpa/inet.h> 
#include <sys/types.h> 
#include <netinet/in.h> 
#include <sys/socket.h> 

#define MAXRCVLEN 500 
#define PORTNUM 2343 

int main(int argc, char *argv[]) 
{ 
    char buffer[MAXRCVLEN + 1]; /* +1 so we can add null terminator */ 
    int len, mysocket; 
    struct sockaddr_in dest; 

    mysocket = socket(AF_INET, SOCK_STREAM, 0); 

    memset(&dest, 0, sizeof(dest));    /* zero the struct */ 
    dest.sin_family = AF_INET; 
    dest.sin_addr.s_addr = inet_addr("192.168.254.16"); /* set destination IP number */ 
    dest.sin_port = htons(PORTNUM);    /* set destination port number */ 

    connect(mysocket, (struct sockaddr *)&dest, sizeof(struct sockaddr)); 

    len = recv(mysocket, buffer, MAXRCVLEN, 0); 

    /* We have to null terminate the received data ourselves */ 
    buffer[len] = '\0'; 

    printf("Received %s (%d bytes).\n", buffer, len); 

    close(mysocket); 
    return EXIT_SUCCESS; 
} 

這是joystick獲取的文件S中的值,並將其打印在屏幕上:

#include <stdio.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <sys/ioctl.h> 
#include <linux/joystick.h> 
#include <wiringPi.h> 
#define JOY_DEV "/dev/input/js0" 

int main() 
{ 
    int xAxis; 
    int yAxis; 
     int xSpeed; 
     int ySpeed; 

    FILE *fp; 
     fp = fopen("/dev/servoblaster","w"); 
     if (fp == NULL) { 
     printf("Error opening file"); 
     exit(0); 
    } 

    int joy_fd, *axis=NULL, num_of_axis=0, num_of_buttons=0, x; 
    char *button=NULL, name_of_joystick[80]; 
    struct js_event js; 

    if((joy_fd = open(JOY_DEV , O_RDONLY)) == -1) 
    { 
     printf("Couldn't open joystick\n"); 
     return -1; 
    } 

    ioctl(joy_fd, JSIOCGAXES, &num_of_axis); 
    ioctl(joy_fd, JSIOCGBUTTONS, &num_of_buttons); 
    ioctl(joy_fd, JSIOCGNAME(80), &name_of_joystick); 

    axis = (int *) calloc(num_of_axis, sizeof(int)); 
    button = (char *) calloc(num_of_buttons, sizeof(char)); 

    printf("Joystick detected: %s\n\t%d axis\n\t%d buttons\n\n" 
     , name_of_joystick 
     , num_of_axis 
     , num_of_buttons); 

    fcntl(joy_fd, F_SETFL, O_NONBLOCK); /* use non-blocking mode */ 

    while(1) /* infinite loop */ 
    { 

      /* read the joystick state */ 
     read(joy_fd, &js, sizeof(struct js_event)); 

      /* see what to do with the event */ 
     switch (js.type & ~JS_EVENT_INIT) 
     { 
      case JS_EVENT_AXIS: 
       axis [ js.number ] = js.value; 
       break; 
      case JS_EVENT_BUTTON: 
       button [ js.number ] = js.value; 
       break; 
     } 

      /* print the results */ 

     //printf("X: %6d Y: %6d ", axis[0], axis[1]); 


     int xAxis = axis[0]/327; 
     int yAxis = axis[1]/327; 
     int ySpeed = 150-0.3*yAxis; 
     int xSpeed = 150-0.3*xAxis; 
     printf("X is equal to: %d Y is equal to: %d Y speed is: %d ", xAxis, yAxis, ySpeed); 

     fprintf(fp, "2=%d\n", ySpeed); 
     fprintf(fp, "1=%d\n", xSpeed); 
      printf(" \r"); 
     fflush(stdout); 
    } 

    close(joy_fd); /* too bad we never get here */ 
    return 0; 
} 

回答

1

什麼看起來有點怪我(我認爲這可能是你的問題的一個原因)

fcntl(joy_fd, F_SETFL, O_NONBLOCK); /* use non-blocking mode */ 

while(1) /* infinite loop */ 
{ 

     /* read the joystick state */ 
    read(joy_fd, &js, sizeof(struct js_event)); 

您正在使用非阻塞模式,但沒有檢查讀取調用實際上讀取任何東西。由於它沒有阻塞,即使沒有數據從遊戲杆設備獲得,它也會返回。