0

Linux の C でシリアル デバイスからバイナリ データを読み込もうとしています。問題は、ドライバの内部バッファに char が存在することがありますが、(select(2) を使用して) ポーリングすると、デバイスを読み取る準備ができていないというメッセージが返されることです。

私はtermiosの男と関連するすべての人を読んで再読し、インターネットで検索しました。すべてのフラグ (つまり、VTIME、VMIN) を正しく設定し、ICANON の設定を解除したと思います。「tcmakeraw」という機能も試してみましたが、問題は解決しませんでした。

私が何をすべきかについて何か考えはありますか?

よろしくお願いいたします。

4

2 に答える 2

1

コードを見せてください。シリアルポートでcfmakerawを使用することから始めます。rawモードで動作するようになったら、変更を加えて、どのように動作するかを確認できます。これがあなたがチェックできる質問または事柄のリストです:

  • たとえばcfmakerawを使用して属性を変更した後、tcsetattr(...)を呼び出して変更を適用しますか?

  • ドライバの受信バッファにまだデータがあることをどのように証明しますか?

  • システムコールにエラーがないか確認しますか?

  • プログラムを強化した結果はどうなりますか?

あなたのコメントに基づいて編集してください:あなたのプロトコル「保証」.... =>あなたの仮定をチェックしてください!チェックされていない、非常に明確な保証は、「不可能なエラー」の適切な補遺です。

基本的に:selectが壊れているか、シリアルドライバのいずれかです。シリアルドライバが壊れている理由は、ハードウェアFIFOが十分にいっぱいになっていないため、割り込みを解除したり、割り込みを失ったりすることです。

于 2011-01-07T13:40:59.033 に答える
0

/dev/ttyS0パラメータの後に直接(Cを介さずに)(または同等の方法で)読み取るとどうなりますかsetserial。外部で必要なデータを取得できますselect()か?

于 2011-01-06T18:02:36.203 に答える