2016-10-24 15 views
1

私はCとLinuxを初めて使用しています。 read()システムコールを使用して、シリアルポートから一部のデータを読み込もうとしていますが、正常に動作しています。問題はread()シナリオがLinuxのread()コールでエラーが返されませんiシリアルケーブルを抜きます

お時間をclear.Thanksない場合は、コードを助け

running.Pleaseされている間、私は、シリアルケーブルを抜いても、お気軽にお尋ね下さい負値を返していないことです

編集: ケーブルを抜いたときにゼロを返します。

char cBuff[100]; 
buffptr = cBuff; 
while ((nbytes = read(fd, buffptr, cBuff + sizeof(cBuff) - buffptr - 1)) > 0) 
{ 
    //Do something 
} 

if(nbytes < 0) 
{ 
    perror("Serial Read Thread ERROR:"); 
} 
else if(nbytes >= 0) 
{ 
    //Do something 
} 
+0

*返すものは何ですか? –

+0

@Andrewそれは0を返します。 – zappy

答えて

2

シリアルケーブルの抜き差しは、もはやデータが届かないという効果しかありませんが、何らかの形で中断した実際の「接続」はありません。

あなたのシリアルポートは、ラインが常に "1"のままであるため、それ以上の値がゼロになることだけを通知するようになりました。

したがって、ドライバはデータがないことを確認しますが、プラグが抜かれているのでデータが存在しないことはありません。

-2

readこの場合、エラーは返されません。バイト数(ゼロ以上)が既に読み取られているため。

readマニュアルページによれば、この数(戻り値)が要求されたバイトの数 よりも小さい場合

これはエラーではありません。これは、実際に現在使用可能なバイト数がより少なくなっているためです( ファイルの終わりに近いか、パイプから読み取っているか、 端末から読み取っている可能性があります)。信号によって中断される。

readが-1を返したかどうかを確認できます。エラーの詳細については、errnoをチェックしてください。

+1

質問を.....読みましたか? – LPs

+0

@LPもちろん私はしました。私の答えがはっきりしない場合は申し訳ありません。私はそれを編集しました。 –

+0

OPは、約-1の戻り値を知っています。問題は、シリアルコンバータへのUSBの接続を解除すると、readは0を返します。 – LPs

0

readシリアルケーブルを抜いてもエラーは返されません。

私はこの小さなexempleをご説明します:readはそれだけで彼らは何もしているん参照エラーのようにこれを扱うことはありませんので、あなたが思ったように、このプログラムは0、およびない-1を出力します

#include <stdio.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <stdlib.h> 

#define READ_SIZE 2047 

int  main(void) 
{ 
    char str[READ_SIZE + 1]; 
    int ret; 
    int fd; 

    fd = open("test.txt", O_RDONLY | O_CREAT); // create a file 
    system("rm test.txt"); // delete the file 
    ret = read(fd, str, READ_SIZE); // read on a file that doesn't exist 
    printf("%d\n", ret); // print the return value of read 
    close(fd); 
    return (0); 
} 

赤または0のバイト数を読み込んで返します。

+0

あなたの例はオフです。開いているファイル記述子を持っている限り、あなたのファイルは実際には存在します(あなたがLinuxなどであると仮定します)。それはあなたがEOF上にいるので、何も読んでいないようにただ空です。 – glglgl

+0

@glglgl **ファイルdesciptor **は存在しますが、私はファイルを削除する前に**ファイルを削除しました – plean

+1

あなたは**ディレクトリ内の**ファイルエントリを削除しました。すべてのファイルエントリとそれを参照するすべてのファイル記述子がなくなると、ファイルは存在しなくなります。 – glglgl

関連する問題