2010年11月6日土曜日

文字の送受信を考察

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

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

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

LED点灯・消灯部分(PC側)
private: System::Void ToggleLED_btn_Click(System::Object^  sender, System::EventArgs^  e) {
   ULONG BytesWritten = 0;//実際に書き込まれたバイト数
   unsigned char OutputPacketBuffer[64]; //送信バッファー

   OutputPacketBuffer[0] = 0x80;  //0x08はPIC側ではLEDの点灯・消灯のコマンド   
//送信エンドポイントへの書き込み
   WinUsb_WritePipe(MyWinUSBInterfaceHandle, 0x01, &OutputPacketBuffer[0], 64, &BytesWritten, NULL);  
}

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

void ProcessIO(void)
{   
  //PC側のアプリケーションが接続状態にない場合のLED制御
    if(blinkStatusValid)
    {
        BlinkUSBStatus();
    }

    if((USBDeviceState < CONFIGURED_STATE)||(USBSuspendControl==1)) return;
    
    if(!USBHandleBusy(USBGenericOutHandle))  //エンドポイントがホストからのデータを受信したかどうかを確認します。
    {   
        switch(OUTPacket[0])     //データが到着したら、コマンドの種類を調べる
        {
            case 0x80:  //PC側アプリケーションの点灯・消灯コマンド
          blinkStatusValid = FALSE;  //通常のLED点灯パターンを終了
                if(mGetLED_1() == mGetLED_2())
                {
                    mLED_1_Toggle();
                    mLED_2_Toggle();
                }
                else
                {
                    mLED_1_On();
                    mLED_2_On();
                }
                break;
            case 0x81:  //PC側アプリケーションからボタンの状態を調べるコマンドを受け取った場合
                INPacket[0] = 0x81;  //
    if(sw2 == 1)     //プッシュボタンが押されていない時
    {
     INPacket[1] = 0x01;   
    }
    else       //プッシュボタンが押されている時
    {
     INPacket[1] = 0x00;
    }    
                if(!USBHandleBusy(USBGenericInHandle))  
             {
     //USBGenWrite():USB送信関数
     USBGenericInHandle = USBGenWrite(USBGEN_EP_NUM,(BYTE*)&INPacket,USBGEN_EP_SIZE); 
                }
                break;
        }
        
        USBGenericOutHandle = USBGenRead(USBGEN_EP_NUM,(BYTE*)&OUTPacket,USBGEN_EP_SIZE);
    }
}//end ProcessIO

0 件のコメント:

コメントを投稿