2013-04-21 5 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 server и client вместе с рабочим сценарием 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)); 

вы используете неблокирующую режим, но нет никакой проверки, что читать звонок действительно прочитал что-нибудь. Поскольку он не блокируется, он будет возвращен, даже если данные с джойстика не будут доступны.

Смежные вопросы