はじめに
電子デバイスの開発に何らかの形で関係している人の多くは、Labcenter ElectronicsのProteusソフトウェアパッケージを少なくとも一度は聞いたことがあると思います。 モデリングに使用できるコンポーネントの広範なライブラリが何であれ、回路の「寿命」は、まれな例外を除いて、エミュレータウィンドウの制限に制限されます。 たとえば、いくつかのデータをファイルに書き込んだり、USBデバイスとしてシステムに提示したりできるモデルがいくつかありますが、これまでのところ、小さなクラスの問題を解決できます。
挑戦する
航空機の無線制御システムを開発する必要があるフレームワーク内で、コースプロジェクトに取り組むとき、モデルをPCに接続することが必要になりました。 PCとの通信用の最も単純なインターフェースの1つはRS-232であるため、それが選択されました(usb-uartアダプターが使用されました)。
それでは、電子コンポーネントの故障につながる可能性のある非常に大きなエラーがまだ発見されておらず、頻繁なファームウェアを備えたマイクロコントローラーに煩わされていない、非常に初期段階でこのシステムをどのようにデバッグしますか?
かなり便利なソリューションはプロテウスです。 しかし、ここで新しい問題が現れます-PCとの通信。
コンポーネントライブラリにはCOMPIMモデルが含まれています。これにより、回線をPC COMポートに関連付けることができ、このCOMポートに接続されているデバイスからの要求をエミュレートされたデバイスに接続されているかのように処理できます。 もちろん、別のCOMポートを介して回路に接続されているポートに接続することもできますが、これには2x COMポートと外部ヌルモデムケーブルが必要です。
仮想COMポートのアイデアはすぐに思い浮かびます。 たとえば、 com0comは、入力と出力が相互にリダイレクトされる2つの仮想COMポートを作成します。 また、何らかの理由で仮想マシンで作業する人にとっては、VMツールを使用してcomポートをリダイレクトする機能が役立つ場合があります。
しかし、
モデルを作成する手順
モデルのグラフィックイメージの作成
長方形、別の長方形、テキスト、結論(デバイスピンを使用)を追加します。
その記事またはここで詳しく説明します
プログラム開発
モデルと対話するために、Windows OSの名前付きパイプを使用することにしました。 おそらく、ソリューションは奇妙に見えるかもしれませんが、アイデアは、実際のデバイスのインターフェイスにできるだけ類似したインターフェイスを提供することです。 名前付きパイプとCOMポートでの作業は通常のファイルでの作業とほとんど同じであるため、選択は名前付きパイプに依存しました。
しかし、「外の世界」との通信チャネルがある場合でも、artインタフェースを介して交換を実装する方法はありますか?
フレーム形式を思い出す必要があります。
この種の信号を生成/解析するロジックは、別のクラスに割り当てられます。
プロテウスモデルの主なものは2つの方法です。
初期セットアップの実行:
VOID PIPEUARTMODEL::setup (IINSTANCE *instance, IDSIMCKT *dsimckt) { uart = new Uart(); logger = new Logger(instance); pipe = new Pipe("\\\\.\\pipe\\uart", logger); // dsimckt ckt = dsimckt; // txd = instance->getdsimpin("TXD", true); rxd = instance->getdsimpin("RXD", true); // txd txd->setstate(SHI); // 2 ckt->setcallback(1, this, rxd_event); ckt->setcallback(2, this, txd_event); }
そして、callback'omをジャーク
VOID PIPEUARTMODEL::callback(ABSTIME time, EVENTID eventid) { switch (eventid) { case rxd_event: uart->rxBit(ishigh(rxd_pin_state)); // if (uart->rxC) { pipe->rxd_queue.push(uart->rxD); // pipe uart->rxC = 0; } // ckt->setcallback(time + 1000000000000 / uart_baudrate, this, rxd_event); break; case txd_event: if ((uart->txC) && (!pipe->txd_queue.empty())) { uart->txD = pipe->txd_queue.front(); // uart pipe->txd_queue.pop(); } txd->setstate(time, 1, uart->txBit() ? SHI : SLO); // ckt->setcallback(time + 1000000000000 / uart_baudrate, this, txd_event); break; } }
テスト中
仮想端末で動作する私のモデルの例:
このソリューションがどれほど便利かはまだわかりませんが、一見したところ、完全に私に合っています。
提示されたレシピが多くの問題の解決に役立つことを願っています。