Неверный дескриптор файла на последовательном порту - PullRequest
0 голосов
/ 30 октября 2011

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

На главной я вызываю функцию "llopen":

int 
llopen(int port, int type) {

    int     fd = 0;
    char*   PORT;


    PORT = malloc( sizeof(char) * (strlen(COM) + 1) );
    sprintf(PORT,"%s%d",COM,port);

    fd = initialization(PORT); // Open(...): returns a file descriptor!

    switch(type) {
            case SENDER:
                    return connectSender(fd);
                    break;
            case RECEIVER:
                    return connectReceiver(fd);
                    break;
    }

    return fd; // The fd value here is 5

}

После этого я вызываю функцию llwrite (int fd, ...) , чтобы записать строку в дескриптор файла, но я получаю сообщение об ошибке: «Bad file descriptor» на llwrite (int fd, ...) . Если я снова вызываю функцию initialization (port) , до этого она работает и записывает N байтов в дескриптор файла, но если я этого не делаю, это выдает ошибку «Bad file descriptor» еще раз.

Вот это llwrite (int fd, ...) функция:

int 
llwrite(int fileDescriptor, unsigned char* buffer, unsigned int length) {


    // The fd value here is 5
    return writeBuffer(fileDescriptor,buffer,length);

}

Даже перед оператором return , если я, например, вызываю функцию tcflush (...) , я получаю ошибку "Bad file descriptor".

Есть подсказка? Заранее спасибо!

EDIT:

Проблема решена.

llopen (...) был неправ. Я возвращал количество байтов, записанных на ConnectReceiver (...) / ConnectSender (...) , а не дескриптор файла

Теперь все правильно:

int 
llopen(int port, int type) {

   int     fd = 0;
   char*   PORT;


   PORT = malloc( sizeof(char) * (strlen(COM) + 1) );
   sprintf(PORT,"%s%d",COM,port);

   fd = initialization(PORT); // Open(...): returns a file descriptor!

   switch(type) {
           case SENDER:
                   if( connectSender(fd) > 0 ) return fd;
           case RECEIVER:
                   if( connectReceiver(fd) > 0 ) return fd;
   }

   return -1;

}

1 Ответ

0 голосов
/ 30 октября 2011

Здесь на самом деле недостаточно информации, но стоит попробовать, заметив, что вы делаете

return connectSender(fd);
break;

В разрыве есть мертвый код, поскольку возврат останавливает выполнение функции.Возможно, вы не хотели возвращаться?

Если это не так, попробуйте использовать strace, чтобы получить более подробную информацию о том, что происходит.Если вы не используете Linux, другие ОС должны иметь аналогичные инструменты, такие как dtruss или ktrace.

...