2010-12-06 15 views
0

Unity3Dエンジンを使用する別のプログラムの.Netシリアルポートメソッドを使用しようとしています。dllの中にコールバック関数を置くことはできますか?

シリアルポートが何らかのデータを受け取ったときにコールバック関数を登録し実装するC#クラスライブラリ(dll)があります。

public CSerialDll() 
{   
    _serial.DataReceived += new SerialDataReceivedEventHandler(serial_DataReceived); 
} 

void serial_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
    int bytes = _serial.BytesToRead; 
    _comBuffer = new byte[bytes]; 
    _serial.Read(_comBuffer, 0, bytes); 
    Console.WriteLine("data recv: " + System.Text.ASCIIEncoding.ASCII.GetString(_comBuffer)); 
} 

私の別のプログラムでは、クラスのインスタンスを作成します。

ライブラリ(dll)内の私のコールバックserial_DataReceivedが呼び出されるかどうかを知りたいと思います。私はライブラリ内の_comBufferを別のプログラムから読み込もうとしています。同じアプリケーション内のコンソールアプリケーションでテストしたときにデータが出てきても、常に空です。

ご協力いただきまして誠にありがとうございます。私はクラスの設計者だった場合は、SerialDataReceivedEventArgsクラスを見れば、あなたはその中にあなたがバッファされていることがわかりますので、私は、コールバックにデータを置く

おかげ

答えて

0

<HUNCH>

データ。

イベントを取得してからreadを呼び出すと、実際に送信されたデータを破棄してより多くをリクエストします。

つまり、外部ライブラリであるという事実は、それが正常に動作していないという事実とは関係がありません。

</HUNCH>

+0

これは私が独自のシリアルポートライブラリを書いた方法ですが、見た目からは、Microsoftの 'Serial.IO.Ports'ライブラリを使用しています。これは実際にイベントを取得した後にデータを読み込まなければならないイベントに添付されていません。実際には、Microsoftの 'SerialPort'クラスではうまくいきません。 –

0

アクセス修飾子が正しく設定されている限り、別のDLLにあるメソッドについて特に何も特別なものは、通常ありません。

ただし、ソリューションの設定方法によっては、binフォルダに最新のDLLがあることを確認するのに苦労する可能性があります。

+0

それは動作するはずです。しかし、問題はそうではありません。そのDLLを使用するクライアントでは、そのDLLの新しいインスタンスを作成します。したがって、dllはコールバックを登録します。上のコードでわかるように、そのコールバックは外部プログラムから読み込むためのプロパティを持つ_comBufferを埋めます。そして、私のクライアントプログラムの更新ループで、そのプロパティを読み込もうとしました。このプロパティは常に空です。しかし、私はコンソールアプリケーションプロジェクトとしてdllプロジェクトを作成し、コードをテストするための主要なメソッドを書いたとき、私はシリアルからデータを受け取ることができます。何か案は?ありがとう... – astk

+0

@astkだから、コードをステップ実行すれば、あなたの観測は何ですか?また、コードが別のdllにあるという理由だけで、それを踏まえられないわけではありません。 –

+0

こんにちは...どのようにステップスルー?私はそのDLLを使用するクライアントとしてUnity3Dを使用しています。私は統一の脚本を踏むことができました。しかし、DLLのソースレベルではありません。ありがとうございました... – astk

関連する問題