私はビーグルボーンブラックのシリアルポート(/dev/ttyS4
)から読み取ろうとしていますが、これは一般的にすべてのLinuxデバイスに当てはまると思います(?)。Linuxシリアル読み取りブロックminicom
現在、私はminicom
をボーレート9600と8N1データに設定して、シリアルポートから正しく読み取ることができます。しかし、私が直接cat /dev/ttyS4
を試みると、何も私の端末に表示されません。私のコードでもこれを行い、Resource temporarily unavailable
エラーを返します。これはcat
コマンドで起こっていると思われます。
私はstty -F /dev/ttyS4
を実行した場合、私は(私の知る限り、私のminicom
の設定と一致している、)次のような出力が得られます。
speed 9600 baud; line = 0;
intr = <undef>; quit = <undef>; erase = <undef>; kill = <undef>; eof = <undef>; start = <undef>; stop = <undef>; susp = <undef>; rprnt = <undef>; werase = <undef>; lnext = <undef>; flush = <undef>;
-brkint -imaxbel
-opost -onclr
-isig -iexten -echo -echoe -echok -echoctl -echoke
興味深いノートでは、私はminicom
オープンを持っている場合ということです私がプログラムを始めると、ミニコムは何も印刷をやめ、プログラムを止めてもそのままにしておきます。シリアル設定を再度開いて(Ctrl-A
、P
)、それを閉じてminicom
を再開して作業を再開する必要があります(変更されていないようです)。次のように
私のコードは次のとおりです。
int main() {
std::cout << "Starting..." << std::endl;
std::cout << "Connecting..." << std::endl;
int tty4 = open("/dev/ttyS4", O_RDWR | O_NOCTTY | O_NDELAY);
if (tty4 < 0) {
std::cout << "Error opening serial terminal." << std::endl;
}
std::cout << "Configuring..." << std::endl;
struct termios oldtio, newtio;
tcgetattr(tty4, &oldtio); // save current serial port settings
bzero(&newtio, sizeof(newtio)); // clear struct for new settings
newtio.c_cflag = B9600 | CS8 | CREAD | CLOCAL;
newtio.c_iflag = IGNPAR | ICRNL;
newtio.c_oflag = 0;
newtio.c_lflag = ICANON;
tcflush(tty4, TCIFLUSH);
tcsetattr(tty4, TCSANOW, &newtio);
std::cout << "Reading..." << std::endl;
while (true) {
uint8_t byte;
int status = read(tty4, &byte, 1);
if (status > 0) {
std::cout << (char)byte;
} else if (status == -1) {
std::cout << "\tERROR: " << strerror(errno) << std::endl;
}
}
tcsetattr(tty4, TCSANOW, &oldtio);
close(tty4);
}
編集:私はBeagleBoneでのpythonを使用するためのAdafruitのチュートリアルに従うことによって(Pythonで)正しく動作するシリアルポートを得ています。この時点で私は確信しています私は何か間違っています。問題は何ですか?私はPythonよりもC++を使う方が好きなので、それを働かすことは素晴らしいことです。
いくつかの問題が考えられますが、何が問題なのですか? – sawdust
シリアルポートから正常に読み込むためにC++プログラムをどのように変更すればよいですか? –