Linux でシリアル ポート、特に ttyUSB を使用する必要があるアプリケーションを作成しました。読み書き操作は、標準の select()/read() ループと write() で実行され、おそらく何も問題はありませんが、初期化コード (またはその一部の欠如) が tty サブシステムの何かを損傷します。ここにあります:
vuxboot(string filename, unsigned baud = B115200) : _debug(false) {
_fd = open(filename.c_str(), O_RDWR | O_NOCTTY);
if(_fd < 0) throw new io_error("cannot open port");
// Serial initialization was written with FTDI USB-to-serial converters
// in mind. Anyway, who wants to use non-8n1 protocol?
tcgetattr(_fd, &_termios);
termios tio = {0};
tio.c_iflag = IGNPAR;
tio.c_oflag = 0;
tio.c_cflag = baud | CLOCAL | CREAD | CS8;
tio.c_lflag = 0;
tcflush(_fd, TCIFLUSH);
tcsetattr(_fd, TCSANOW, &tio);
}
もう 1 つtcsetattr(_fd, TCSANOW, &_termios)
はデストラクタにありますが、これは無関係です。
この用語の初期化の有無にかかわらず、アプリケーションの終了後にシステムで奇妙なことが起こります。プレーンcat
(またはhd
)が毎回何も出力しないか同じものをすぐに終了する場合があります。ポートに確実に送信されるデータを待機して表示しない場合もあります。そしてclose()
(read()
毎回ではありませんが)usb-serial.c を参照しWARNING
て dmesgに奇妙なメッセージを出力します。
ハードウェアとファームウェアを何十回も (別のマシンでも) チェックしましたが、意図したとおりに動作していると確信しています。さらに、同じメッセージを何度も出力するようにファームウェアを削除しました。
何も破壊せずにシリアルポートを使用するにはどうすればよいですか? ありがとう。