2011-01-06 18 views
0

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

私はtermiosの男性と関連するすべての男性を読んで再読し、インターネットで検索しました。私はすべてのフラグ(VTIME、VMIN)を正しく設定し、ICANONを設定しないと信じています。 関数 "tcmakeraw"を使ってみましたが、問題は解決しませんでした。

私は何をすればいいですか?

種類は、あなたがあなたの後/dev/ttyS0(または当量)(ないCを通じて)直接setserialあなたのパラメータを読んだときに何が起こる事前 Yannay

+3

コードを添付してください... – BlueDog

+1

'select()'を呼び出す前に 'readfds'を再入力したことを覚えていますか? – caf

+0

どのタイプのシリアルポートですか? (すなわち、実際の16550、16550クローン、USBコンバータ、ブルートゥース、irda、...) –

答えて

0

で&感謝を考えています。 select()の外に必要なデータを取得できますか?

+0

フラグは、CREAD、CLOACL、CS8、NL0、CR0、TAB0、BS0、VT0、FF0だけです。ボーレートが正しく設定されています。 VMIN = 1、VTIME = 0。しかし、問題は解決されません/私は選択なしで読もうとしています。単純に読み込み、バイトは返されません。 – yannay

1

コードを表示する必要があります。私は、シリアルポートでcfmakerawを使うことから始めます。 生のモードで作業したら、変更を加えて動作を確認できます。ここで 質問や、あなたがチェックできるもののリストです:

  • 例cfmakerawのために使用して、属性を変更した後、あなたは に(...)のtcsetattrを呼んでください、あなたの変更を適用しますか?

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

  • システムコールでエラーが発生していませんか?

  • stracingあなたのプログラムは何のためのものですか?あなたのコメントに基づいて

編集: あなたのプロトコル "保証" .... =>あなたの仮定をチェック!チェックしないでください、クリスタルクリア保証は "不可能なエラー"の良いcoandidateです

基本的に:select is brokenまたはシリアルドライバ。シリアルドライバが壊れている理由は、ハードウェアFIFOが、割り込みを発生させたり、割り込みを失ったりするのに十分ではないことです。

+0

1.はい。 2.その複雑な。私が使用しているプロトコルはすべてのメッセージの後にACKを保証します。時には、デバイスからより多くのデータが送信されない限り、私はackを取得しません。私は100%ですが問題ではありません。もちろん。 4.すべてが失敗したら私はそれを試みる... – yannay

関連する問題