Laden...

Forenbeiträge von kati82 Ingesamt 94 Beiträge

06.09.2007 - 17:32 Uhr

Hallo,

ich hoffe ihr könnt mir wieder ein bisschen behilflich sein, denn ich weiß absolut nicht weiter.

Folgendes:
Mein Programm kann nur ausgeführt werden, wenn ein anderes Programm ebenfalls gerade ausgeführt wird, denn über dieses wird unter anderem die Kommunikation über die serielle Schnittstelle realisiert. Dieses Programm hat jedoch ein Kollege programmiert, das heißt ich kann euch über dieses Programm nicht viel Auskünfte geben. Jetzt gibt es bei mir folgendes Szenario. Mein PC ist seriell mit einem anderen Gerät verbunden. Von meinem Programm aus kann ich den Befehl losschicken, dass sich das Gerät neustarten soll. Eh es aber wieder empfangsbereit ist dauert es eine bestimmte Zeit (die dummerweise, je nach Konfiguration des Gerätes, unterschiedlich lang sein kann). Jetzt habe ich mir gedacht, dass ich nach einem Neustart eine Anfrage an das Gerät sende, und wenn dabei eine Exception ausgelöst wird, dann weiß ich, dass das Gerät noch nicht empfangsbereit ist. Dann warte ich eine weile und sende die Abfrage erneut.
Jetzt treten aber bei mir folgende Fehler auf. Nach dem ersten erfolglosen Senden kommt eine Fehlermeldung des anderen Programms, dass die Daten nicht versendet werden konnten, was ja noch ok ist. Nach dem zweiten erfolglosen senden kommt diese Exception:

System.ServiceModel.ProtocolException: This channel can no longer be used to send messages as the output session was auto-closed due to a server-initiated shutdown. Either disable auto-close by setting the DispatchRuntime.AutomaticInputSessionShutdown to false, or consider modifying the shutdown protocol with the remote server.

Danach macht bei mir der ComPort dicht. Im Logging von dem anderen Programm kann ich aber noch sehen, dass das Gerät nach dem Neustart erfolgreich eine Nachricht an den PC schickt. Mein Programm schmeißt aber eine Exception nach der anderen.
Ich dachte eigentlich, dass das ein Problem mit der ser. Schnittstelle ist. Aber mein Kollege hat das verneint. Nun weiß ich nicht, wie ich es von meinem Programm aus wieder schaffe, etwas zu versenden. Mein Kollege wusste vorerst auch keine Lösung, kann sich aber momentan auch nicht drum kümmern, da er andere Aufgaben hat. Deswegen würde ich die Frage gern an euch weiterleiten. Ich hoffe, ihr habt nen Tipp für mich.

Ciao kati82

30.08.2007 - 12:54 Uhr

Hallo,

ich würde gerne mal wissen, inwiefern es ein guter Programmierstil mehrere try-catch-Blöcke in einander zu verschachteln, also dass in einem try-Block noch mal eine try-catch-Anweisung steht.

Ciao
kati82

22.08.2007 - 12:12 Uhr

Hallo,

ich möchte gerne, dass eine TabPage nicht "anklickbar" ist, wenn gerade ein bestimmter Vorgang läuft. Das heißt der Titel der Tabpage soll zwar sichtbar sein, aber wenn man drauf klickt, soll der Inhalt der Tabpage nicht sichtbar werden. Wie heißt die entsprechende Eigenschaft, die das bewirkt? Ich habe bei MSDN bzw. bei Google nicht das richtige gefunden. Oder geht sowas nicht?

Ciao kati82

P.S.: CanSelect wäre ja ne super Lösung, nur ist das ReadOnly 😭

09.08.2007 - 14:32 Uhr

Oh man, manchmal ist man echt bescheuert. Hat klick gemacht.

Danke für den Denkanstoß.

09.08.2007 - 14:24 Uhr

Du meinst einen riesengroßen Funktionsthread?

09.08.2007 - 13:34 Uhr

Hallo Forum,

ich stehe mal wieder vollkommen auf dem Schlauch und brauch deswegen mal wieder ein paar Weisheiten von euch. Mir tuts auch wirklich leid, euch mit dem nervigen Thema Threads schon wieder zu nerven.

Also bei mir ist folgende Situation. In einer Klasse habe ich alle Sachen, die das GUI betreffen, reingepackt. In einer anderen Klasse befinden sich ziemlich viele Funktionen, die diverse Berechnungen durchführen. Die Reihenfolge, wie diese Funktionen ablaufen sollen, bestimmt der Nutzer im GUI, ebenso die Parameter (meist von unterschiedlichem Typ), die die Funktion braucht. Dass ich die einzelnen Funktionen in (einzelne) Threads packen muss, ist mir schon klar, weil ja sonst mein GUI blockiert. Der Nutzer soll ja auch die Möglichkeit haben, die ganzen Berechnungen irgendwie abzubrechen.

Mein Problem ist jetzt ,dass eine Funktion immer erst gestartet werden darf, wenn die vorige fertig ist. Ich wollte es erst mit nem Monitor und einem Flag machen (nach dem Motto threadatwork==true --> Monitor.Wait), aber da weiß ich nicht ob das so effizient ist. Immerhin habe ich ja viele Threads. Da finde ich so viele Variablen nicht gerade sinnvoll.
Das beste Ergebnis hatte ich bisher mit dem ThreadPool und dem ManualResetEvent. Ich arbeite da mit Reset, Set und Waitone. Nur da weiß ich nicht wie ich den laufenden Thread im ThreadPool beenden kann. Habe dazu auch keine wirkliche Hilfe dazu im Internet gefunden. Zudem blockiert dann auch mein Thread, so dass der Nutzer die Prozesse gar nicht anhalten kann.
Ich könnte mir vorstellen, dass ein AutoResetEvent sinnvoller ist, aber wie mache ich da eine Parameterübergabe an den Thread im ThreadPool?

Ich hoffe, ihr könnt mir einen Tipp geben. Mir würde ja schon der Link zur passenden Seite reichen.

Ciao kati82

01.08.2007 - 16:40 Uhr

Danke, genau das was ich suche.

01.08.2007 - 15:27 Uhr

Hallo,

ich würde gerne bei Start meines Programms überprüfen welche Methoden (oder auch Threads) ich denn zur Verfügung habe und den Namen der Methode dann in einer Listbox anzeigen lassen. Also wenn es zum Beispiel eine Methode "adding" gibt, die zwei Zahlen addiert, soll diese dann in der Listbox angezeigt werden. Der Hintergund ist der, dass wenn ein anderer Programmierer noch mehr Methoden hinzufügt, das diese dann ohne viel Aufwand im Programm angezeigt werden und benutzt werden können.

Könnt ihr mir irgendein Stichwort nennen, wonach ich suchen muss. Mir fällt da irgendwie nichts ein.

Danke im voraus,
kati82

25.05.2007 - 17:53 Uhr

hallo herbivore,

sorry, leider habe ich dich jetzt nicht ganz verstanden.
mein problem ist es ja gerade nach außen hin mehrere möglichkeiten zu bieten, an bestimmte bereiche des speichers ran zu kommen. ich hatte irgendwie an so eine art gedacht wie:


if (start < ende)
{
  for(counter=start; counter=ende; counter++)
  {...}
}
else
{
  for(counter=start; counter=ringspeichergröße; counter++)
  {...}
  for(counter=0; counter=ende; counter++)
  {...}  
}

start und ende (globale variablen) weise ich dann in der for-schleife einen wert zu. aber anscheinend ist das der falsche weg, weil dabei kommt nur unsinn raus. ich verstehe nur nicht ganz warum.

kati82

25.05.2007 - 17:10 Uhr

hallo leute,

meine diplomarbeit ist endlich durch und ich kann mich damit mal wieder mit anderen sachen beschäftigen. zur zeit versuche ich eine mikrocontroller in c zu programmieren und hätte dazu mal eine recht allgemeine frage zum thema ringspeicher.

und zwar folgendes: der mikrocontroller soll nachrichten decodieren. diese erhält er jedes bit einzeln. eine nachricht kann aber unterschiedlich lang sein. der ringspeicher, wo die nachricht bitweise reingespeichert wird, ist aber so dimensioniert, das die längste mögliche nachricht reinpasst. das reinschreiben und rauslesen funktioniert an und für sich. jedoch soll immer wenn ein bit ankommt ein decodier-algorithmus starten.

bis jetzt habe ich den quellcode in etwa so


struct
{
   unsigned char readcounter;
   unsigned char writecounter;
   unsigned char buffer[ringspeichergröße];
}ringbuffer;


unsigned char putBit(boolean inBit)
{
  ringBuffer.buffer[ringBuffer.writeCounter]=(unsigned char)inBit;
  if(ringBuffer.writeCounter<(BUFFERSIZE-1))
  {
  	ringBuffer.writeCounter++;
  }
  else
  {
  	ringBuffer.writeCounter=0;
  }
}

unsigned char getBit(unsigned char *position)
{
   unsigned char returnValue=ringBuffer.buffer[ringBuffer.readCounter];
   *position=ringBuffer.readCounter;
   if(ringBuffer.readCounter<(BUFFERSIZE-1))
   {
      
      ringBuffer.readCounter++;
      return returnValue;
   }
   else
   {
   	ringBuffer.readCounter=0;
	return returnValue;
   }
}

unsigned char decode()
{
   // counter soll den ganzen Ringspeicher langlaufen

   for(counter=0; counter<ringspeichergröße; counter++)
   {
      bit = getBit(&bitposition);

      // jetzt folgt eine ganz lange auswertung
   }
}

und jedes mal wenn ein bit ankommt wird putBit() und decode() gestartet. mein problem ist aber, das ich nie so richtig weiß an welcher stelle ich anfangen soll mit lesen und wo ich damit aufhören soll. eine nachricht muss immer mit eine bestimmten anzahl von einsen beginnen. dort setze ich mein startzeichen. aber was ist, wenn die nachricht vom index des ringspeichers ziemlich weit hinten anfängt, so dass der zweite teil der nachricht wieder am anfang des ringspeichers steht. da komme ich mit meiner primitiven for-schleife nicht weit. irgend wie muss ich am anfang von decode() ein eine if-else-bedingung reinschieben. und in einer der anweisungen müssen dann halt eben zwei for-schleifen drin stehen (eine, die vom nachrichtenbeginn bis zum ende des ringspeicher läuft und eine, die vom anfang des ringspeichers bis (max.) zum nachrichtenbeginn läuft). doch diese if-else-bedingung zu formulieren fällt mir irgendwie schwer. zumindest kommt nie das raus, was ich will.
ich hoffe, iich konnte euch mein problem irgendwie verständlich machen und ihr könnt mir wieder ein paar tipps geben.

ciao kati82

14.02.2007 - 12:00 Uhr

Danke Leute,

Dieses ActiveSync Remote Display ist genau das was ich gesucht habe.

Jetzt kann ich der Verteidigung wieder etwas gelassener entgegen sehen.

14.02.2007 - 10:36 Uhr

Da gibts nur ein Problem. Ich kommuniziere im Programm über Bluetooth. Wie stelle ich das dann auf dem PC an?

14.02.2007 - 10:12 Uhr

Hallo Leute,

ich hoffe irgendjemand von euch kann mir weiterhelfen. Ich habe bald Diplomverteidigung. In meiner Diplomarbeit habe ich ja ein PDA-Programm entwickelt. Dieses würde ich gerne vorführen. Ich suche deswegen ein Tool, womit man den PDA-Bildschirm auf einem PC darstellen kann. Gibts sowas überhaupt? Wenn ja, wo? Wenn möglich Freeware. Habe schon im Netz gesucht, aber bisher nix gefunden.

Habt ihr vielleicht nen Tipp für mich?

Ciao, kati82

08.02.2007 - 15:06 Uhr

Ich dachte, du meinst sowas wie Thread.Sleep oder so. Da habe ich was aber völlig missverstanden. Sorry. Aber mit dem NumericUpDown gehts ja auch. Wenn ich nochmal Lust dazu haben sollte, kann ich ja deine Variante nochmal ausprobieren.

08.02.2007 - 14:56 Uhr

Hallo,

vielleicht habe ich das mit der Zeitverzögerung falsch verstanden, aber es ist jedenfalls so, dass irgendwie nur das ValueChanged-Event feuern kann. Habe die anderen Events auch ausprobiert. Entweder sie werden gar nicht gefeuert oder erst beim Schließen des Fensters (was ich ja auch nicht will).
Von daher macht die Zeitverzögerung im irgendwie wenig Sinn. Oder wie meintest du das?

Ich habe aber das mit der TrackBar jetzt sein lassen und stattdessen dieses NumericUpDown genommen. Sieht zwar optisch nicht so toll aus und der Nutzer muss sich halt bis zum gewünschten Wert durchdrücken, aber da habe ich das Problem nicht mit auf 25 runden. Denn da gibts ja dieses Increment.

08.02.2007 - 14:28 Uhr

Das bringt nix. Man kann einzig und allein beobachten wie der Wert der TrackBar langsam nach oben steigt. Der Wert wird ja so oder so in dem Event verändert. Da bringt auch so eine Verzögerung nichts.

Ich glaube, für das Problem gibt es keine Lösung, weil es nicht so ein Event gibt wie MouseUp (oder beim PDA dann eher PenUp).

08.02.2007 - 13:44 Uhr

Hallo,

mein Programm ist jetzt so gut wie fertig. Also mache ich mich jetzt an die Feinheiten, wozu auch dieses Problem mit der Trackbar gehört. Mathematisch habe ich das Problem quasi gelöst (getestet mit Eingabe in ner Textbox). Aber dieses ValueChanged-Event macht mir Probleme. Den Quellcode, wo ich den neuen Wert berechne, wenn dieser mal nicht durch 25 teilbar ist, habe ich ja in diesem Event drin stehen. Aber wenn ich das Programm dann ausführe, bleibt es jedes Mal hängen, wenn ich mit meinem Pen die TrackBar benutze. Eigentlich müsste ich ja die Events bei sowas wie das KeyUp-Event verwenden, weil der Wert ja eigentlich nur berechnet werden muss wenn der Pen das Touchpad verlässt. Aber das funktioniert alles nicht, weil dieses Event ja gar nicht erst gefeuert wird (ist ja auch logisch, dieser Stift ist ja auch keine Taste)

Hat eventuell von euch jemand ne Idee, wie man dieses Problem mit dem Hängen bleiben lösen könnte?

Ciao, kati82

P.S.: Mir ist jetzt zumindes klar, warum das Programm hängen bleibt. Wenn ich im ValueChanged-Event den Wert neu berechnen, dann ändere ich ja logischerweise wieder den Wert. Das ValueChanged-Event wird also erneut gefeuert. Aber eine Idee, wie ich das ganze umgehen kann habe ich jetzt auch nicht.

08.01.2007 - 12:45 Uhr

[EDIT]Abgeteilt von taskbar/datagridview[/EDIT]

Hallo,

mal eine Frage zu Trackbar.SmallChange. Das bedeutet doch, das mind. um den Wert, der bei SmallChange angeben wird, der Zeiger verschoben wird. Ich möchte bei meinem PDA-Programm das immer in 25er Schritten weitergeschoben wird. Aber wenn ich den Zeiger mit meinem Pen hin und her bewege, dann macht er es doch in 1er-Schritten. Ist das SmallChange etwa doch nicht das richtige?

Ciao, kati82

05.01.2007 - 10:49 Uhr

Ja, was ist den die Stelle mit der TimeOutException. Ist doch dort, wo gesendet wird oder nicht?

05.01.2007 - 09:15 Uhr

Hallo,

ich hab da mal noch ne Frage speziell zur TimeoutException. Ich würde gerne eine MessageBox ausgeben lassen wenn nach einem ReadTimeout von einer Sekunde nichts angekommen ist. Ich bin dabei davon ausgegangen, dass man diese Anzeige bei "catch (TimeOutExecption ex)" hineinschreiben muss. Aber da passiert nix. Habe ich da mal wieder was falsch verstanden?

Ciao, kati82

04.01.2007 - 12:27 Uhr

Hallo Leute,

ich glaube ich habe den Fehler jetzt gefunden. Ich übernehme nämlich per "get" und "set" aus dem vorherigen Form eine Variable. Komischerweise übernimmt er die Variable korrekt und der Quellcode wird ganz normal durchlaufen, aber das Form friert trotzdem ein.

Ich bin jetzt den Umweg gegangen, dass ich den Wert in eine Datei zwischenspeichere. Zumindest funktioniert es so. Warum das bei mir mit get und set nicht funktioniert kann ich mir allerdings nichts so richtig erklären.

Ciao kati82

03.01.2007 - 14:55 Uhr

Ich habe keiner der Comboboxen einen Eventhandler zugeordnet. Das was bei denen ausgewählt ist, wird erst nach einem Button_Click ausgelesen.

Die ganze Anzeige durch ein Button_Click zu machen funktioniert auch nicht. Das Form lädt zwar einwandfrei hoch, aber sobald der Button gedrückt wird friert das Programm leicht zeitverzögert ein (wahrscheinlich bedingt durch die Aktualisierung der anderen Anzeigeelemente).

Wenn ich den Teil mit den Comboboxen auskommentiere funktioniert alles, bis auf das bei den Comboboxen natürlich nichts ausgewählt ist. Also muss es ja irgendwie an denen liegen.

Das ganze ist übrigens Bestandteil eines PDA-Programms. Ich bin jetzt nicht der Experte auf dem Gebiet, aber kann es sein, dass der PDA eventuell zu wenig Arbeitsspeicher für solche Aktionen hat. In dem Form habe ich nämlich ein TabControl mit 3 Tabpages. 2 davon sind recht vollgestopft mit Checkboxen, Textboxen und Comboboxen. Auf der anderen Seite verändere ich ja nicht bei allen Elementen die Anzeige, sondern nur bei einigen wenigen. Somit kann ich mir das ganze auch nicht so richtig erklären.

03.01.2007 - 14:02 Uhr

Danke für deine Hilfe. Ich hab das ganze jetzt bei Form.Load drin. Aber das Problem besteht weiterhin.

03.01.2007 - 13:12 Uhr

Hallo,

ich habe mal wieder ein Problem, was ich irgendwie nicht alleine lösen kann.

Wenn sich mein Form öffnet, wird zunächst überprüft, ob eine bestimmte Textdatei vorhanden ist. Wenn ja, wird diese ausgelesen und je nach dem werden die Inhalte in dem Form angezeigt. Wenn nicht, möchte ich das bei manchen Elementen standardmäßig schon etwas eingestellt ist. Egal, ob die Textdatei vorhanden ist oder nicht, bei der ComboBox habe ich da so meine Probleme. Ich wollte, das über cb.SelectedIndex machen, aber es funktioniert nicht. Die Anwendung friert dann regelrecht ein und ich habe keine Chance mehr was zu machen.

Woran liegt das? Ich habe die ganze Überprüfung und die Anzeigen direkt nach InitializeComponent(). Ist das eventuell der falsche Ort? Aber bei den anderen Anzeigen (Textboxen, Checkboxen) funktioniert es ja. Ich habe es auch schon versucht über andere Eigenschaften der Combobox zu machen, wie SelectedItem. Aber da passiert gar nichts. In der Combobox ist dann einfach nichts ausgewählt. Und bei Combobox.Text friert das Programm ebenfalls ein.

Habt ihr eventuell ein paar Tipps für mich, wie ich das Problem lösen könnte? Oder ihr schickt mir den Link, wo so ein Problem schon mal beschrieben wurde.

Ciao, kati82

P.S.: Ich weiß, eigentlich ne doofe Frage, aber was ist eigentlich der Unterschied zwischen SelectedIndex, SelectedItem und SelectedValue? Das Ergebnis ist doch eigentlich fast das gleiche, oder?

12.12.2006 - 16:17 Uhr

Ehrlich gesagt, weiß ich nicht so recht wie ich mein Problem beschreiben soll, was ich mit der Queue habe. Ich kanns ja mal versuchen etwas zu schildern.

Ich kommuniziere ja mit einem anderen Gerät. Von dem wird der Status einmal in der Sekunde abgefragt. Oder eher so rum. Einmal in der Sekunde wird in meine Queue ein Befehl hineingeschrieben, der später den Status abfragen soll. Die Queue wird dann auch ständig überprüft, ob denn was zum Senden da ist. Es gibt in meinem Programm aber noch nen zweiten Timer. In dem stehen mehrere Befehle drin (Trigger setzen, Daten aufnehmen, Daten auslesen). Ob der Trigger gesetzt ist erfahre ich durch die Antwort der Statusabfragen. (Also wenn Trigger gesetzt ist, muss die Triggerbedingung ja nicht nochmal gesetzt/ gesendet werden.)

Jetzt habe ich mir während des Debuggens mal am PC die Werte ausgeben lassen, ob denn der Trigger gesetzt ist, ob eine Aufzeichnung vorliegt usw.
Da habe ich festgestellt, dass z.B. trotz vorhandenen Triggers dieser Befehl noch mehrere Male gesendet wird ehe mal der Befehl zum Daten aufzeichnen kommt. Ich bin ja jetzt kein Programmierspezialist so wie ihr, aber meine Vermutung war halt jetzt, dass es an der Queue liegt bzw. an dem, was ich oben beschrieben habe. Meiner Meinung kann es nicht an den Timern liegen. Der zweite Timer hat nämlich eine Zykluszeit von 3 Sekunden, also mehr als genug Zeit um festzustellen, ob eine Bedingung erfüllt ist.

Ich hoffe ihr konntet jetzt halbwegs nachvollziehen, was mein eigentliches Problem ist. Wenn es jetzt nicht an der Queue liegen sollte, weiß ich eigentlich nicht mehr so richtig was denn jetzt nun die Ursache für mein Problem ist.

12.12.2006 - 15:40 Uhr

Hallo,

ich habe irgendwie Verständnisprobleme was das TrimExcess angeht. Laut MSDN gibts ja folgende Erklärung:

Legt die Kapazität auf die Anzahl der tatsächlich in der Queue befindlichen Elemente fest, sofern diese Anzahl unter 90 Prozent der aktuellen Kapazität liegt.

Aber was ist denn die aktuelle Kapazität? Ich muss die Größe meiner Queue in meinem Programm nämlich etwas einschränken.
In die werden natürlich mit Enqueue Elemente hineingeschoben und mit Dequeue wieder herausgeschoben. Jetzt habe ich allerdings festgestellt, das nach dem Dequeue scheinbar nur der Inhalt des Elements gelöscht wird aber nicht das Element selber. In dem Element steht dann also "Null" und der tatsächliche Inhalt (die restlichen Elemente) der Queue rutscht vom Index her also immer weiter nach hinten. Das möchte ich möglichst vermeiden.

Ist das überhaupt möglich? Ist da das TrimExcess überhaupt der richtige Ansatz?

Ich hoffe Ihr könnt mir helfen?

Ciao, kati82

06.12.2006 - 16:32 Uhr

Hallo Leute,

Ich habe mal eine Frage zum InputPanel. Wenn ich das richtig verstanden habe, stellt das meine Tastatur auf dem PDA dar.

Nun habe ich einige Textboxen in meinem Form. Wenn jedoch die Textbox sich im unteren Bereich des Forms befinde und ich meine Tastatur aktiviere, dann kann ich ja meine Textbox nicht mehr sehen.

Wie schaffe ich das, das mein Form dann einen Scrollbalken erhält oder die die entsprechende Textbox noch zu sehen ist? Etwa das Form verkleinern?

Ciao, kati82

23.11.2006 - 16:30 Uhr

Hat sich erledigt. Bin soeben selbst auf die Lösung gekommen.

Wenn aus dem Byte 00000000 eine 10000000 werden soll:

bytex = byte(bytex | (1<<7));

23.11.2006 - 16:14 Uhr

Hallo,

der Nutzer soll später in meinem Programm Trigger- und Filterbedinungen setzen können, um nur bestimmte Daten aufnehmen zu können. Habe mir jetzt schon ein hübsches Form aufgebaut, wo man alles nötige reinschreiben kann. Mein Problem ist nur, dass ich die ganzen Bedingungen in ein Byte-Array zusammenfassen muss, um es an ein anderes Gerät zu senden. Ich stehe jetzt nur vor dem Problem, dass ich grad nicht so richtig weiß, wie ich das anfangen soll.

Angenommen ich habe 8 Checkboxen. Wenn z.B. die erste Checkbox angekreuzt ist, soll Bit0 auf 1 springen. Wenn die zweite Checkbox angekreuzt ist, soll Bit1 auf 1 springen, usw.

Jetzt habe ich die Idee, dass ich mir noch 8 Byte-Variablen anlege und mittels Bitshifting das ganze dann zusammenpuzzle. Also für jede Checkbox ein Byte machen und dann mittels bitweises Oder in das letztendliche Byte zusammenfassen. Ich hoffe, ihr versteht jetzt meinen Gedankengang.

Aber wahrscheinlich ist mein Weg mal wieder viel zu umständlich. Ich wollte mal wissen, was ihr davon haltet und ob man das ganze nicht irgendwie besser machen könnte. Wahrscheinlich sehe ich mal wieder den Wald vor lauter Bäumen nicht.

Vielen Dank für eure Tipps schon mal im voraus.

20.11.2006 - 17:02 Uhr

hallo,

danke für eure Hilfe. Das meiste, was mit einem Byte zu machen geht, habe ich jetzt auch damit gemacht. Es war nur mal so ne rein theoretische Frage.

Muss momentan bei meinem PDA-Programm aufpassen, dass ich nicht zuviel Speicher verwende. Zur Zeit geht es noch. Aber ich muss noch viele, viele Daten auswerten. Einige der Ergebnisse muss ich mir irgendwie während des Programms merken. Deswegen wollte ich den Speicherbedarf etwas minimieren. Aber der Unterschied zwischen 5 Bit und 8 Bit ist ja nicht all zu groß.

Ciao, kati82

20.11.2006 - 10:04 Uhr

Hallo mal wieder,

habe mal eine Frage zum "unsigned int". Ich habe in einem C-Programm folgendes entdeckt.

unsigned variable : 5;

Damit soll die int-variable eine Größe von 5 Bit haben. Geht sowas auch unter C#? Das mit "uint" ist mir schon klar. Ich weiß nur nicht, wie das mit der Größe funktioniert.
Sowas könnte ich nämlich für mein Programm gut gebrauchen.

13.11.2006 - 13:37 Uhr

Mal ne ganz doofe Frage:

System.Diagnostics.StreamWriter? Diagnostics und StreamWriter passt doch irgendwie nicht zusammen, oder? Zumindest gibts das bei meiner PDA-Programmierung nicht. StreamWriter ist doch bei System.IO, oder?

Und noch ne Frage:

Um die Die Zeit in den Dateinamen zu bringen muss doch bestimmt noch ein ToString() hinter das DateTime.Now.

Im Grunde will ich die Dateien ja in einen Unterordner Von meinem Programm reinschreiben. Das ganze sieht dann in etwa bei mir so aus:

using (StreamWriter sw = new StreamWriter(@"Programme\BT2\Telegramme\" + DateTime.Now.ToString() + ".csv"))

Wenn in der Pfadangabe anstatt DateTime.Now.ToString() ein ganz normaler Name steht (also wenn der String zusammenhängend ist), dann funktioniert es. Was mir auch aufgefallen ist, dass DateTime.Now.ToLongDateString() funktioniert. Aber mit der Uhrzeit funktioniert es irgendwie nicht so richtig. Ist vielleicht die Uhrzeit das Problem?

13.11.2006 - 10:58 Uhr

Windows Mobil 5.0
Das PDA ist ein Acer n310

13.11.2006 - 10:45 Uhr

Hallo,

ich habe nur mal kurz eine Frage. Ich möchte gerne eine Datei erstellen, die im Dateinamen immer das aktuelle Datum und die aktuelle Uhrzeit enthält. Wie das geht, das weiß ich. Trotzdem kommt bei mir ne Fehlermeldung (System.ArgrumentException; Der Wert liegt außerhalb des erwarteten Bereichs.)
Ich habe die Vermutung, dass beim PDA die Dateinamen scheinbar auf 8 Zeichen beschränkt sind. Weil Datum und Uhrzeit zusammen sind ja länger als 8 Zeichen. Wollte jetzt nur mal wissen, ob mir jemand meine Vermutung bestätigen kann bzw. ob man das irgendwie umgehen kann. Brauche nämlich wirklich Datum und Uhrzeit im Dateinamen.

Ciao

08.11.2006 - 10:52 Uhr

Ja, das habe ich auch schon gemerkt.

Was ich ebenfalls festgestellt habe, dass die Telegramme, die ankommen, scheinbar auch fehlerhaft sind. Ich speichere die ganzen Telegramme ja in ne csv-Datei und schaue sie mir dann am PC an. Ein Telegramm sind 5 Byte, also habe ich dann 5 Spalten. Ich habe bemerkt, dass die einzelnen Bytes von Telegramm zu Telegramm manchmal eine Spalte weiterspringen. Die Ursache dafür ist wahrscheinlich das ab und zu eine 0 eingeschoben wird (fast immer dann, wenn auch eine 0 gesendet wurde). Warum das so ist kann ich irgendwie momentan nicht nachvollziehen.

Könnte das nicht auch ein Fehler in der Übertragung sein?

08.11.2006 - 09:55 Uhr

Hallo,

ich wollte mich nur noch mal kurz melden und euch mitteilen, dass es jetzt einigermaßen funktioniert. Ich habe allerdings noch Probleme mit dem Telegramme auslesen. Eigenartigerweise unterschlägt er mir immer die letzten 25 bis 50 Telegramme. Ich vermute, das hat irgendwas mit der Geschwindigkeit zu tun. Denn wenn ich Breakpoints an der Stelle, wo die Telegramme ausgelesen werden sollen, setze, funktioniert es. Ohne den Breakpoint unterschlägt er mir die Telegramme. Aber das bekomme ich auch noch irgendwie hin.

Also dann, vielen Dank für eure Hilfe. Ihr seid echt super.

Ciao, kati82

01.11.2006 - 16:43 Uhr

Nur ums richtig zu verstehen, nach jeder Anfrage, die ich sende, egal welche das auch ist (ich frage ja auch andere Dinge con dem Controller ab), rufe ich ne Methode auf, in der ich den Port abhöre anstatt, dass ich DataReceived einfach laufen lasse.

Das probiere ich morgen gleich mal aus. Dann müsste das mit dem ThreadPool ja dann auch funktionieren.

Aber keine Sorge, ich werd mich schon melden, falls es Probleme dabei gibt. 😉
Aber vielen Dank schon mal für deine Hilfe.

01.11.2006 - 15:15 Uhr

Aber jetzt noch mal für die ganz Dummen (also so jemand, wie mich).
Beim ThreadPool möchte ich sowas in der Art schreiben:

ThreadPool.QueueUserWorkItem(new WaitCallback(serialPort_DataReaceived), autoEvent);

serialPort_DataReceived ist bei mir private void (so wie es VS halt eben automatisch erstellt). autoEvent ist bei mir global definiert.

Jetzt kommt aber immer noch an besagter Stelle diese Fehlermeldung. Mein Problem ist, ich kann auch nach der Suche mit Google und vielem rumexperimentieren nichts mit dieser Fehlermeldung anfangen. Kann mir jemand den Fehler in dieser Zeile mal genauer erklären. Wenn ich den Fehler verstehe, weiß ich dann vielleicht, wie ich es machen muss.

01.11.2006 - 14:21 Uhr

Warum kann ich eigentlich nicht dieses Thread.Join() nehmen. Liegts daran, dass man den Thread erst "neu" erzeugen und starten muss? Bei mir kann ich ja das DataReceivedEvent nicht selber starten (macht ja der Mikrocontroller).

Bei dem AutoResetEvent habe ich im Grunde Probleme dabei, im ThreadPool das DataReceivedEvent als WaitCallback zu definieren (siehe Fehlermeldung oben). Deswegen hatte ich mir ne eigene Methode geschrieben, wo diese Autoevent gesetzt wird. Die Methode wird dann an der entsprechenden Stelle in der Empfangsroutine aufgerufen. Das ganze hat dann aber leider auch nicht funktioniert. Ist ja im Grunde auch klar, er soll ja nicht auf diese Methode warten, sondern darauf, dass alles empfangen wurde.
Ich glaube bei mir hängts echt bei diesem ThreadPool und WaitCallback.

01.11.2006 - 10:27 Uhr

Hallo,

ich habe nun doch noch mal ne Frage. Habe mich jetzt für das AutoResetEvent entschieden, doch irgendwie hauts bei mir doch nicht hin. Deswegen will ich nur mal am Beispiel von MSDN (http://msdn2.microsoft.com/de-de/library/58195swd.aspx) kurz zwei Fragen stellen.

  1. Wenn ich das richtig verstanden habe ist Zeile mit dem "ThreadPool" dazu da, um zu bestimmen, wo das Signal zum weiterarbeiten drin steht. Stimmt das?

  2. Ich habe mich jetzt stark an diesem Beispiel von MSDN orientiert. Mein Problem ist nur, dass dort alles static ist. Ich vermute, dass deshalb eine Fehlermeldung bei mir in der Zeile mit dem ThreadPool kommt (Fehlermeldung lautet: No overload for 'serialPort_DataReceived' matches delegate 'System.Threading.WaitCallback'). Muss das AutoResetEvent static sein? (Bemerkung: in Bezug auf das AutoResetEvent habe ich nirgendswo was als static definiert)

Ich hoffe ihr könnt mir noch mal kurz helfen. Danke

P.S.: Falls ich es doch so wie svenson machen sollte, läuft das ganze hin- und hersenden dann auch schneller ab?

25.10.2006 - 16:19 Uhr

Hallo,

ich mal wieder. Ich habe mal eine Frage zum Monitor. Ich habe in einem Thread eine For-Schleife, in der eine Sende-Routine steht (For-Schleife weil Positionsabfrage nötig ist - tut aber nichts zu Sache, Tatsache ist das immer eine Sequenz gesendet wird). Jedenfalls möchte ich, dass erst das DataReceivedEvent vom SerialPort abgewartet wird, bis die For-Schleife erneut durchlaufen wird. Deswegen möchte ich einen Monitor verwenden. Mir ist nur die Theorie noch nicht ganz klar.

In dem Thread mit der For-Schleife schreibe ich also das Monitor.Enter(obj) rein, weil Enter ja das entsprechende Objekt sperrt. Ist das soweit richtig? Mit Monitor.Exit(obj) wird die Sperre wieder aufgehoben. Mir ist jetzt bloß nicht ganz klar, warum das im selben Thread steht? Und wie kann durch das "Enter" gewährleistet werden, dass das ReceivedEvent auch anspringen kann?

Ich glaube, ich habe das gründlich missverstanden, oder? Das liegt wahrscheinlich daran, dass mir in meinem Fall nicht ganz klar ist, was das Objekt ist, was ich sperren will/ soll. Das ist nämlich das, was ich bei der msdn-Hilfe und dem dortigen Beispiel nicht verstanden habe. Dort haben die als Objekt ja eine Queue, was ich irgendwie nicht nachvollziehen kann.

Oder kann man es noch einfacher machen als mit nem Monitor? Dabei ist zu bemerken, dass ich nen PDA programmiere und deswegen einiges nicht so ohne weiteres zu programmieren geht.

Ich hoffe, ich werde jetzt nicht wieder als totaler Anfänger abgestempelt und danke schon jetzt mal für eure Antworten.

17.10.2006 - 11:11 Uhr

Tschuldigung, wenn euch die Frage zu einfach war. Aber jeder sieht doch mal den Wald vor lauter Bäumen nicht. Als ich den Tipp von sheitman gelesen habe, ist es mir auch wie Schuppen von den Augen gefallen (Danke übrigens). Habs gleich ausprobiert.

17.10.2006 - 10:40 Uhr

Also erst mal muss ich mal sagen, dass ich keine Probleme mit dem Datenaustausch habe (zumal ich nicht so richtig verstehe, was diese Infos zur Lösung meines Problems beitragen soll, sorry bin halt kein Profi sowie du). Und zum Protokoll, da nehme ich mal an, dass du das Kommunikationsprotokoll meinst, was das andere Gerät verwendet, mit dem ich per PDA kommuniziere. Da kann ich erstens sagen, dass das Gerät und damit auch das Protokoll hier an der Hochschule entwickelt wurde und somit eigentlich nicht allgemein bekannt ist. Zweitens bin ich einer Geheimhaltung verpflichtet. Ich darf also Außenstehenden nichts über das Protokoll sagen. Aber letzten Endes sind doch alle Kommunikationsprotokolle gleich aufgebaut. Es gibt n Startzeichen, n Endzeichen und noch "paar" Zeichen mittendrin (und die will ich haben - das Problem ist nur das alle Nachrichten kurz hintereinander kommen und deswegen alles in einem Byte-Array ankommt, deswegen will ich ja mehrere "Sequenzen?" aus dem Array haben). Wenn du jetzt ein anderes Protokoll gemeint hast, dann must du mir das sagen.

Aber das ist ja eigentlich nicht mein Problem. Die ganzen Daten habe ich ja schon. Ich will sie ja nur noch auswerten. Ich will doch nur nen Tipp haben, wie man gewisse Elemente aus einer Liste herausfiltern kann. Das ist doch eigentlich ein recht allgemeines Problem, oder?

17.10.2006 - 10:13 Uhr

Scheinbar kann mir keiner so richtig nen Tipp geben.

Jedenfalls habe ich das ganze Byte-Array erstmal in ne Liste kopiert, weil ich dachte, dass es da einfacher ist, mal ein paar Elemente zu löschen. Ich versuche mal zu veranschaulichen, wie mein Byte-Array aussieht und was ich eigentlich aus meinem Array herausfiltern möchte.

Startzeichen
...
Startzeichen für Anfang der Daten
45 // ab hier will ich die Daten
34
234
... // das letzte Zeichen, was ich brauche
Endzeichen
Startzeichen
...
Startzeichen für Anfang der Daten
45 // ab hier will ich die Daten
34
234
... // das letzte Zeichen, was ich brauche
Endzeichen
...

Ich habe mir gedacht, das ich das so in der Art lösen könnte:

for (int i = 0; i < srecord.Capacity - 1; i++)
            {
                if (srecord[i] == 0x49)
                {
                    srecord.RemoveRange(0,i)
                }
            }

Mir ist schon klar, dass die if Schleife nur beim Anfang des Byte-Arrays funktioniert. Kann mir vielleicht jemand, nen Tipp geben, wie ich das herausbekomme, was ich will? Ich weiß nicht so recht, wie ich das realisieren soll.

16.10.2006 - 16:15 Uhr

Hallo, ich mal wieder,

ich würde gern mal wissen wollen, wie ihr mein Problem lösen würdet.

Mein PDA kommuniziert ja per Bluetooth mit einem Diagnosgerät. Das kann Telegramme aufzeichnen und speichern. Maximal können 100000 Telegramme gespeichert werden. Die Programmierung vom Mikrocontroller erlaubt es aber nur das, maximal 25 Telegramme auf einmal von einem externen Gerät ausgelesen werden können (obwohl im Kommunikationsprotokoll steht, dass es nur 10 sein dürfen?). Das heißt ich habe in meinem PDA-Programm jetzt ne for-Schleife in der steht, von welcher Position angefangen werden soll mit lesen (also immer +25). Jetzt komme ich so langsam zu meinem Problem. Zum einen bin ich mir nicht sicher wie ich das mit den Geschwindigkeiten regeln soll. Ich kann mir vorstellen, das die for-Schleife schneller abgearbeitet wird, als der Mikrocontroller die Daten bekommt. Deswegen habe ich vorsichtshalber mal ein Thread.Sleep mit 300ms in die for-Schleife eingebaut. Brauch ich den Thread.Sleep oder kann man das auch anders lösen?

Aber das größere Problem ist jetzt, dass ich nicht genau weiß, wie die Daten wieder im PDA ankommen. Im Normalfall ist es ja so, das ein Byte-Array ankommt, in dem Startzeichen, die ganzen Telegramme, Endzeichen, (naja und noch ein paar andere wichtige Zeichen) enthalten sind. Außerdem schickt der Controller noch ein Frame hinterher, indem er sagt, ja ich habs kapiert, was du von mir wolltest.

So aber jetzt mal zu meinem Problem. Angenommen das Gerät hat 100 Telegramme aufgezeichnet. Dann müsste ich eigentlich 4 "Nachrichten" erhalten. Was ist aber, wenn die Daten so schnell ankommen, dass das im Grunde nicht 4 verschiedene Byte-Arrays sind, sondern nur eins. Die Sleep-Zeit möchte ich ehrlich gesagt nich größer machen.
Falls das passiert, möchte ich, dass das Array nach einem bestimmten Zeichen durchsucht wird und von dort an alles in eine Liste kopiert wird bis wieder ein bestimmtes Zeichen kommt. Wenn das "Endzeichen" gekommen ist, soll der aber wieder weiter suchen. Ich hoffe, ihr versteht was ich meine. Irgendwie fehlt mir grade das Vorstellungsvermögen wie ich den Such- und Kopieralgorithmus zusammenbasteln kann. Dass ich das mit ner for-Schleife lösen muss ist mir schon klar. Bloß wie mache ich weiter.

Ich hoffe, ihr könnt mir wieder ein paar Denkanstöße geben.

Ciao, und vielen Dank im voraus.

12.10.2006 - 15:48 Uhr

Hallo mal wieder,

irgendwie wollen sich mal wieder meine Gehirnwindungen nicht in Gang setzen. Ich weiß mal wieder nicht, wie ich mein Problem lösen kann.

Ich habe ein Form von dem ich per Bluetooth verschiedene sachen senden kann oder empfangenes lesen kann (alles in form eines Byte-Arrays). Jetzt habe ich mir gedacht, um den Quellcode übersichtlicher zu machen, dass ich mir ein extra File anlege, wo dann die ganzen Routinen drin stehen, wie etwas auszuwerten ist, ob noch irgendwelche Ersetzungszeichen da sind, usw. Aber das ist nicht mein Problem. Ich möchte das bearbeitete Byte wieder zurückgeben an das Form. Wie mache ich das. Ich wollte es schon über get und set lösen, aber da kommen immer irgendwelche Fehlermeldungen. Hier mal eine der vielen Varianten (nur ganz grob):

byte[] sbuffer = byte[1]; //verändert sich aber noch in der Größe und nätürlich auch vom Inhalt

public void setSbuffer(byte[] sbuffer)
{
    sbuffer = b;
}

public byte[] getSbuffer()
{
    return sbuffer;
}

...
public void IrgendeineKlasse
{
...
     setSbuffer(b);
}

Ich habe noch andere Varianten versucht, aber alle haben nicht zum Ziel geführt. Zum Beispiel habe ich noch versucht, das IrgendeineKlasse public byte[] ist und das am Ende das Byte-Array mit return zurückgeben wird. Das hat auch nicht funktioniert.
Eigentlich ist mir schon klar, das der irgendwie Probleme mit dem byte hat. Aber ich weiß nicht warum und ich weiß nicht wie ich das Problem lösen kann.

12.10.2006 - 09:51 Uhr

Also momentan habe ich nur das Byte-Array (byte[] telegramm). Das kann je nachdem, wie viel Telegramme vom dem anderen Gerät aufgezeichnet werden, unterschiedlich lang sein (ist ja auch logisch). Ich denke mal die ganzen Start- und Endzeichen aus dem Array rauszunehmen und das ganze dann in einen String umzuwandeln wird für mich kein Problem sein (also ich hab es bisjetzt noch nicht gemacht - aber ich weiß schon wie es geht). Mein Problem ist nur, das ich diese Telegramme irgendwo abspeichern möchte, und zwar so, dass der spätere Nutzer des Programms, wenn er diese Datei öffnet, sofort erkennt, wie das Telegramm aussieht.

Also wenn ich dich richtig verstehe, muss ich die Telegramme in ne csv-Datei reinkopieren. Der Nutzer muss jedoch aber dann später selber die Datei in Excel öffnen. Ist eigentlich ne gute Idee. Mit csv-Dateien weiß mein PDA nur nichts anzufangen. Aber egal, dann muss der Nutzer die eben auf nen PC kopieren und dort angucken.

Danke für deine Hilfe. Wenn ich doch noch Probleme habe sollte, melde ich mich nochmal.

11.10.2006 - 15:30 Uhr

Verstehe ich das jetzt richtig? Ich soll erst in einen String umwandeln. Aber wie kopiere ich das ganze dann in ne Excel-Datei???

11.10.2006 - 15:13 Uhr

Hallo,

ich hätte da mal wieder ne Frage. Mit meinem PDA kann ich von einem anderen Gerät aufgenommen Telegramme per Bluetooth abfragen. Diese Telegramme kommen logischerweise als Byte-Array an. Das klappt auch ganz gut. Jetzt habe ich die Idee, dass man die Telegramme (weil es ja eben schon ne ganz schöne Menge an Daten ist) übersichtlich in ne Datei reinzuschreiben. Am besten wäre eigentlich Excel.

Wie fange ich sowas am besten an? Ich hoffe ihr habt ein paar Tipps für mich.

11.10.2006 - 12:22 Uhr

Hallo,

ich habe wieder mal ein Problem. Ich möchte gern in mein PDA-Programm eine Statusbar hinzufügen. Das ist alles kein Problem. Ich möchte diese allerdings noch in zwei Abschnitte teilen. Habe nämlich zwei getrennte if-Schleifen. Je nach den Ergebnissen soll dann das entsprechende in den jeweiligen Abschnitten angezeigt werde. Jetzt habe ich aber herausgefunden, dass man das mit diesen Panels macht. Die stehen aber bei PDA-Programmierung nicht zu Verfügung.

Habt ihr vielleicht ne Idee, was ich da anders machen könnte? Die Idee mit der Statusbar fällt ja dann nun weg, oder?