串行端口上的错误文件描述符

时间:2011-10-30 14:59:25

标签: c serial-port file-descriptor

我正在实现一个简单的协议,通过串口在2台PC之间进行文件传输,我收到了一个奇怪的错误。

在主要部分我调用一个函数“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,...)将一个字符串写入文件描述符,但是我收到一个错误: llwrite(int fd,...)。如果我再次调用初始化(端口)函数,在此之前,它可以工作,它会在文件描述符上写入N个字节,但如果我不这样做,它会给我“坏文件描述符”再次出错。

这是 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(...)函数,我也会收到“错误文件描述符”错误。< / p>

有任何线索吗?提前谢谢!

编辑:

问题解决了。

llopen(...)错了。我正在返回在 ConnectReceiver(...) / ConnectSender(...)上写入的字节数,而不是文件描述符 < / p>

现在是对的:

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 :(得分:0)

这里的信息确实不够,但值得注意的是你做了

return connectSender(fd);
break;

中断有死代码,因为返回会停止执行该函数。也许你不是故意回来的?

如果不是这种情况,请尝试使用strace获取有关正在发生的事情的更多详细信息。如果您不在Linux上,其他操作系统应该有类似的工具,例如dtrussktrace