VirtualBoxでゲストからホストのシリアルポートを使用する方法

シリアルポートアクセスは、組み込みソフトウェアエンジニアとしての私の役割において非常に重要です。これは、使用しているオペレーティングシステムや、物理プラットフォームと仮想プラットフォームのどちらの場合でも当てはまります。
 
私の主なオペレーティングシステムはWindows XPですが、私が関わっている多くのプロジェクトではLinuxを使用する必要があります。ワークスペースで複数のコンピューターを同時に実行したくないのには2つの理由があるため、これは問題になる可能性があります。余分なケーブルはすべて絡み合って混乱するので、作業を完了するために必要なオシロスコープなどの他の機器のためにスペースを空けておきたいと思います。
 
この問題を回避するために、WindowsホストマシンにゲストOSとしてKubuntuをインストールしました。デバッグを実行するには、ホストのシリアルポートへのアクセスが必要です。 VirtualBoxは、ゲストがシリアルポートにアクセスできるようにする構成が簡単なソリューションです。唯一の欠点は、これを実現する方法が複数あり、混乱を招く可能性があることです。これがこの投稿の理由ですが、先に進む前に、シリアルポートについて少し説明しましょう。
 
**シリアルポートの命名方法**
 
WindowsとLinuxでは、シリアルポートの識別に非常に異なる命名規則を使用しています。 Windowsマシンでは、ポートの名前はCOM1、COM2などです。 Linuxは、/ dev / ttyS0、/ dev / ttyS1などの形式を使用します。これから説明する例には、両方のオペレーティングシステムが含まれます。話しているポートの混乱を避けるために、WindowsではCOM1を、Linuxでは/ dev / ttyS0を使用して、これらの名前を同じIOポートとIRQにマッピングします。 COM2は/ dev / ttyS1と同等であり、使用するすべてのシリアルポートでパターンが維持されます。


| Name Under Windows  |Name Under Linux|IO Address|Interrupt Request (IRQ)|
|:-----------------|------------------:|:------------------:|:------:|
| COM 1            |             COM 2 |        COM 3       |COM4      |
| /dev/ttyS0       |     /dev/ttyS1    |   /dev/ttyS2.      |/dev/ttyS3|
| 3F8             |              2F8 |        3F8        |2F8|
| 4               |                3 |         4         |3|


**セットアップと要件：**
 
私のコンピューターには、WindowsがCOM1、COM2、COM3、およびCOM4として定義する4つのシリアルポートがあります。このプロジェクトでは、VirtualBox仮想マシンにインストールされているKubuntuゲストからCOM3にアクセスできる必要があります。混乱を避けるためにCOM3を使用することを選択しましたが、この方法を使用して任意のポートにアクセスできます。
 
**VirtualBox構成：**
 
次に、ゲストオペレーティングシステムの仮想シリアルポートをホストの物理COMポートに接続するようにVirtualBoxを構成する必要があります。これは、VirtualBoxのシリアルポート構成ダイアログで無視するものを知っている場合は簡単です。仮想マシンで最初にシリアルポート構成ダイアログボックスを開くと、[ポルト]タブが表示されます。 IRQ、IO PORT、およびCreate Pipeフィールドは無視します。
 
1. ポルトタブで、シリアルポートを有効にするチェックボックスを選択します。これは、他の設定を変更する前に行う必要があります。


2. ポート番号：このフィールドは、ゲストOSのポート番号を参照します。これを/ dev / ttyS0にマップするため、COM1を選択する必要があります。これは、マシンの物理ポートを指すのではないことに注意してください。


3. ポートモード：このパラメーターは「ホストデバイス」に設定する必要があります。これにより、仮想ポートを物理ポートに接続できます。


4. ポートパス：「ホストデバイス」ポートモードフィールドは、物理ホスト上の物理デバイスポート番号を使用します。前述のとおり、COM3に接続するので、ここではその値を使用します。

以下のスクリーンショットは、仮想ボックス構成を示しています。
 ![image2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447311/9a553265-40a2-5c58-ee25-c87939cac5b1.jpeg)

 
必要なのは、これらの3つのフィールドを指定した値に設定するだけです。これで終了です。次に、構成が意図したとおりに機能することを確認します。 Kubuntu仮想マシンは、COM1、または0x3f8のI / Oポートと4のIRQを備えたシリアルポートを/ dev / ttyS0にマップします。
 
**ゲストOSでの確認：**
 
ゲストオペレーティングシステムのシリアルポートターミナルを使用して、構成を確認する必要があります。私はこの役割を果たすためにCutecomを選びました。 2つの異なる方法を使用して検証を実行できます。

1. 物理シリアルポートのショートピン2および3。これを行うと、シリアルポートのRxピンとTxピンが短絡します。その結果、ターミナルを介して送信されたデータはすべてエコーバックされます。

2. シリアルデバイスをポートに接続し、コマンドまたは機器をサポートするアプリケーションを使用して、その動作を確認します。

追加の機器を必要とせず、どのユーザーでも実行できるため、最初の方法を使用します。物理シリアルポートのRXピンとTxピンを短絡し、Cutecomが/ dev / ttyS0を使用していることを確認するように設定します。以下のスクリーンショットを他の設定のガイドとして使用してください。
 ![image3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447311/7fe1067a-d59b-d114-9ebd-8fa557c1682b.jpeg)


ここでそれは動作しています：
![image1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447311/32463eb6-ccac-8b3e-cca7-762aba72692c.jpeg)
 

ゲストOSでのシリアルポートの動作
**最終的な考え：**
1. このテストはKubuntuで実施されましたが、すべてのLinuxディストリビューションに適用されます。
2. ポートを使用しているVMがアクティブな場合、選択した物理ポートはホストで使用できません。
3. COM1を/ dev / ttyS0にマップするには、ポート番号とポートパスの両方のフィールドをVirtualBoxでCOM1に設定する必要があります。
4. WindowsがゲストOSの場合、ハイパーターミナルとVirtualBoxのポート番号フィールドで定義されたポート名を使用できます。