Objective-C でシリアル通信ラッパー クラスを作成しています。使用可能なすべてのシリアル モデムを一覧表示し、接続をセットアップするために、Apple によるこのサンプル プロジェクトで使用されているものとほとんど同じコードを使用しています。
アップルのやり方を読んだり書いたりすることができました。しかし、私は 2 番目のスレッドにループを実装し、NSString *writeString
より長い 0 の場合はストリームに書き込み、バイトが利用可能な場合は書き込み後に読み取りたいと考えています。
私は非常に簡単に書くことができました。write
で宣言されている関数を使用しましたunistd.h
。
読み取りは機能しません。を呼び出すたびにread()
、関数がハングし、ループが進行しません。
私のループで使用されるコードは次のとおりです。
- (void)runInCOMLoop {
do {
// write
} while (bytesWritten < strlen([_writeString UTF8String]));
NSMutableString *readString = [NSMutableString string];
ssize_t bytesRead = 0;
ssize_t readB = 0;
char buffer[256];
do {
readB = read(_fileDescriptor, &buffer, sizeof(buffer));
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ this function hangs
bytesRead += readB;
if (readB == -1 {
// error
}
else if (readB > 0) {
if(buffer[bytesRead - 1] == '\r' ]] buffer[bytesRead - 1] == '\n') {
break;
}
[readString appendString:[NSString stringWithUTF8String:buffer]];
}
} while (readB > 0);
ここで何が間違っていますか?