2010-12-06 6 views
0

Ich versuche, .Net-Serialport-Methoden aus einem anderen Programm zu verwenden, das die Unity3D-Engine verwendet.Können wir Callback-Funktion in dll setzen?

Ich habe eine C# -Klassenbibliothek (dll), die eine Callback-Funktion registriert und implementiert, wenn der serielle Port einige Daten empfängt.

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)); 
} 

Und dann in meinem anderen Programm, ich erstelle eine Instanz der Klasse.

Ich möchte wissen, ob mein Rückruf serial_DataReceived in der Bibliothek (dll) aufgerufen wird oder nicht. Ich versuche, _comBuffer in der Bibliothek von einem anderen Programm zu lesen und es immer leer (auch wenn die Daten kommen, wenn ich mit einer Konsole App in der gleichen App getestet).

Jede Hilfe wird sehr geschätzt.

Dank

Antwort

0

<HUNCH>

Wenn ich eine Klasse Designer, würde ich die Daten in den Rückruf setzen, wenn Sie also auf der SerialDataReceivedEventArgs Klasse anschauen, werden Sie sehen, dass im Inneren Sie ist puffern die Daten.

Also, nachdem Sie ein Ereignis erhalten, und Sie rufen dann lesen, Sie tatsächlich die Daten, die an Sie gesendet werden und verwerfen mehr.

Mit anderen Worten, ja, die Tatsache, dass es eine externe Bibliothek ist, hat nichts damit zu tun, dass es nicht so funktioniert, wie es sollte.

</HUNCH>

+0

Das ist die Art und Weise, wie ich meine eigene serielle Port-Bibliothek schrieb, aber von den Blicken, astk verwendet Microsofts "Serial.IO.Ports" -Bibliothek, die Sie tatsächlich zwingt, die Daten zu lesen, nachdem Sie das Ereignis bekommen, es ist nicht Ich bin nicht an der Veranstaltung beteiligt. Es gibt eine Menge Dinge, die in der Microsoft-Klasse "SerialPort" schlecht gemacht werden. –

0

Es ist in der Regel nichts Besonderes Methoden etwa in einer separaten DLL ist, solange Zugriffsmodifikatoren richtig eingestellt sind.

Je nachdem, wie Sie Ihre Lösung einrichten, kann es jedoch ein Problem sein, sicherzustellen, dass Sie die neueste DLL in Ihrem bin-Ordner haben.

+0

Es sollte funktionieren. Aber das Problem ist es nicht. In meinem Client, der diese DLL verwendet, erstelle ich eine neue Instanz dieser DLL. Also registriert die DLL den Rückruf. Wie Sie in meinem obigen Code sehen können, füllt dieser Callback _comBuffer mit einer Eigenschaft, die von externen Programmen gelesen werden kann. Und dann habe ich in meiner Update-Schleife meines Client-Programms versucht, diese Eigenschaft zu lesen. Diese Eigenschaft ist immer leer. Aber wenn ich das DLL-Projekt als ein Konsolen-App-Projekt mache und eine Hauptmethode zum Testen des Codes schreibe, kann ich die Daten von der seriellen Schnittstelle erhalten. Irgendwelche Ideen? Danke ... – astk

+0

@astk Also, wenn Sie durch den Code gehen, was sind Ihre Beobachtungen. Es ist auch erwähnenswert, dass, nur weil der Code in einer separaten DLL ist nicht bedeutet, dass Sie nicht durchgehen können. –

+0

Hallo ... wie man durchgeht? Ich verwende Unity3D als Client, der diese DLL verwendet. Ich könnte durch meine Einheitsschrift gehen. Aber nicht auf der DLL-Ebene. Danke ... – astk

Verwandte Themen