シリアルポートの使い方@windows

ここでは、シリアルポート(COM port, serial device, RS232c どの名称が一般的?) をWindows上で扱う方法について解説します。

参考:linux上でのシリアルポートの扱い

linux上では、シリアルポートはファイルと同じように扱うことができます。 COM1は通常/dev/ttyS0というファイルとして定義されており、

 cat hoge.txt > /dev/ttyS0   # シリアルポートへの出力
 cat < /dev/ttyS0 > hoge.out # シリアルポートからの入力

と書くことができます。 また、C言語のプログラム中では、open関数で/dev/ttyS0を開いて読み書きを することが可能です。詳しくは

serial programming howto

man termios

を参照してください。

DOSプロンプトの問題点

Windowsでは、シリアルポートはCOM1, COM2といった予約ファイル名で扱われます。しかし、データの出力はlinuxと同じようにできるのですが、リダイレクトによる入力には対応していないようです。

 type hoge.txt > com1 # 出力>OK
 type com1 > hoge.txt # 入力>NG

追記:WindowsXPにおいては入力も可能になっている可能性があります。2kはだめぽ?

cygwinの利用

cygwinのgccを用いて、windows上でシリアルポートを扱うプログラムを組むことができます。 プログラミング方法、コンパイル方法は、上記のlinuxのプログラミング方法と同じです。

cygwinのbash shell上では、シリアルポートは/dev/com1, /dev/com2のようにアクセスすることが可能です。linux上と同じように、プログラム中でopenして読み書きすることが可能ですが、シェルのリダイレクト機能を用いて入力を行なうことはできないようです。

 program 中でopen関数を呼び、読み書き>OK
 program > /dev/com1 # リダイレクト出力>OK
 program < /dev/com1 # リダイレクト入力>NG

なお、cygwinのgccでコンパイルしたプログラムをDOSプロンプト上で実行するときも、プログラム中でopenするべきファイル名は/dev/com1のほうです。ファイルcom1は開けません。

通信速度の設定のしかた

linuxプログラム中ではtcsetattr()などを用いて通信速度の設定が可能ですが、cygwinでは微妙にうまくいってないようです。また、linux上においては通信速度等の設定はsttyコマンドを用いて行ないますが、cygwinではsttyコマンドでシリアルポートの設定を行なおうとすると、以下のようなエラーが出ます。

 $ stty -F /dev/com1 speed 115200
 0
 stty: /dev/com1: unable to perform all requested operations

cygwinのbash shellでも、通常c:\WINNT\system32へのパスは通っていると思うので、windowsのmodeコマンド(mode.com。mode.exeではないので注意)を用いて通信速度の設定をするのが良いと思います。

 mode.com com1: BAUD=115200 PARITY=N DATA=8 STOP=1 to=off \
     xon=off odsr=off octs=on dtr=off rts=on idsr=off

次のようなshellscriptを書いておくと便利かもしれません。

 #!/bin/sh
 mode.com $1: BAUD=115200 PARITY=N DATA=8 STOP=1 to=off xon=off
     odsr=off octs=on dtr=off rts=on idsr=off

mode.comに代わる良い方法をご存知の方、もしくはプログラム中で正しく通信速度の設定を行なう方法をご存知の方おりましたら教えてください。

その他の方法

VisualC++など、Win32APIを使える処理系が使える場合は、

 h = CreateFile("Com1", GENERIC_READ | GENERIC_WRITE, 0, ...)

とすることでCOMポートをオープン、読み書きすることが可能なようです。

また、Javaには、JavaCommという拡張APIがあるそうなので、これをダウンロードしてくればJavaでシリアルポートが扱えるようです。

まとめ

windowsで、無料で、(linux似なれている人にとって)簡単に、シリアルポートを扱うプログラムを書くには、

  • cygwinをインストールする。
  • linuxと同じように通信プログラムを記述。
  • リダイレクトを使わず、ちゃんとプログラム中で/dev/com1をopenして通信を行なう
  • 通信がうまくいかないときは、windowsのmode.comコマンドで通信速度の設定を行なう

のが良いようです。