テクセル

PowerShellでシリアル通信


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

PowerShellメモ
©2021-2025 TEXCELL CORPORATION
テクセル株式会社