hi,
So wie ich das sehe, ist das kein 'regulärer' .NET event sondern eher ein 'Thread event' (keine Ahnung wie das richtig heist...).
Ich habe das folgendermaßen gelöst:
private AutoResetEvent recvDataEvent;
private BackgroundWorker worker;
void open() {
COM.OpenByIndex(smartBoxIndex);
COM.SetBaudRate(115200);
COM.SetDataCharacteristics(FTDI.FT_DATA_BITS.FT_BITS_8,FTDI.FT_STOP_BITS.FT_STOP_BITS_1,FTDI.FT_PARITY.FT_PARITY_NONE);
COM.SetFlowControl(FTDI.FT_FLOW_CONTROL.FT_FLOW_NONE,0,0);
recvDataEvent = new AutoResetEvent(false);
COM.SetEventNotification(FTDI.FT_EVENTS.FT_EVENT_RXCHAR,recvDataEvent);
worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.RunWorkerAsync();
}
void worker_DoWork(object sender, DoWorkEventArgs e)
{
uint bytesToRead = 0;
uint bytesRead = 0;
while (true) {
// wait until event is fired
this.recvDataEvent.WaitOne();
// try to recieve data now
if(FTDI.FT_STATUS.FT_OK == this.COM.GetRxBytesAvailable(ref bytesToRead)) {
byte[] buffer = new byte[bytesToRead];
if(FTDI.FT_STATUS.FT_OK == this.COM.Read(buffer,bytesToRead,ref bytesRead)) {
if (bytesToRead != bytesRead) {
Log("Data length error!");
}
foreach (byte b in buffer) {
recvBuffer.Enqueue(;
}
Log(ByteArrayToHexString(buffer));
}
}
}
}
[/code]
evtl nicht der eleganteste Weg, aber immerhin klappt es
Eine Frage am Rande:
Dein Projekt scheint so ähnlich zu sein wie das, was ich im Moment bearbeite. Nur habe ich ein Problem:
Gibt es eine Möglichkeit die Zeit zu bestimmen an der die Daten im Puffer ankommen (Abweichung max. 0,5 ms) ? (bezogen auf die SerialPort klasse meine ich jetzt, da ich auch beides implementiere)