PowerShellでのシリアル通信例です。2台のパソコンをRS232Cシリアルケーブル(クロスケーブル)で接続し通信を行います。
1台目のパソコンで下記のPowerShellプログラムを実行します。2台目のパソコンではターミナルソフトRLoginを使用します。
RLoginで文字入力を行い「Enter」キーで文字列を送信します。PowerShellプログラムでは、受信データを表示し、
受信文字にLF文字を追加し送信を行います。
通信仕様は、9600BPS、データ長8ビット、パリティなし、1ストップビット、フロー制御RTS/CTSとします。
RLoginでの設定については、こちらを参照して下さい。
# SerialTest.ps1 シリアル通信テスト
# キー入力
function Keyin{
$rtkey = $null
if ([Console]::KeyAvailable){
$rtkey = [Console]::ReadKey($false)
}
return $rtkey
}
# -------
$compt = New-Object System.IO.Ports.SerialPort "COM3", 9600
$compt.DataBits = 8
$compt.Parity = [System.IO.Ports.Parity]::None
$compt.StopBits = [System.IO.Ports.StopBits]::One
$compt.DtrEnable = $true
$compt.RtsEnable = $true
try{
$compt.Open()
}
catch{
Write-Host("COMポートOpen失敗")
exit
}
Write-Host("COMポートopen")
$brcv = New-Object byte[] 256
$ircvLen = 0
while ($true){
if ($compt.BytesToRead -gt 0){
$srdt = $compt.ReadByte()
$brcv[$ircvLen] = $srdt
$ircvLen++
if ($srdt -eq 0x0d){ #CR
$sr = [System.Text.Encoding]::ASCII.GetString($brcv, 0, $ircvLen)
Write-Host $sr
$brcv[$ircvLen] = 0x0a #LF
$ircvLen++
$compt.Write($brcv, 0, $ircvLen)
$ircvLen = 0
}
}
$inkey = Keyin
if ($inkey -ne $null -and $inkey.Key -eq "Q"){
break;
}
}
$compt.Close()
Write-Host("")
Write-Host("COMポートClose")
BytesToReadで受信バッファのデータバイト数を取得します。ReadByte()で受信バッファから1バイトを読み取り、バイト配列$brcvへセットします。GetStringで文字列に変換します。LFを受信文字列末尾に追加し、Write()で送信します。キーボード「Q」キー入力で終了します。
ISEではエラーとなりますので、コンソールウインドウで実行して下さい。
送信メソッド
・Write(byte[]:送信データ, int:送信データのオフセット, int:送信バイト数)
・Write(string:送信データ)
受信メソッド
・int = ReadByte() 1バイト読み取り
・int = Read(byte[]:書込み先, int:書込み先のオフセット, int:読み取り最大バイト数) 戻り値:読み取りバイト数
byte[]: バイト配列
Microsoft SerialPort