Top > 気まぐれ日記 > 2003-08-04

スクリプトで通信

Windows上のスクリプト系言語でシリアル通信ができないか考え中。

まずはWSH(VBS)で挑戦。
当然ながらActiveXを使用しないと通信できません。
MSComm.ocxの開発ライセンスが入っているパソコンなら、MSCommもありかなとか思いつつテスト。

Set MSComm1 = CreateObject("MSCOMMLib.MSComm.1")
MSComm1.CommPort = 1
MSComm1.Settings = "9600,n,8,1"
MSComm1.Handshaking = 0
MSComm1.PortOpen = True

strNew = MSComm1.Input
'******** 中略 ********

MSComm1.PortOpen = False
Set MSComm1 = Nothing

開発ライセンスが入っててもVisualStudio以外で使用できるかわからないので没。
ExcelでMSCommを使っているサンプルをたまに見かけるけど、ライセンスはどうなってるんだろう...

次はperlで挑戦。
ActivePerlFAQによると、perlでも普通にファイルとしてオープンすれば良いらしい。

open(PORT, "+>COM1") || die "Can't open COM1: $!";
for(;;){
    if(read(PORT, $new, 1)){
        last if($new eq "\n");
        $line .= $new;
    }else{
        sleep 1;
    }
}
print $line . "\n";
close PORT;

お手軽だけど、ボーレート等のAPIを使わないとダメみたい。

PPM> install Win32-API

でWin32::APIをインストール。
使い方をWebで検索していたら、シリアル通信用のWin32::SerialPortという素敵な物がHit。
早速、

PPM> install Win32-SerialPort
'''Error installing package 'Win32-SerialPort': Read a PPD for 'Win32-SerialPort', '''
'''but it is not intended for this build of Perl (MSWin32-x86-multi-thread)'''

このバージョン用のppmがなくてガックリ。渋々手動でインストール。

use Win32::SerialPort;

$PortObj = new Win32::SerialPort("COM1") || die "Can't open COM1: $^E\n";
$PortObj->databits(8);
$PortObj->baudrate(9600);
$PortObj->parity("none");
$PortObj->stopbits(1);
$PortObj->handshake("none");
$PortObj->buffers(4096, 4096);
$PortObj->write_settings;

do{
    select(undef, undef, undef, 0.1);
    $line = $PortObj->streamline;
}until(length($line) > 0);

print $line . "\n";

$PortObj->close;
undef $PortObj;

まだ蛇は使ってないです。Rubyの方が良いかな。