2010年11月6日土曜日

文字の送受信を考察

WinUSB での文字列の送受信は、以下の二つの関数を使って行います。

PC側
送信:WinUsb_WritePipe();
受信:WinUsb_ReadPipe();

マイクロソフト MSDNの解説
http://msdn.microsoft.com/en-us/library/ff540322%28VS.85%29.aspx

LED点灯・消灯部分(PC側)
  1. private: System::Void ToggleLED_btn_Click(System::Object^  sender, System::EventArgs^  e) {  
  2.    ULONG BytesWritten = 0;//実際に書き込まれたバイト数  
  3.    unsigned char OutputPacketBuffer[64]; //送信バッファー  
  4.   
  5.    OutputPacketBuffer[0] = 0x80;  //0x08はPIC側ではLEDの点灯・消灯のコマンド     
  6. //送信エンドポイントへの書き込み  
  7.    WinUsb_WritePipe(MyWinUSBInterfaceHandle, 0x01, &OutputPacketBuffer[0], 64, &BytesWritten, NULL);    
  8. }  

PIC側
送信:USBGenWrite();
受信:USBGenRead();

  1. void ProcessIO(void)  
  2. {     
  3.   //PC側のアプリケーションが接続状態にない場合のLED制御  
  4.     if(blinkStatusValid)  
  5.     {  
  6.         BlinkUSBStatus();  
  7.     }  
  8.   
  9.     if((USBDeviceState < CONFIGURED_STATE)||(USBSuspendControl==1)) return;  
  10.       
  11.     if(!USBHandleBusy(USBGenericOutHandle))  //エンドポイントがホストからのデータを受信したかどうかを確認します。  
  12.     {     
  13.         switch(OUTPacket[0])     //データが到着したら、コマンドの種類を調べる  
  14.         {  
  15.             case 0x80:  //PC側アプリケーションの点灯・消灯コマンド  
  16.           blinkStatusValid = FALSE;  //通常のLED点灯パターンを終了  
  17.                 if(mGetLED_1() == mGetLED_2())  
  18.                 {  
  19.                     mLED_1_Toggle();  
  20.                     mLED_2_Toggle();  
  21.                 }  
  22.                 else  
  23.                 {  
  24.                     mLED_1_On();  
  25.                     mLED_2_On();  
  26.                 }  
  27.                 break;  
  28.             case 0x81:  //PC側アプリケーションからボタンの状態を調べるコマンドを受け取った場合  
  29.                 INPacket[0] = 0x81;  //  
  30.     if(sw2 == 1)     //プッシュボタンが押されていない時  
  31.     {  
  32.      INPacket[1] = 0x01;     
  33.     }  
  34.     else       //プッシュボタンが押されている時  
  35.     {  
  36.      INPacket[1] = 0x00;  
  37.     }      
  38.                 if(!USBHandleBusy(USBGenericInHandle))    
  39.              {  
  40.      //USBGenWrite():USB送信関数  
  41.      USBGenericInHandle = USBGenWrite(USBGEN_EP_NUM,(BYTE*)&INPacket,USBGEN_EP_SIZE);   
  42.                 }  
  43.                 break;  
  44.         }  
  45.           
  46.         USBGenericOutHandle = USBGenRead(USBGEN_EP_NUM,(BYTE*)&OUTPacket,USBGEN_EP_SIZE);  
  47.     }  
  48. }//end ProcessIO  

0 件のコメント:

コメントを投稿