Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.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
C 串行端口上的文件描述符不正确_C_Serial Port_File Descriptor - Fatal编程技术网

C 串行端口上的文件描述符不正确

C 串行端口上的文件描述符不正确,c,serial-port,file-descriptor,C,Serial Port,File Descriptor,我正在实现一个简单的协议,通过串行端口在两台PC之间进行文件传输,我遇到了一个奇怪的错误 在主界面上,我调用函数“llopen”: int llopen(内部端口,内部类型){ int-fd=0; 字符*端口; 端口=malloc(sizeof(char)*(strlen(COM)+1); sprintf(端口,“%s%d”,COM,端口); fd=初始化(端口);//打开(…):返回文件描述符! 开关(类型){ 案件发送者: 返回发送方(fd); 打破 案件受理人: 返回接收器(fd); 打破

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

在主界面上,我调用函数“llopen”:

int
llopen(内部端口,内部类型){
int-fd=0;
字符*端口;
端口=malloc(sizeof(char)*(strlen(COM)+1);
sprintf(端口,“%s%d”,COM,端口);
fd=初始化(端口);//打开(…):返回文件描述符!
开关(类型){
案件发送者:
返回发送方(fd);
打破
案件受理人:
返回接收器(fd);
打破
}
return fd;//这里的fd值是5
}
之后,我调用一个函数llwrite(intfd,…)将字符串写入文件描述符,但我得到一个错误:llwrite(intfd,…)上的“坏文件描述符”。如果我再次调用initialization(port)函数,在此之前,它会工作,并在文件描述符上写入N个字节,但如果我不这样做,它会再次给我“Bad file descriptor”错误

这里是llwrite(int fd,…)函数:

int
llwrite(整型文件描述符,无符号字符*缓冲区,无符号整型长度){
//这里的fd值是5
返回writeBuffer(文件描述符、缓冲区、长度);
}
例如,在调用return语句之前,如果调用tcflush(…)函数,就会出现“坏文件描述符”错误

有线索吗?提前谢谢

编辑:

问题解决了

洛潘(…)错了。我返回的是在ConnectReceiver(…)/ConnectSender(…)上写入的字节数,而不是文件描述符

现在是对的:

int
llopen(内部端口,内部类型){
int-fd=0;
字符*端口;
端口=malloc(sizeof(char)*(strlen(COM)+1);
sprintf(端口,“%s%d”,COM,端口);
fd=初始化(端口);//打开(…):返回文件描述符!
开关(类型){
案件发送者:
如果(connectSender(fd)>0)返回fd;
案件受理人:
如果(connectReceiver(fd)>0)返回fd;
}
返回-1;
}

这里没有足够的信息,但值得注意的是,您确实做到了

return connectSender(fd);
break;
中断存在死代码,因为返回停止函数的执行。也许你不想回来


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

如果没有为端口分配足够的字节,则至少应该+2才能为端口号分配足够的空间。否则,这似乎是*nix和Windows代码的奇怪混合。请注意,这只允许使用端口COM1到COM9,某些usb/串行转换器可能会出现故障。你真的应该打开
\\。\COM1
(小心正确地避开反斜杠…@HansPassant是的,你是对的。但问题不是这样。我的意思是,我可以执行ConnectSender(…)和ConnectReceiver(…),我得到了正确的文件描述符,但是我试图执行llwrite(int-fd),但它不起作用。@AdrienPlisson这与这个案例无关。好吧,你知道你在破坏堆,然后想知道为什么程序不能正常工作。首先停止损坏堆。如果没有帮助,就使用调试器。你是对的。这是一个死代码,我本想马上返回,但这与问题无关。