質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

3回答

15969閲覧

Linuxでのシリアル通信データ読み込み

cfu0987_APV

総合スコア15

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2016/10/22 13:17

Linux(ubuntu)でシリアル通信のプログラム(C++を使用)を作成していてわからないことが出たので質問します。

シリアル通信で相手から受け取ったデータを、受け取ったデータサイズ分読み込み、データサイズが0なら読み込まない処理を作成しようとしています。
Windowsの関数を使用すれば以下のように作成できるということはわかったのですが、Linuxの場合はどうすればいいか悩んでいます。

どなたか解決策をご教示願います。

COMSTAT rcvBuff; ・ ・ ・ ClearCommError(hnd, err, rcvBuff); //hnd:シリアルポートのハンドル if(rcvBuff.cbInQue > 0){ rcvBuff.cbInQueb分のデータをhndから読み込む }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

nagaettyさんのご回答の通り、Unix系OSでは多くの場合シリアルデバイスは単なるキャラクタデバイスですので、ファイルと同じようにopen、read、writeできます。

シリアルデバイス特有の処理もあります。デバイスのハードウェアの設定 (通信速度など) をするにはioctlシステムコールを使います。また対向のホストと正常に通信するためにはフロー制御の知識も必要です。次のような文書を参考になさってください。

投稿2016/10/23 01:47

ikedas

総合スコア4227

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

えーと、

ioctl(fd, FIONREAD, &ready_bytes); if (ready_bytes > 0) { ready_bytes分のデータを読み込む }

の様な感じかな?
ただテストしていません。
多分「非カノニカル」な設定をしてないと動かない気がします。

それについては、idkdasさんがリンクを張られているかと思います。

投稿2016/10/30 13:34

ShinyaAnan

総合スコア241

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

デバイス名を調べる

ホストOSでのシリアルデバイスの確認

# cat /var/log/dmesg | grep ttyS [ 2.911270] serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A [ 3.155264] serial8250: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A [ 3.155788] 00:08: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A [ 3.155980] 00:09: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A

現在の通信速度や通信条件の確認

# stty -a < /dev/ttyUSB0 speed 115200 baud; rows 0; columns 0; line = 0; intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0; -parenb -parodd cs8 -hupcl -cstopb cread clocal -crtscts -cdtrdsr -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8 -opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 -isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt -echoctl -echoke

注意

全2重通信の場合は、受信待ちの間は送信できなくなりますので、それを避ける場合は
送信プログラムと受信プログラムは別べつで動作するようにしたほうが良いです。

プログラムは、ファイルの入出力と同じです。

投稿2016/10/22 14:10

nagaetty

総合スコア1106

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問