【RS232C over USBとは】
これは単純にUSBで接続されたデバイスを、PC側からみたときCOMポート
に接続された機器として扱えるようにするためのPIC側のファームウェアです。
ちょうど市販のUSBーRS232C変換アダプタと同じ機能になります。
こうすると、PIC側にこのファームウェアを入れてUSBデバイスを作れば
物理的にはUSBのコネクタで接続するデバイスですが、ソフトウェアから見ると
あたかもRS232Cで接続された機器として見えるようになります。
つまり「RS232Cエミュレータ」となることになります。
この最大のメリットは、パソコン側でこれまでのRS232Cを使ったソフトウェアが、
ほとんどそのまま使えるということです。しかも接続されるデバイスはUSB接続です。
ハイパーターミナルで通信することももちろん可能です。
マイクロチップ社からこのファームウェアがフリーで提供されていますので、
誰でも使うことができます。
入手は下記サイトでできます。
★ アプリケーションノート AN596
【RS232Cエミュレータの構成】
このエミュレータソフトの全体構成は、マイクロチップ社のUSBフレームワーク
に組み込まれているひとつのUSBクラスとなっていて、名称が「CDCクラス」と
なっています。従って下図のような全体構成となります。
まずPIC側はUSBフレームワークとしてCDCクラスを含んだ一式が提供されて
いますので、これにユーザープログラムをmain関数として作成します。
ダウンロードファイルにはサンプルのユーザープログラムが同梱されていますので
これを修正しながら作っていけば容易に作成できます。
PC側は、Windows標準のドライバをそのまま使いますので、INFファイルのみ
が必要となるだけです。サンプルのINFファイルが同梱されています。
このINFファイルにUSBのベンダIDとプロダクトIDを登録してPC側がUSBデバイス
として認識できるようにします。
サンプルプログラムとして同梱されているプログラムは、マイクロチップ社の
USB2.0用デモボード用となっています。
このデモボードは下記のようなものです。
★ PICDEM FS USB Demo Board
【RS232C over USBの関数】
このRS232CエミュレータをPICに組み込むと、パソコン側だけでなく、PIC側のユーザープログラムも
あたかもUARTと通信するように見える関数が使えるようになります。従ってユーザープログラム
ではUSBのことをそれほど意識しなくてもUSB通信ができるようになっています。
このようにしてPICのユーザーに提供される関数は下記となっています。いずれも単純な
データの送受信だけですので使い方は簡単です。
関数名 機 能 putrsUSBUSART プログラムメモリ内の文字列データをUSBで送信する putsUSBUSART データメモリ内の文字列データをUSBで送信する mUSBUSARTTxRom プログラムメモリ内の指定サイズのバイトデータをUSBで送信する mUSBUSARTTxRam データメモリ内の指定サイズのバイトデータをUSBで送信する mUSBUSARTIsTxTrfReady 送信レディ、次のデータが送れることを示す getsUSBUSART USBからバイト列データを受信する mCDCGetRxLength 最新の受信データの長さを取得する
《putrsUSBUSART》
0x00で終端された文字列を送信します。USBバッファより長い文字列の送信も可能で、最大
255バイトまでです。USBパケットより大きいサイズの場合には分割して送信します。
送信可能なデータはプログラムメモリ内のデータかリテラルとして定義されているデータです。
書式
void putrsUSBUSART(const rom char *data)
例
上側の例はリテラルとして文字列を定義した場合
下側の例は文字列を別に定義した場合です。
送信可能かどうかをレディーチェックで行う必要があります。
《putsUSBUSART》
0x00で終端されたデータメモリにある文字列を送信します。それ以外は前者と同じです。
書式
void putrUSBUSART(char *data)
例
この例は可変データを埋め込んだあと出力する例です
《mUSBUSARTTxRom》
マクロ命令でROMにある定数データを長さを指定して送信します。
長さは最大255バイトで、USBパケット長より大きいときは分割して送信されます。
この実際の送信実行はクラス関数の中で行われます。
書式
void mUSBUSARTTxRom(rom byte *pdata, byte len)
例
この例ではバイト定数を確保しておき、それを指定バイト数だけ
出力しています。
《mUSBUSARTTxRam》
マクロ命令で、データメモリのデータを送信します。他の条件は前者と同じです。
書式
void mUSBUSARTTxRam(byte *pdata, byte len)
例
この例ではデータを埋め込んでから長さ指定で出力していますので
復帰改行まで出力しません。
《mUSBUSARTIsTxTrfReady》
マクロ命令で、USB送信が可能な状態のとき1を返します。
この命令は下記のように待つためのwhile文として使うことはできません。
while(!mUSBUSARTIsTxTrfReady());
IF文でチェックしてレディで無ければUSB処理に戻るようにしなければなりません。
《getsUSBUSART》
指定サイズのバイト列をUSBから受信するための関数で、USBのバルク転送で
受信します。
この関数は指定文字数の受信が完了するまで待つのではなく、受信データが未達
であればUSB処理にすぐ戻り、次のポーリングサイクルでまた受信をチェックする
という動作をします。USBの受信データが無ければ戻り値が0になります。
受信したデータが指定サイズより大きい場合には、指定サイズ分だけ取り出して
指定バッファに格納します。逆に短い場合には、受信した分だけバッファに格納します。
サイズはUSBのエンドポイントのパケットサイズ以下でなければなりません。
書式
byte getsUSBUSART(char *buffer, byte len)
例
1バイト受信してデータが文字「1」だったらLEDを反転させ同時に文字列を
返送します。
《mCDCGetRxLength》
マクロ命令で、最後に受信したデータのデータ数を返します。
【ユーザープログラムの作り方】
USBフレームワーク内でユーザープログラムを作るときに注意しなければならないことは、
USBのポーリングを止めるようなプログラムを記述してはならないということです。
つまり、永久ループや長いディレイ、I/O終了を待つwhile文などは使えません。
常にできるだけ早い周期でUSBのイベントをチェックするポーリングに戻してやる
必要があります。
またこのRS232Cエミュレータの送信関数は、すぐ送信実行するわけではなく、
USBのバッファが準備できた状態にするだけです。その後のUSBのポーリングで
初めて送信が実行されます。
従って例えば、たくさんの送信データがあって連続して送信する場合に、送信関数を続けて
記述すると、最後の1つだけが有効な送信データとなり、それ以前の記述は上書きされて
しまって無くなってしまいます。
そこでこのように連続してデータを送信したい場合には、ステートマシンの記述方法を
する必要があります。下記がその例です。
この例ではstateを順番に+1していて、1回の実行では3つある送信の内1個のみしか
実行できません。実行の都度stateが+1されますので順番に送信が可能になり、
そのとき送信条件が整っていれば送信を実行します。
【RS232C over USBをPCに接続するには】
このRS232Cエミュレータの展開ファイルの中に、USBデバイスインストール用のINFファイル
が同梱されています。
USBデバイスを初めて接続したときに、ドライバのインストールを要求されますが、そのとき
この同梱された 「mchpcdc.inf」のある場所を指定します。
このINFファイルの中に、USBデバイスの特定のベンダIDとプロダクトIDが記述されていて
これと一致するデバイスであれば自動的にインストールが開始されます。
実際にインストールされるドライバは、Windowsが標準で持っているドライバですので、特に
ドライバファイルはありません。
IDが異なるUSBデバイスとして作成した場合には、このINFファイルを修正する必要があります。
修正個所は、
[DeviceList] となっている個所に下記1行がありますので、ここに追加する形で修正すれば
良いようになっています。
例
赤字部分が追加した部分です。
[DeviceList]
%DESCRIPTION%=DriverInstall, USB\VID_04D8&PID_000A, USB\VID_09B9&PID_0046
また接続したときに表示されるメッセージやデバイス名称を変更したいときには、同じように
INFファイルの最後の方にある「String Definition」を変更すれば可能になります。