messageソフトウェア開発の仕事をしているsimotinといいます。LinuxLinux上でC言語でシリアル通信をするプログラムを書く際に、いろいろ調べたので書いておきたいと思います。デバイスファイルについて感想シリアル通信プログラムの流れLinuxでシリアル通信プログラムを書く際の大まかな流れですが、シリアルポートに対応するデバイスファイルをオープンするtermios構造体を使って通信設定するtermios構造体の設定値をポートに反映させるread/write関数を使って通信するというような流れになります。マッピングされています。テレタイプ(teletype)を意味するそうです。termios構造体termios構造体を使ってシリアル通信のための設定をします。■参考にするmanページhttps://linuxjm.osdn.jp/html/LDP_man-pages/man3/termios.3.html設定処理は結構面倒臭い感じになりますが、おおむねビット毎にパリティやらデータビットやらの役割が決められているような感じですね。制御コードに気をつけろ!シリアル通信のプログラミングで気を付けないといけないことがいくつかあります。termios構造体は名前の通り端末との通信を扱うことを意識した構造体です。そもそもUNIXは現代のパソコンとは使い勝手の異なるシステムでした。Unixシステムには、端末と呼ばれるキャラクタ画面とキーボードがついた装置が複数つながれていて、何か計算をしたい人たちはこの「端末」からログインし、UNIXマシンを使っていました。termios構造体はこの「端末」との入出力を制御するために使われていたのです。前置きが長くなりましたが、センサや各種デバイスと通信する際は生データ(8bit)で通信することが多いと思いますが、termios構造体を使う場合そのままでは生データとして受信できません。上位ビットがマスクされてしまうようです。生データを扱う場合は、cfmakeraw関数により設定値を生データの送受信用の値にしてあげる必要があるそうです。CS8;をしてくれているそうです。いうわけでtermios構造体を使うC言語のコードを書いてみました。piで動かしてみました。ソースコードはこんな感じです。"/dev/serial0"としてマッピングされています。手元のRaspberrypiだと/dev/ttyS0だとopenは成功しましたが、うまく通信できませんでした。:TXD10:RXDになります。組み込みソフトのプログラミングだとシリアル通信のプログラミングは比較的簡単な部類に入ります。UARTのデバイスドライバは割り込みハンドラを入れてもC言語で200~300行程度にしかなりません。UARTは各種デバイスやセンサなどとのインターフェースとして使われますが、「端末」との通信のように制御文字処理する必要はありません。今回termiousを使ってみてその辺の作法がよくわからず少し苦労しました。現代ではサーバへのログインアクセスはもっぱらSSHになりました。RS-232Cを使ったシリアルコンソールログインなどは組み込みLinuxを使う時くらいしかありません。(SSHと違ってシリアルコンソールだとviがうまく動かなかったりするんですよね...)そのためか「termios/端末プログラミング」について触れられている書籍はあまりありません。見る詳解Unixプログラムは分厚くて机に置いておくと邪魔になるので普段めったに読まない本ですが、こういうときに役に立つんですね。Unix/Linux系のコードを書くときはやはりありがたい一冊です。ちなみに、Linuxプログラミングインターフェースという本でも端末プログラミングについて解説されている章があるようです。見るtermiousを使うプログラムはUnixとしての「端末プログラミング」の作法を押さえておく必要がありそうです。Pi3でシリアル通信(UART通信)をする昨日はGPSモジュールを使って遊んでみました。(4)月別アーカイブはてなブログをはじめよう!simotin13さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。