平成27年 1月 8日
謹賀新年
相変わらずHPの更新が滞ってしまっています。もう少し定期的に追加できるように努力します。
MPLAB Harmonyの使い方(11) USBライブラリの導入(4) ループバック動作の完了
12/16に一旦ループバックモードでの動作を記述したのですが内容に誤りがあったためプログラムを丁寧に読んでいました。
全てを理解したわけではないのですが、現時点での問題点を修正できる程度には動作を追跡できたので、取りあえずはループバック動作を完成させます。
問題点
問題点は受信を完了した段階で受信データの先頭1バイトのみを送り返しているため、これを受信文字数分だけ送り返すように変更すれば良い。
では受信した文字数はどこに記憶されているか?
結論だけを書くと下記のように記述すればループバック動作します。
(H27/01/10追記)
先のプログラム変更分からの変更を記述したのですが、先の変更分は既に取り消し線で削除した状態になっていました。
これでは正しい状態を読み取れないので、元のサンプルプログラムからの変更点を示すように書き換えます。
元のサンプルプログラムからの変更点は、下記です。
・com1とcom2で接続がクロスしているのを、通常のループバック状態に変更する。ただしデバッグを簡単にするためcom1のみ動作させcom2はコメント化する。
・USBの1パケットで複数文字が送られてきても、全ての文字を送り返す
app.c 420行目付近
case APP_STATE_CHECK_FOR_READ_COMPLETE:
if(appData.appCOMPortObjects[COM1].isReadComplete == true)
{
/* This means we got data on COM1. Write this data to COM2.*/
appData.appCOMPortObjects[COM1].isReadComplete = false;
appData.appCOMPortObjects[COM1].isWriteComplete = false;
USB_DEVICE_IRP * irp = (USB_DEVICE_IRP *)
appData.appCOMPortObjects[COM1].readTransferHandle;
USB_DEVICE_CDC_Write(COM1,
&appData.appCOMPortObjects[COM1].writeTransferHandle,
com1ReadBuffer, irp->size,
USB_DEVICE_CDC_TRANSFER_FLAGS_DATA_COMPLETE);
}
#if 0 //com2動作をコメントアウト
if(appData.appCOMPortObjects[COM2].isReadComplete == true)
{
/* This means we got data on COM2. Write this data to COM1 */
appData.appCOMPortObjects[COM2].isReadComplete = false;
appData.appCOMPortObjects[COM1].isWriteComplete = false;
USB_DEVICE_CDC_Write(COM1,
&appData.appCOMPortObjects[COM1].writeTransferHandle,
com2ReadBuffer, 1,
USB_DEVICE_CDC_TRANSFER_FLAGS_DATA_COMPLETE);
}
#endif
appData.state = APP_STATE_CHECK_FOR_WRITE_COMPLETE;
break;
case APP_STATE_CHECK_FOR_WRITE_COMPLETE:
/* Check if the write is complete */
#if 0 //com2動作をコメントアウト
if(appData.appCOMPortObjects[COM2].isWriteComplete)
{
USB_DEVICE_CDC_Read(COM1,
&appData.appCOMPortObjects[COM1].readTransferHandle,
com1ReadBuffer, APP_READ_BUFFER_SIZE);
appData.appCOMPortObjects[COM1].isReadComplete = false;
appData.appCOMPortObjects[COM2].isWriteComplete = false;
}
#endif
if(appData.appCOMPortObjects[COM1].isWriteComplete)
{
USB_DEVICE_CDC_Read(COM1,
&appData.appCOMPortObjects[COM1].readTransferHandle,
com1ReadBuffer, APP_READ_BUFFER_SIZE);
appData.appCOMPortObjects[COM1].isReadComplete = false;
appData.appCOMPortObjects[COM1].isWriteComplete = false;
}
appData.state = APP_STATE_CHECK_IF_CONFIGURED;
break;
(H27/01/10追記ここまで)
受信文字数の記憶はappData.appCOMPortObjects[COM1].readTransferHandleポインタの指し示す構造体内部のsizeという変数に保管されています。従って、この値をPICからホストPCへの送信要求の文字数に設定すれば、受信した正しい文字数分のデータが送り返されます。
この内容についてもう少し細かな内容を書きたいのですが、文字数が多くなりすぎるので数日に分けて書くようにします。