USB PICのコマンド(文字列)による制御

NO IMAGE

ついに、念願の文字列によるコマンドを送ってUSB PICを制御できるまでになった!!

あぁ、道のりは長かった。今回参考にさせていただいたサイトはここ
このサイトは、何かあったのだろう。現在自宅では、ピロシキ…いやプロキシを使わないと見られなくなってしまった。そのまま、見られなくなったのは、非常に残念な所である。

以前から、このサイトの存在は知ってはいたものの、おいらはここに書いてある内容を理解する所までは行っていなかったのだ(といっても、100%理解しているわけではないけれど)。

Device – CDC – Basic DemoというCDC(Communication Device Class)関連のプログラムをベースに変更したいと思う。

main.cというファイルに記述のある、ProcessIO関数の

if(USBUSARTIsTxTrfReady())…

という箇所が、PCから文字が送られてきた際、変数に格納し、次のキャラクターコードの文字にして返す処理を行う所というのは昨日紹介した通り。

つまり、ここに
1.PCから文字が送られてきた際、変数に格納
2.指定したコマンドがあるかどうか探す
3.文字をクリアする
…という動作を行えば、コマンド(文字列)をPCから送り、PICが指示通りの動作をするようになる。

色々やってみて、3は重要。受信した文字を、空にしてやらないと、誤動作するのだ。これは、実際やってもらえば分かるかも。

作例は、こんな感じ。ProcessIO関数のif(USBUSARTIsTxTrfReady())
となっている箇所を下記のように直し、
char tst1[]=”123″
char tst2[]=”456″
とどこかでこの変数を指定すれば、あ~ら簡単!!123というコマンドでRD0が、456というコマンドでRD1がH/Lと変化するじゃあーりませんか。

if(USBUSARTIsTxTrfReady()){

numBytesRead = getsUSBUSART(USB_Out_Buffer,64);
//文字をUSB_Out_Bufferという変数に格納すると同時に、numBytesReadという変数に文字数を格納。

if(numBytesRead != 0){

for(cnt = 0; cnt < numBytesRead; cnt++){ if(USB_Out_Buffer[cnt] == '\r') break;} USB_Out_Buffer[cnt] = '\0'; //文字列化 //\rが出てくるまで探す。文字の最後に\0を入れて文字列化する if(strcmp(USB_Out_Buffer,tst1) == 0){ LATDbits.LATD0 = !LATDbits.LATD0; }else if(strcmp(USB_Out_Buffer,tst2) == 0){ LATDbits.LATD1 = !LATDbits.LATD1; } for(cnt = 0; cnt < numBytesRead; cnt++){ USB_Out_Buffer[cnt] = 0; //誤動作防止のため、受信した文字を空にする } } USBの処理に関し、ポーリングを使っているため、この中で時間のかかる処理はできないけれど、単純な処理は十分可能。お試しあれ!