"シリアル" (RS-232 / RS-422シリアルプロトコル)

"Serial"は,RS-232およびRS-422のプロトコルを通して,シリアル通信の汎用インターフェースを提供する.

シリアル通信は通常,Unixベースのシステムでは/dev/ttyXXデバイスを通して,WindowsベースのシステムではCOMポートを通して,使用することができる.

シリアル通信は,UARTを使ってハードウェアに実装されることが多い.

シリアルポートの物理コネクタとしては,D-sub25ピンコネクタとDE-9 9ピンコネクタが含まれる.

シリアル通信は,USB,Bluetooth(ブルートゥース)等を通じて行われることが多い.

デバイス発見

  • シリアル接続は,通常自動的に発見することはできず,ドキュメントからしか判断できないことが多い.
  • Unixベースのシステムでは,シリアル接続の名前は時おり,特定の接続が繋げられる前と繋げられた後の/dev/ttyXXデバイスのリストを比べることによって,識別できることもある.

デバイスを開く

    DeviceOpen["Serial"]

    デフォルトのシリアルポートを開く.

    DeviceOpen["Serial",name]

    指定された名前のシリアルポートを開く.Unixベースのシステムで一般的な名前は,"/dev/ttyXX"あるいは"/dev/tty.usbserialXX"であり,Windowsでは"COM1","COM2"等である.

    DeviceOpen["Serial",{name,opts}]

    指定されたオプションでデフォルトのシリアルポートを開く.

  • 以下のオプションを使用することができる.
  • "BaudRate"9600データ転送速度(単位:ビット/秒)
    "DataBits"8各フレームに使用するデータビットの数
    "Handshake"Noneフロー制御ハンドシェイクプロトコル
    "IgnoreBreak"Falseブレークを無視するかどうか
    "Parity"Noneパリティビットの設定
    "ReadBufferSize"4096読込みバッファのバイトサイズ
    "StopBits"None使用するストップビットの数
  • 典型的な通信速度は,48009600192003840057600115200230400である.
  • "DataBits"は,データを転送するのに使われる各バイトにおけるビット数を返す.可能な値は,56789である.
  • フロー制御ハンドシェイクプロトコル"Handshake"で可能な値は, None"RTS""XOnXOff"である.
  • パリティビットがどのように設定されるかを指定する"Parity"の値には,None"Even""Odd""Mark""Space"のいずれかが可能である.
  • "StopBits"は,データフレームを分けるのに使われるビットの数を与える.可能な値は,None11.52である.

デバイスの設定

  • 設定は必要ない.シリアル接続のパラメータを設定する場合は,DeviceOpenを使う.

データの読取り

    DeviceRead[dev]

    シリアル接続から単一バイトを読み取り,整数値を返す.

    DeviceRead[dev,"String"]

    シリアル接続から単一文字を読み取り,その文字を文字列として返す.

    DeviceReadBuffer[dev]

    シリアル接続バッファで使用できるすべてのバイトを読み取り,整数のリストを返す.

    DeviceReadBuffer[dev,n]

    シリアル接続バッファ内の最近の n 個のバイトを読み取る.

    DeviceReadBuffer[dev,"ReadTerminator"->term]

    シリアルポートバッファから,ターミネータ term までバイトを読み取る.

  • DeviceReadLatestDeviceReadTimeSeries等のWolfram言語関数もサポートされている.
  • Wolfram言語では,バイトはその整数値で表される.
  • バイトのリストは,FromCharacterCodeを使って文字列に変換することができる.
  • "ReadTerminator"の設定は,単一のバイトでも文字でもよい.
  • 読み取るデータがない場合には,事前設定時間の10秒を越えると,読取り関数はタイムアウトする.

データの書込み

    DeviceWrite[dev,b]

    バイト b をシリアル接続に書き込む.

    DeviceWrite[dev,{b1,b2,}]

    バイト bi のリストをシリアル接続に書き込む.

    DeviceWrite[dev,"string"]

    文字列内のバイトをシリアル接続に書き込む.

  • DeviceWriteBuffer等のWolfram言語関数もサポートされている.
  • バイトは,0から255までの整数として,あるいは単一文字のASCII文字列として指定することができる.

コマンドの実行

    DeviceExecute[dev,"ReadFlush"]

    読み取り,バッファされた任意のデータをフラッシュする.

    DeviceExecute[dev,"SerialReadyQ"]

    読込みのために使用できるバッファされたデータがある場合にはTrueを,それ以外の場合にはFalseを返す.

  • "SerialReadyQ"コマンドを使うと,シリアル接続からの読取りをブロックできるかどうかをチェックすることができる.

リソースの終了と解放

    DeviceClose[dev]

    シリアル接続を閉じて,関連リソースを解放する.

例題

  (1)

これらの例は,USBで繋がれたArduinoを使って,Raspberry Pi上で実行されたものである.Arduinoは,スケッチと呼ばれるカスタムプログラムを実行している.

RaspberryPiに繋がれたArduinoへの接続を開き,Arduinoが返す文字列を読み取る:

Arduinoから送られた次のバイトを読み取る:

バイトをArduinoに書き込む:

文字列をArduinoに書き込む:

Arduinoへの接続を閉じる: