私はUbuntuベースの組み込みプロセッサをマシンビジョンシステムとして使用しています。 2つのシリアルポートを介して関連するフライトコントローラと通信します。
私の問題は、Vision<->フライトコントローラ通信をサポートする一般的なopen()、close()呼び出しが原因でstdin呼び出し(fgets()、scanf()など)が異常な方法で失敗することです。呼び出しがそこにあると思います。入力はありますが、入力はありません。返されるバッファはガベージです。
私は最初、これがカーネルのデフォルトのテキストコンソールと私が使用していたシリアルデバイスとの間の衝突によるものだと思いました。迂回的に検索した後、これが間違っていることに気づきました。場合によっては、デバイスファイル記述子がstdinと同じようにゼロに設定される微妙なバグを見つけました。
私は以下の探査機のスレッドをたどってこのバグを見つけました。私は彼の答えが私を本当の質問に導いたので受け入れました。
以下の説明は、デバイス、stdin、およびデフォルトのテキストコンソールに興味がある他の人に役立つ情報を提供します。
ありがとう
答え1
ターミナルライン機能を設定して固定するには、次のようにします。
# Serial line
tty=/dev/ttyS1
# Open the serial port and hold it open
sleep 300 <$tty &
slpid=$!
# Set the characteristics and run the serial port code
stty 19200... <$tty
/run/your/program
# Clean up
kill $slpid 2>/dev/null