C# und timeouts
-
MSDN gibts nicht nur auf dem Internet.
Die Doku zu SerialPort.Read gibts hier:
http://msdn2.microsoft.com/en-us/library/ms143549.aspxUnd freiübersetzt gibt er die Anzahl gelesenen Bytes zurück.
Wie sieht denn dein Aufruf aus?Noch eine Frage, war die Frage wegen des Timeouts auf die Serial.Read Funktion bezogen? Dann gibt es Property ReadTimeout.
Gibts bei MSDN ein Bsp. (wo ganz genau dieses ReadTimeout gesetzt wird):
http://msdn2.microsoft.com/en-us/library/system.io.ports.serialport.aspxsimon
-
Ceos schrieb:
dann müste ich erst eine variable anlegen einen timer ein event der die variable setzt ..... geht das nicht einfacher ?
kann auch sein das ich nicht weis wie man das mit timern umsetzt aber mit "wie wärs mit timern?" hilft mir da leider auch wenig :p
ich brauch ne schnelle lösung XD ich muss gleich los aber ich brauch das unbedingt und nachher hab ich kein internet mehr
Timer: Genau das ist der Dreizeiler den Du willst und das ist die einfachste Methode, es ist OOP und kein rumgepolle wie Dein Beispiel, etc. etc.
-
DateTime i = DateTime.Now.AddMiliseconds(MyTimeout); while (i > DateTime.Now) { doSth(); }
DateTime.Now scheint nicht ungenauer als GetTickCount() zu sein.
-
@geeky
bitte nicht.
-
also serialport.read() liefert bei mir immer die größe des puffers zurück den ich reingegeben habe und setzt dabei alle zeichen auf 0 .... ok mir schwant hier was aber testen muss ichs noch ...
er empfängt 1-2 byte (threshold iss nur auf 1) der rest iss 0 und dann gibt er mir ne 100 (weil ich n byte array von 100 angegeben habe und n timeout von 1000ms)
das "dumme" rumgepolle muss ich aber machen wenn das "dumme" read nicht richtig funktioniert .... danke für die auszüge aus der mdsn aber da steht auch net so recht warum der mir ne 100 rausflankt ....
@geeky
bitte nicht.warum nicht ... ich bin ein c++ ler der java mal konnte und jetzt c# versucht da freu ich mich über sowas _ danke auch wenns vielleicht nicht "konformes" c# ist ... man kann auch echt zu kleinlich sein >_<
-
Naja, die Variante ist schlicht und ergreifend Verschwendung von Rechenzeit
-
Sag' gefälligst gleich was Du willst, dann hält man Dich auch nicht für bescheuert und zeigt Dir wie's richtig geht. Der folgende Code händelt das Problem das Du beschreibst, ist in VB.NET sollteste aber trotzdem verstehen:
'not enouph data in the invoice buffer, but will wait only 1 second While (((Me.expectedBytes - 1) > Me.pSerialPort.BytesToRead) And (thinTimer < 10)) Thread.Sleep(100) thinTimer += 1 End While 'read only the expected count of Bytes Do While (Me.pSerialPort.BytesToRead > 0) And (index < Me.expectedBytes) Me.receiveBuffer(index) = Convert.ToByte(Me.pSerialPort.ReadByte) index += 1 Loop
Es gibt noch eine Möglichkeit (die scheinst Du schon zu kennen), welche andere Probleme aufwirft, aber sie behebt Dein Problem:
'fire the SerialPort.Receive Event if 3 Bytes received (the minimum) Me.pSerialPort.ReceivedBytesThreshold = 3
Sebo
-
warum nicht ... ich bin ein c++ ler der java mal konnte und jetzt c# versucht da freu ich mich über sowas _ danke auch wenns vielleicht nicht "konformes" c# ist ... man kann auch echt zu kleinlich sein >_<
Schön, dass Du ein c++ ler bist, aber das ist auch in c++ nict ok.
Auch in java nicht.
Auch in c# nicht.Bestenfalls ist das auf einem uP ok.
-
wenn du "nur" readbyte zur verfügung hast, wäre es schon brauchbar ... und in meinem falle habe ich scheinbar nur das weil read() mir leider immer dieses 100 zurückgibt statt dem was er wirklich gelesen hat ...
int dl = serialPort1.BytesToRead; while (dl-- > 0) { Buffer.Add((byte)serialPort1.ReadByte()); }
Buffer iss hier nen vector, vector darum weil ich finde das es zur fehlerkorrektur besser geeignet iss als n straffes array (IR iss leider nicht sehr stabil :p)
wenn jemand vorschläge hat wie man es noch eleganter lösen kann, oder ob es schon ein rudimentäres protokoll gibt das ich aus den VS bibliotheken benutzen kann aber noch nicht gefunden habe bitte her damit _ (das problem dabei iss auch wenn ichs auf der PC seite einfach hab muss ich natürlich ein gegenstück in c programmieren damit es funktioniert)
EDIT das problem bei READ scheint daher zu kommen das ich discardNull = false gelassen habe, jetzt schreibt er mir brauchbarere werte zurück, aber immernoch irgendwie mistwerte, aber das wird beim interpretieren der daten liegen
EDIT HILFE wie kann ich eigentlich die in c++ üblichen #define verwenden, der meckert bei mir ständig das er einen kommentar erwartet bei dem wert hinten
#define LINEDATALEN 4 #define ODODATALEN 4
-
Ceos schrieb:
EDIT HILFE wie kann ich eigentlich die in c++ üblichen #define verwenden, der meckert bei mir ständig das er einen kommentar erwartet bei dem wert hinten
#define LINEDATALEN 4 #define ODODATALEN 4
const int LINEDATALEN = 4; const int ODATALEN = 4;
-
dankeschön, ich hab auch schon das gegenstück zur map gefunden, das macht sich besser in der beziehung _