TL;DR
VirtualBox の 5.0 から入ったシリアルポートのTCP/IP backend 機能を使うと、VM起動時に localhost にTCPポートが開き、そこにホスト側から接続するとVMの /dev/ttyS0
につながるので
$ echo -en "\x02PayLoad\x03" | nc localhost 10001
$ sudo screen /dev/ttyS0
で通信しあったりできるお。
お困りごと
IoTをやってると、シリアルポートデバイスと向き合う時間がとても増えます。しかし実機が無くて困ったことありませんか?
VirtualBoxを使っているのであればシリアルポートの設定で「ポートモード=TCP」を活用してみてください。はかどります。
やりかた
VirtualBoxのVM設定内、シリアルポートの設定で下記の通りにしてください
- シリアルポートを有効化: チェックする
- ポート番号: COM1 (COM1 なら
/dev/ttyS0
になります) - ポートモード: TCP
- 存在するパイプ/ソケットに接続: チェックをはずす
- パス/アドレス: 適当なポート番号 (例では
10001
としました)
この状態で起動すると Linux(Ubuntu) なら dmesg
にこんな感じで /dev/ttyS0
が出来上がります
$ sudo dmesg | grep tty
[ 0.000000] console [tty0] enabled
[ 1.303306] 00:02: ttyS0 at I/O 0x3f8 (irq = 4, base_baud = 115200) is a 16550A
POINT;
「存在するパイプ/ソケットに接続」はデフォルトでチェックがついているのですが、これがついていると起動できません(空いているポートを探しに行く?原因不明ですけど。)
つかいかた
ホスト側から telnet や nc といったコマンドで localhost:10001
へ接続するだけです
以下の動画は上がゲストのLinux(Ubuntu)で screen /dev/ttyS0
に接続、ホスト側は telnet や nc で localhost:10001
に接続して、双方でデータをやり取りしている様子です
※Linux → ホストでは、screen がecho backしてないので何も入力してないように見えますが。
データ送信のTips
echo
コマンドの -e
や -n
オプションと \x
を使えばバイナリ文字列も送信できます
$ echo -en "\x02Payload\x03\n" | nc localhost 10001
あとがき
前までは com0com 等の仮想シリアルポートを使う方法がありましたが、より簡単にシリアルポートをエミュレートできるようになって便利ですね
EoT