16
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

VirtualBoxの シリアルポートTCP/IP backend機能を使ってデバイス実機が無くても開発する方法

Last updated at Posted at 2018-03-08

TL;DR

VirtualBox5.0 から入ったシリアルポートのTCP/IP backend 機能を使うと、VM起動時に localhost にTCPポートが開き、そこにホスト側から接続するとVMの /dev/ttyS0 につながるので

host側
$ echo -en "\x02PayLoad\x03" | nc localhost 10001
guest側
$ sudo screen /dev/ttyS0

で通信しあったりできるお。

お困りごと

IoTをやってると、シリアルポートデバイスと向き合う時間がとても増えます。しかし実機が無くて困ったことありませんか?
VirtualBoxを使っているのであればシリアルポートの設定で「ポートモード=TCP」を活用してみてください。はかどります。

やりかた

VirtualBoxのVM設定内、シリアルポートの設定で下記の通りにしてください

  • シリアルポートを有効化: チェックする
  • ポート番号: COM1 (COM1 なら /dev/ttyS0 になります)
  • ポートモード: TCP
  • 存在するパイプ/ソケットに接続: チェックをはずす
  • パス/アドレス: 適当なポート番号 (例では 10001 としました)

VirtualBoxのシリアルポートの設定画面

この状態で起動すると 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してないので何も入力してないように見えますが。

7378a82689d78dea3c1e7ece787858d8-gif.gif

データ送信のTips

echo コマンドの -e-n オプションと \x を使えばバイナリ文字列も送信できます

host側
$ echo -en "\x02Payload\x03\n" | nc localhost 10001

あとがき

前までは com0com 等の仮想シリアルポートを使う方法がありましたが、より簡単にシリアルポートをエミュレートできるようになって便利ですね

EoT

16
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?