« EXCELで数値/文字列しかコピーできない | トップページ | Visual Studio 2015でOpenCV3.0.0 »

PIC24FでSetCommStatusするとエラー

最近PICをいじっていてハマったことをメモします。
<前提となる環境>

  • PIC24F64GB002 +Microchip Solutions v2012-07-18でのMSD+CDCファームを作成
  • 後閑先生の「改定新板 PICで楽しむUSB機器 自作のすすめ」が参考書
  • usb_config.hでUSB_INTERRUPTにより割り込み処理設定済み
  • コンパイラはMPLAB8.84+C30(V3.25)

<現象>

  • TeraTermではなんの問題もなくCDC通信できてたので余裕かましていたら、自前アプリでの通信時にエラーで涙目
  • デバッガーで追いかけるとGetCommStatusは成功するがSetCommStatusでエラーが100%発生して終了している
  • GetLastError()値は 31(0x1F) システムに接続されたデバイスが機能していません。
  • 英語版なら「A device attached to the system is not functioning.」

<原因>

  • usb_function_cdc.cで定義されているUSBCheckCDCRequest();をどこからも呼び出していないのが問題。(SetCommStatusの応答処理を行う)
  • 「改定新板 PICで楽しむUSB機器 自作のすすめ」のMSDサンプル(GPSロガー)のコード(P.326)を鵜呑みにしたのが敗因。
  • TeraTermはSetCommStatusの戻り値(成功or失敗)にかかわらず処理をすすめるナイスな奴っぽい。だけどオーソドックスなAPI利用のシリアル通信だと今回のようにエラーで身動きがとれなくなる。
  • 先生のCDC動作確認もTeraTermなので多分気づかない
  • SetCommStatusは少なくない量のデータを送るので、低クロックなPICの場合問題になることがある。PIC24Fは32MHz駆動で特に問題はでてない。

<解決策>

後閑先生のコードを参考にしたのなら、main.cとかに存在するはずのUSBCBCheckOtherReqへUSBCheckCDCRequest();を追加することでスルっと幸せになれます。

void USBCBCheckOtherReq(void)
{
    USBCheckMSDRequest();
}

          ↓

void USBCBCheckOtherReq(void)
{
    USBCheckMSDRequest();
    USBCheckCDCRequest(); //これを追加。
}

ということで、PICに関係してない人には何が何やらな内容ですが、いつものように関連キーワードてんこ盛りなので、きっと誰かの役に立つはずと信じて終わります。

あと、「技術評論社か先生のページにでも修正(なんだろうか・・)依頼をだせyo」って声も感じなくはないのですが、畏れ多いのでここにこそっとメモします。つか、この問題で8時間もロスしたよ。USB動作の勉強にはなったけど・・・(T∇T)

<参考リンク>

« EXCELで数値/文字列しかコピーできない | トップページ | Visual Studio 2015でOpenCV3.0.0 »

VS2008(VC9)」カテゴリの記事

PIC」カテゴリの記事

コメント

「システムに接続されたデバイスが機能していません。」で検索して辿り着きました。

秋月のPIC18F14K50ボードとVB2010でデータロガーを作ろうとしてた所、
全く同じエラーが出て困ってました。

他にも問題があって、まだデータは取得できていませんが、
コードを追加した所、当該エラーは無くなりました。

スルッと幸せになれそうです。
ありがとうございます。

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: PIC24FでSetCommStatusするとエラー:

« EXCELで数値/文字列しかコピーできない | トップページ | Visual Studio 2015でOpenCV3.0.0 »

カレンダー

  • keisan
無料ブログはココログ
2019年11月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30