Laden...
D
Daniel83 myCSharp.de - Member
Bielefeld Deutschland Dabei seit 05.02.2008 171 Beiträge
Benutzerbeschreibung

Forenbeiträge von Daniel83 Ingesamt 171 Beiträge

03.03.2009 - 10:00 Uhr

Danke schön,

habe das Problem gelöst, war höchst wahrscheinlich ein Copy/paste Fehler, habe mir das Event über den Eventhandler neu geholt und serialport1_Datarecieved_1 funktioniert.

02.03.2009 - 13:55 Uhr

Hallo zusammen,

Ich habe ein Programm was Protokolle mitschreiben soll. Hierfür verwende ich einen USB-Adapter. nutze ich ein fremd Programm, so kann ich auch alles wunderbar sehen, nur bei mir kommt nichts an.
Inzwischen habe ich herausgefunden, dass das Ereignis serialPort1_DataReceived nicht ausgelöst wird.
Wenn ich über einen Timer regelmäßig alle 10..100ms abfrage, ob es daten zu empfangen gibt und wenn es diese gibt, diese Auswerte funktioniert das ganze tadellos.
Hat jemand von euch Erfahrungen da hin gehend, ob Geräte dieses Eregnis nicht erzeugen?
Was wäre hier das mittel der Wahl? Abfragen in einem seperaten thred und das ereignis selbst erzeugen?
Der Timer blockíert leider die anwendung und wurde ja auch nur zum testen benutzt.

Hoffe ich hab mich halbwegs klar ausgedrückt, Danke schonmal für die Hilfe

27.10.2008 - 11:09 Uhr

Echtzeit fähigkeit ist so eine Geschichte.
Oben habe ich von TwinCAD gelesen, Beckhoff, die dieses System vertreiben, wirbt mit Echtzeit fähigkeit, jedoch definieren sie echtzeit als >20ms, da dies für die üblichen Anwendungen mit deren System ausreicht.
Ich denke, dass echte echtzeitfähigkeit nur über einen Microcontroller mit hochgenauem Quarz umzusetzten ist, aber das kommt hier wohl leider nicht in frage.

04.09.2008 - 08:59 Uhr

Hallo

Ich habe es über eine Zählschleife gelöst. Hier mal ein teil meines Codes.

private void empfangen()
        {
                int numberOfBytesToRead=6,count=0;
                while (numberOfBytesToRead > 0&&count<1000)
                {
                    if (serialPort1.BytesToRead > 0)
                    {
                        numberOfBytesToRead -= serialPort1.Read(readbuf, 6 - numberOfBytesToRead, numberOfBytesToRead);
                    }
                    count++;
                }
}

vieleicht hilfts ja

edit: Der Wert 1000 ist ein gemessener erfahrungs wert, habe die schleifen durchläufe gemessen die ich in der regel brauche etwa 300-500, somit sollte ich also alles empfangen haben nach 1000 durchläufen. Wie lange das dauert kann ich dir leider nicht genau sagen.

11.08.2008 - 12:37 Uhr

Das verhalten welches du beschreibst (LED halb hell), spricht tatsächlich für ein stromversorgungsproblem. Evtl. ist ja der Stecker und/oder eine verbindung auf der Platine defekt ist. Bei beiden Platten unwahrscheinlich, aber möglich. Würde auch das verhalten bei mehreren Systemen erklären. aber offensichtlich hats du das Thema ja für dich abgehakt.

18.06.2008 - 14:15 Uhr

Ok ich habe kurz nochmal nachgedacht.

Du musst dir die Koordinaten auf dem Panel und die Koordinaten auf dem Monitor merken.

Wenn die änderung auf dem Pannel !=1 oder !=-1 ist, musst du nur die neuen Panelkoordinaten in den Variablen speichern.

Ansonsten bildest du die differenz der alten und neuen Panell koordinaten und addierst die zu denen auf dem Monitor, und speicherst die neuen Panelkoordinaten ab.

Versuch das mal, sollte gehen

17.06.2008 - 15:02 Uhr

hab dir doch ne idee geschrieben, hast du die Probiert, wenn diese FGunktion im Mouse Move Event kommt, dann versuch doch mal die abfrage ob die abweichung gleich 1 ist, wie oben beschrieben

13.06.2008 - 16:18 Uhr

AusgangsKords ist doch eigentlcih gleich x bzw Y oder?

du verwendest deine alte funktion und baust das hier mit ein

also
tmp=2-401 (ersterfall, weiter nach rechts)
tmp=401-2 (zeiterfall, weiter nach links)


if (tmp!=1||tmp!=-1)//nur dann wird ja gesprungen
{
if (tmp<0)
{
    tmp+=AusgangsKords;  //hier wieder 2 (-399+401)
//bewegung um 2 nach rechts
}else
{
if (tmp>0)
{
   tmp-=Ausgangskords  //also(399-401) resultat-2
}
}

}
x=x+tmp;
13.06.2008 - 16:06 Uhr

Hallo

Das problem ist das du e.X- Ausgangkordinaten rechnest.

Wenn du am ende angekommen bist, angenommen an der rechten seit, dann setzt du ja bei einem Touchpad Links wieder neu an. betrachte nur die X Position

x = 400
AusgangsPos =401
e.X umgesetzt ist 2

jetzt rechnest du

x= 400+(2-401)
also
400+(-399)
ist also 1

durch dieses Verhältnis kannst du nie größer werden als die Fläche deines Touchpanels. Hier müsstes du Plus rechnen, weiß nur nicht ob du dann kleiner als die Ausgangsposition werden kannst, rechne doch mal einfach ein paar varianten durch

10.06.2008 - 13:03 Uhr

Hallo iginaz

die Funktion heißt

inputPanel1.Enabled = true;

je nach gerät ist es etwas umständlich, da die Tastatur evtl. verschwindet, wenn du daneben klickst und es dann zu schwierigkeiten kommt wenn du sie wieder öffnen willst.
Diesen Fall müstest du abfangen

04.06.2008 - 17:02 Uhr

Hallo

ich denke auch, das dieses Thema (Chat) durchaus für 40h reichen sollte, aber solltest du tatsächlich schneller sein, bau doch einfach ein paar zusätzliche features ein. flüster z.B. oder automatische Smilie erkennung usw. das sind geschichten die gehen relativ schnell und auch ohne ist das Programm ganz nett, lässt sich also relativ gut modular einbinden.

viel spaß dabei

Daniel

P.S: Alles dauert immer viel länger als du denkst
und Alles was schief gehen kann wird auch schief gehen

04.06.2008 - 13:15 Uhr

Ok

sorry, war wirklich NullReference, der Debugger hat wohl gesponnen, jetzt krieg ich die Exception auch beim Debuggen

04.06.2008 - 12:59 Uhr

Hallo, um mich mit Zeichnen zu beschäfftigen und ein wenig auszuprobieren, habe ich mir eine kleine Testprozedur geschrieben. diese sieht wie folgt aus

private void test()
        {
            int[,]array=new int[300,2];
            for (int i = 0; i < 299; i++)
            {

                array[i,0] = i;
                array[i,1] = i;
            }

            Bitmap pic = new Bitmap(395, 250);
            pic = (Bitmap)pb_auswertung.Image;
            for (int i = 0; i < 299; i++)
            {
                zeichne_punkt(array[i,0], array[i,1], Color.Aquamarine,pic);
            }
                    }
        private void zeichne_punkt(int x_px, int y_px, Color farbe, Bitmap pic)
        {

            pic.SetPixel(x_px, y_px, farbe);
        }

in der zeichne Punkt funktion bekomme ich eine NullReferenceException.
Wenn ich aber das Prog im debug modus laufen lasse, läuft es anstandslos.
Habe die instanzierung des BMP auch schon in der zeichne Punkt funktion gehabt, aber das verhalten ist das selbe, jemand eine Idee? ich arbeite mit dem CF aber das ist hier glaube ich ziemlich egal

gruß Daniel

30.05.2008 - 14:03 Uhr

Hallo zusammen,

binzwar in der Diskussion nen bischen hinterher, aber ich wollte mich nochmal schnell zu der Dual Screen variante äußern.
Jemand hat geschrieben, das du dir einen Monitor kaufen solltest und ein Dual Screen system mit deinem Laptop machen sollst.
Das sollst du bitte nicht!!!!!
Es wäre schade wenn du dich auf tollen Programier spaß freust und du dann siehst, das dass nicht so schön ist.
Nur mit 2 gleichen Modelen Dual Screen lösungen durchführen, hab das mit dem Laptop probiert, da kriegst du echt Augenkrebs und findest nichts wieder, weil du andaurnt hoch und Runter gucken musst, und die Farben anders aussehen usw.

28.05.2008 - 12:28 Uhr

Danke für die antwort werde mal versuchen, ob ich das auf Pixel umrechnen kann.

28.05.2008 - 12:01 Uhr

hallo zusammen

habe immer noch einige Leistungsschwirigkeiten. Auch wenn das Speicherproblem gelöst ist.
Da dieses Prob nur bedingt mit dem anderen zusammen hängt, habe ich einen neuen Beitrag eröffnet.

Ich habe ein Projekt über nommen, das leider zu wenig getest wurde, somit darf ich nun alles was zuerst einmal geht aber irgendwann nicht mehr vernünftig läuft ausbügeln.

In diesem Projekt werden gesammelte und abgespeicherte Daten gelade und als Graph dargestellt. Dieses dauert, wenn es etwas mehr daten sind ab 1 Tag sieht man dass gearbeitet wird, ab einer Woche kann man Kaffee trinken und rauchen und auf Tolette gehen...

Genug geschwafelt, nun meine Frage:

-Ich Lade also die Daten aus dem Speicher.
-Die daten werden Unter umständen verarbeitet (z.B. Ertrag berechnen usw.)
-Daten werden gezeichnet

Ich bin gerade dabei die Zeichenfunktion um zu stricken.

1.)Beim laden der Daten ist es mir meines erachtens nicht möglich dieses zu optimieren, habe bereits eine Datei pro tag erstellt, in die geschrieben wird, damit ich nicht immer erst das ganze Jahr auslesen muss, wenn ich nur einen Tag haben möchte. Hier ist glaube ich nichts mehr zu Optimieren.

2.)Jetzt kommt eigentlich der Punkt. Im mom wird jeder messwert (oder rechenwert) mittel

e.Graphics.DrawLines(blackPen, bezierPoints);

gezeichnet.
e ist in diesem fall Eventarg von tabpage.Invalidate()
ist es sinniger erst die Daten zu lesen, daraus mittelwerte zu bilden und diese dann als halbstunden mittel werte zu zeichnen, so genau muss die Darstellung nicht sein,

Oder ist es besser alles zu Zeichnen.

Weiß nicht genau was wie Perfomant ist.

Wenn jemand ne Idee hat, wie ich das ganze von ner anderen richtung angehe, bin ich offen

P.S. das mit den halbstunden ist nur ein beispiel, ich kann das z.B. auch über eine woche darstellen, habe aber daten von min alle 60min und max alle 2min, das kann ich gar nicht mehr sehen, bzw. 2min über eine Woche ist mit sicherheit kleiner als 1 pixel.

16.05.2008 - 14:44 Uhr

Hallo,

wie oft machst du dass denn? wenn du die meisten objekte häufig vergleichen musst, wäre eine möglichkeit z.B. beim instanzieren der Objekte, einen konstruktor zu streiben, der an sich schon auf eine bestimmte art und weise einen Kontrollcode erzeugt, nichts anderes tust du ja ansonsten auch oder prüfst du jeden primitiven datentyp einzeln ab?
Könntest z.B. einen String mit entsprechender eindeutiger Kodierung hinterlegen, und wenn du zur Laufzeit prüfen willst, nur diesen String vergleichen
Bedeutet einmal viel aufwand (Du musst dir schließlich eine Eindeutige codeirung überlegen) und erhöhtes rechenaufkommen bei der instanziierung, aber dafür schnelle vergleiche.

16.05.2008 - 13:14 Uhr

So hier mal ne Möglichkeit.
bestimmt nicht die Sauberste möglichkeit, aber um ziffern raus zu bekommen, aus einem gefilterten String so möglich.

string str = "1221" ;
            int[] arr =new int[str.Length];
            for (int i = 0; i < str.Length; i++)
            { 
                arr[i] = str[i]-48;
            }
16.05.2008 - 13:01 Uhr

Hoffe, dass das nicht das problem ist, teste nur, ob das Programm wieder abstürzt oder nicht, hatte vorher eine Laufzeit wie beschrieben von etwa 24h, jetzt sollter der GC zumindest aufräumen, bevor der RAM komplett voll ist. Zumindest meiner Meinung nach, denn wenn nicht, wann ist es denn dann notwendig

16.05.2008 - 12:39 Uhr

Vielen dank

Ich denke das es jetzt geht, _Zumindest sind nach dem schleifen durchlauf alle Buttons verschwunden, was den speicherplatz angeht werde ich das mal übers WE testen, Damits funktioniert musste ich ein bischen was ändern sieht jetzt so aus:

foreach (Control c in pl_aktuell_wr.Controls)
                {
                    Button b = c as Button;
                    if (b != null)
                    {
                        c.Click -= cmd_wr1_Click;
                        c.Dispose();
                    }
                }
                this.pl_aktuell_wr.Controls.Clear();
                this.pl_aktuell_wr.SuspendLayout();
                for (index = 1; index <= 31; ++index)
                {
                    if (wr_vorhanden[index] == true)
                    {
                        if (einspeiseleistung[index] > 10)
                        {
                            switch (index)
                            {
                                case 1:
                                    Button cmd_wr1 = new Button();
                                        cmd_wr1.BackColor = wrfarben(index);
                                        cmd_wr1.Location = new Point(1, pl_aktuell_wr.Top + (pl_aktuell_wr.Controls.Count * 30));
                                        cmd_wr1.Size = new Size(Convert.ToInt32(einspeiseleistung[index] / faktor), 20);
                                        cmd_wr1.Name = "cmd_wr1";
                                        cmd_wr1.Text = "WR1";
                                        cmd_wr1.Click += new EventHandler(cmd_wr1_Click);
                                        pl_aktuell_wr.Controls.Add(cmd_wr1);
                                    break;
16.05.2008 - 12:11 Uhr

Ich gebe mir ja mühe, auch wenn es hier evtl anders aussieht. Wie kann ich denn

pl_aktuell_wr.Controls.Contains(cmd_wr1)

machen, bevor ich

Button cmd_wr1 = new Button();

gemacht habe, also im Quelltext.

Wenn ich z.B.

if (!pl_aktuell_wr.Controls.Contains(cmd_wr1))
{
     Button cmd_wr1 = new Button();
}

ist mindestens beim erstenmal cmd_wr1 nicht vorhanden.
Ich kann das leider so nicht kompilieren.
wenn ich erst den Buttonerstelle, dann meine abhandlungen mache (veränderungen, wenn in der Liste an sonsten in die Liste aufnehmen) und in dann Wieder Dispose, ist er nicht sichtbar, also temp Objekt ist nicht.

Stehe offensichtlich komplett auf dem schlauch...

16.05.2008 - 10:49 Uhr

Vor dem Clear des Panels, meckert allerdings VS, dass das Objekt nicht bekannt ist. Der Anfang sieht wie folgt aus:

private void zeichne_buttons()
        {
            try
            {
               
                this.pl_aktuell_wr.Controls.Clear();
                for (index = 1; index <= 31; ++index)
                {
                    if (wr_vorhanden[index] == true)
                    {
                        if (einspeiseleistung[index] > 10)
                        {
                            switch (index)
                            {
                                case 1:
                                    
                                    Button cmd_wr1 = new Button();
                                    cmd_wr1.Dispose();
                                    cmd_wr1.BackColor = wrfarben(index);
                                    cmd_wr1.Location = new Point(1, pl_aktuell_wr.Top + (pl_aktuell_wr.Controls.Count * 30));
                                    cmd_wr1.Size = new Size(Convert.ToInt32(einspeiseleistung[index] / faktor), 20);
                                    cmd_wr1.Name = "cmd_wr1";
                                    cmd_wr1.Text = "WR1";
                                    cmd_wr1.Click += new EventHandler(cmd_wr1_Click);
                                    //pl_aktuell_wr.Controls.Add(cmd_wr1);
                                    try
                                    {

                                        cmd_wr1.Dispose();
                                    }
                                    catch
                                    {
                                        MessageBox.Show("Fehler bei Dispose");
                                    }
                                    break;

habe mal gelesen, das in C# nur noch referenzen übergeben werden, demnach gehe ich davon aus, dass mein Dispose eh an der falschen stelle ist. So wie es da im moment steht bekomme ich auch immer eine Dispose Exception. Ist also falsch 😦

16.05.2008 - 10:23 Uhr

Ok Hab jetzt verstanden, dass ich die Buttons selbst freigeben muss.

this.pl_aktuell_wr.Controls.Clear();

löscht so wie ich das verstanden habe nur die Referenz in dem Panel, nicht jedoch den Button selbst.

Wenn ich nun dieses hier versuche:


try
{
    if (cmd_wr1.Enabled())
    {
        cmd_wr1.Dispose();
    }
    else
    {
        cmd_wr1.Dispose();
    }
}catch
{
    MessageBox.Show("Fehler bei Dispose");
}
Button cmd_wr1 = new Button();
cmd_wr1.Dispose();
cmd_wr1.BackColor = wrfarben(index);
cmd_wr1.Location = new Point(1, pl_aktuell_wr.Top + (pl_aktuell_wr.Controls.Count * 30));
cmd_wr1.Size = new Size(Convert.ToInt32(einspeiseleistung[index] / faktor), 20);
cmd_wr1.Name = "cmd_wr1";
cmd_wr1.Text = "WR1";
cmd_wr1.Click += new EventHandler(cmd_wr1_Click);
pl_aktuell_wr.Controls.Add(cmd_wr1);
break;

geht das nicht, da der Button an der stelle noch nicht bekannt ist. VS meckert.

wenn ich jedoch nach

pl_aktuell_wr.Controls.Add(cmd_wr1);

versuche den Button freizugeben, verweist doch die Referenz in dem Panel ins leere oder hab ich hier einen gedanken fehler?
Wo muss ich denn löschen?

14.05.2008 - 17:27 Uhr

Die Buttons werden ja in diesem Beispiel erstellt und danach an das Panel übergeben. Bei jedem aufruf der gesamt funktion werden die Objekte in dem Panel gelöscht, mit
this.pl_aktuell_wr.Controls.Clear();

Wie verhalten sich die Buttons nachdem sie an das Panel übergeben wurden, bleiben die Bestehen? Werden nur Pointer auf die Buttons übergeben? Kann ich die buttons nach der Übergabe freigeben?

Programm laufzeit bis zur fehlermeldung ca 24h geplante laufzeit Jahre

14.05.2008 - 16:53 Uhr

Die Butons werden häufig neu gezeichnet, dies ist erforderlich, da sich die anzahl, bzw. die Nummern der aktiven Geräte ändern kann.

Wenn ich die jedesmal neu erstelle, werden sie überschrieben und die alten verschwinden im Nirvana, ist das richtig soweit?

Lösung ich müsste die Buttons entweder abfragen, ob die in einer Liste stehenden Geräte bereits durch einen Button representieret werden, oder wenn ich es nicht ganz so elegabt machen will, lösche ich erst alle Buttons und danach erstelle ich alle erforderlichen neu.

Sind das machbare ansätze, oder steuere ich in die falsche Richtung?

Ich kann beim steigenden speicherbedarf im übrigen zugucken. Die gespeicherten Daten werden um ca 6kb größer, der speicherbedarf jedoch um 200KB, das ist bei etwa 38MB arbeitssüeicher schon recht empfindlich viel finde ich

14.05.2008 - 16:26 Uhr

Insgesammt wird die anwendung mit zunehmender Laufdauer auch sehr viel lngsamer, könnte jedoch auch an erhöhtem daten aufkommen liegen

14.05.2008 - 16:19 Uhr

Hallo zusammen

einige Forensuche ergab, das meine Idee mit Dynamischen Variablen namen wohl nicht die bomben Idee ist.

Mein Problem, ich arbeite auf einem Controlpanel. Hier habe ich eine relativ große Anwendung laufen. Diese erzeugt zur Laufzeit Bottons. Da es verschieden viele sein könne werden diese in einer Forschleife unter Verwendung einer Switch abfrage erstellt, bestimmt nicht optimal, aber so ist das in diesem Projekt zurzeit.
Ein Case sieht so aus


Button cmd_wr1 = new Button();
cmd_wr1.BackColor = wrfarben(index);
cmd_wr1.Location = new Point(1, pl_aktuell_wr.Top + (pl_aktuell_wr.Controls.Count * 30));
cmd_wr1.Size = new Size(Convert.ToInt32(einspeiseleistung[index] / faktor), 20);
cmd_wr1.Name = "cmd_wr1";
cmd_wr1.Text = "WR1";
cmd_wr1.Click += new EventHandler(cmd_wr1_Click);
pl_aktuell_wr.Controls.Add(cmd_wr1);
break;

wird cmd.. an pl_aktuell übergeben und fällt nach beenden dieser Funktion weg oder bleibt der Button nochmal erhalten?

Bzw. kann ich das Objekt verwerfen?

Wenn dies der Fall ist, kann ich das in eine Funktion ausgliedern und zumindest den Namen des Eventhandlers Dynamisch erzeugen?

Habe leider ein Arbeitsspeicherproblem und möchte das hierrüber lösen, somal es auch von dieser Funktion hervorgerufen wurde.

Diese Funktion wird relativ häufig aufgerufen, wenn die Buttons jedesmal neu gespeichert werden, oder die alten nicht verschwinden, wäre dies eine Möglichkeit, wo ich viel speicher sparen könnte glaub ich.

Vielen Dank schonmal.

Ich möchte keine neue Diskussion heraufbeschwören, dass alle Leute, die Namen mit Indizes benutzen verbrannt gehören, leider heißen die Dinger auch von außen so.

13.05.2008 - 14:48 Uhr

Hallo zusammen,

Ich selbst und auch andere hier im Forum arbeiten mit dem Compaktframework. Es wäre vieleicht schön, ein unterforum für diese Leute einzurichten.
Die hilfe die man bekommt, ist zwar meistens gut gemeint, aber oft auch im CF einfach nicht vorhanden. Auch was die suche angeht müsste dies einiges erleichtern (z.B.: es gibt keinen Backgroundworker, auch wenn ich 10mal lese, dass dieser genau die richtige Wahl ist). Hier könnte man erst im CF forum gucken und wenn da nichts ist, die anderen nach umsetzbaren Lösungen durchforsten.
Außerdem wäre es einfacher seine Fragen unterzubringen.

mfg Daniel

02.05.2008 - 15:08 Uhr

Die Datei ist ja recht klein.
Festplatten werden bei Partitionieren in verschiedene Teile Unterteilt:
Byte
Sektor
und ich meine Cluster.
Jetzt ist es so das es kleinste verwendbare einheiten gibt, die immer komplett benutzt werden. Wenn nun deine Datei kleiner als die kleinste verwendbare einheit ist, wird diese trotzdem komplett angefordert und somit blockiert.
Ich nehme an das deine Externe Festplatte ein größeres gesamt Volumen hat als das Quelllaufwerk. Hierdurch kommt dieser unterschied zu stande.
Versuch mal eine txt Datei mit 1 oder 2 Zeichen zu speichern, sollte einen Unterschied von 1 Byte hervorrufen, wird es aber höchstwarscheinlich nicht tun.
Was du dagegen tun kannst erstmal überhaupt nichts.
Wenn ich das richtig in errinnerung habe, war das so dass ein bestimmtes Datei System eine Maximale anzahl von Clustern unterstützt (z.B. 200 damit es einfacher zu rechnen ist) wenn du nun eine 200GB Platte nimmst und sie unterteilst erhälst du eine Cluster größe von 1GB jede Datei die du Kopierst hat nun eine größe von n1GB. Wenn du die gesamtgröße deiner Partition änderst, aber nur eine behälst, auf 200MB erhälst du ein Cluster größe von 1MB, also Datei größen von n1MB, aber leider auch nur 200MB speicher platz.

Fazit ich würde sagen du lebst mit der Verschwendung

29.04.2008 - 14:34 Uhr

Versuch mal ob es geht, wenn du bevor du einliest njochmal den Tastaturpuffer löscht, hab gerade nicht gefunden wie, aber müsste relativ leicht gehen, ansonsten Readline. Liest bis Return

09.04.2008 - 14:10 Uhr

Hallo

Was hälst du davon, wenn die eine z.B. 7x7 Matrix aus Labels erzeugst. Darüber setzt du eine Reihe mit Buttons. Damit kannst du die Spalte auswählen, in die du deinen Stein Plazierst. Du erzeugst ein Arrey, Welches 7x7 Objekte enthält,. Jedes davon enthält widerum ein Label und Funktionen get und Set für die Hintergrund Farbe, wegen OO. Du änderst einfach die Hintergrund Farbe, oder nimmst 7x7 Image-Felder, weiß gerade nicht den Namen, wo du mit der Funktion dann ein Bild von einem Gelben oder Roten Kreis nimmst. Ich denke, das ist nicht wirklich Komplizierten und OO und du hast weniger Buttons.

Gruß Daniel

Ps. Wenn du ein Array nimmst, kannst du mit 2 Geschachtelten Forschleifen und einer Abfrage arbeiten.

09.04.2008 - 08:43 Uhr

Debugging ist mit einem Echten Gerät echt nervig, ich hab das so gemacht, das ich alles was kritisch sein könnte, z.B. den Trafic auf dem Port in MassegeBoxen zurück gegeben habe, ist aber nicht wirklich praktikabel, wenn die Telegramme, oder was auch immer du versendest sehr schnell kommen. Ich hab dann die Verarbeitung so weit gemacht, das etwas passiert und die Telegramm, die zu erwarten waren mit einem PC und entsprechender Software von Außen auf das CE Gerät geschickt, Damit kannst du zumindest die Funktion des Port klären. Ansonsten bleibt meines Erachtens nicht viel als die MassegeBox.

Gruß Daniel

09.04.2008 - 08:38 Uhr

Hallo

Ich würde die Gipskarton variante vorziehen. Kostet fast nichts und du brauchst ja auch nicht viel Platz hinter der Platte, Also Latten unter die Decke, LEDs in die Platte und drunterschrauben, Kostet etwa 4cm Decken höhe und etwa 25€ je nach Raum größe. Und soo schwer zu machen ist es auch nicht.

Gruß Daniel

08.04.2008 - 14:52 Uhr

Hallo Jim Knopf

Ich hab auch einiges mit SerialPort unter CF gemacht, aber im Emulator hab ich das nie zusammen gekriegt, dass es läuft.
Hast du die Möglichkeit, dein Programm auf einer Echten Hardware zu testen? Das würde ich jetzt tun. Wie das mit dem Emulator funktioniert kann ich dir leider nicht sagen, aber der gibt ohnehin nicht alles genau so wieder, wie es dann auf dem echten Gerät aussieht, also lieber echte Hardware verwenden.

MfG Daniel

28.03.2008 - 17:05 Uhr

ich nehme an wr sollen statt "Thread" demnächst "Beitrag" sagen, wenn es sich bei "Thread" um einen Beitrag und nicht um die Klasse System.Threading.Thread" handelt...

Das habe ich gemeint. Das würde die Forumssuche wesentlich angenehmer gestalten, wenn man nach System.Threading.Thread sucht.
Ist nicht böse gemeint oder so, hab nur letztens auf der Arbeit ewig über ein Wort und die Bedeutung Diskutiert und dachte deshalb, das es sich hier anbieten würde, eine kleine Namensänderung würde an dieser Stelle nicht schaden.

Gerade auch aus dem Grund, das es offensichtlich mit System.Threading.Thread öfters mal "Problemchen" gibt.

28.03.2008 - 16:39 Uhr

Hallo zusammen

Wollte nur kurz anmerken, dass das Wort Thread im sinne von Beitrag, vieleicht hier in zukunft auch so genannt wird. Soll keine Kritik sein, aber sucht hier mal nach thread, das sind im Moment 10.649 Hits und durch die Kombination mit anderen Begriffen wirds nicht unbedingt besser.
Es verwendet ja auch keiner im normalen sprach gebrauch if statt wenn...

gruß Daniel

14.03.2008 - 15:05 Uhr

Hallo

Nun geb ich auch noch meinen Senf dazu. Wie die Regeln sind, sei mal dahin gestellt. Ich komme eigentlich glaub ich ganz gut mit ihnen aus, aber wir sind hier doch in einem Programmierer Forum oder? Und wenn du was Programierst und dich nicht an die Regel hälst, dann gibt es zum beispiel sowas:
"1-Argument: kann nicht von "byte[]" in "string" konvertiert werden."
und dasw nur weil der Typ nicht passte, ich mich nicht an die Regeln gehalten hab. Denk mal drüber nach

mfg Daniel

13.03.2008 - 15:45 Uhr

Verpack die Daten doch als Byte,schau mal hier
Hab an sowas auch etwa ein bis zwei Wochen immer mal wieder rum gedoktort.

13.03.2008 - 09:24 Uhr

Habe gerade 11.000 durchläufe gemacht, läuft mit ersetzen ohne Probleme und sehr schnell, ist jedoch nicht sinnvoll. gibt es eine effektive variante, also ohne ebiges schrittweise durchgehen, den TextBox Inhalt auf 500 Zeilen oder so zu begrenzen, Sowas könnte ich machen.
Aber ersetzen würde den ganzen Sinn zunichte machen, ich will ja zustände mitschreiben, die auch mal sehr schnell reinkommen können, wäre doof wenn man dann irgendwas wichtiges nicht sehen könnte.

13.03.2008 - 08:50 Uhr

OK jetzt geht es. SCHAKA

Hier der Code

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
                string str = "";
                int bnread = serialPort1.BytesToRead;
                byte[] a_byte = new byte[bnread];
                serialPort1.Read(a_byte, 0 , bnread);
                for (int i=0;i<a_byte.Length;i++)
                {
                      str+=(char)a_byte[i];
                }
                BeginInvoke(new auswertung_delegate(auswertung), str);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

Vielen Dank

13.03.2008 - 08:30 Uhr

Kann ich das dann wieder als String verarbeiten, oder bekomme ich dann das gleiche Problem wieder?
Sonst muss ich alles auf Byte[] umstellen. Wenn ich mir dadurch das glecihe Problem einhandele, bau ich das um, aber ich bleibe doch dann auf dem gleichen System, also dürfte es eigentlich keine Probleme geben.

12.03.2008 - 14:22 Uhr

Entweder war der Link falsch, oder ich stehe gerade komplett auf dem Schlauch. ich speichere nach dem genannten Beispiel in ein char[] werde es nun nochmal mit einem Byte[] versuchen, vieleicht hilft das was. Char müssen doch auch Encoded werden.
Mein Code

private void serialPort1_DataReceived(..)
{
  try
  {
     int bnread=serialPort1.BytesToRead;
     char[] a_char=new char[bnread];
     int nread=0;
     nread=serialPort1.Read(a_char,0,bnread);
     string str=new string(a_char,0,nread);

     BeginInvoke(...);
  }...
}
12.03.2008 - 08:43 Uhr

Habe das ausprobiert und habe auch alle möglichen Encoding Varianten getestet.

UTF7 wirft beim Verbinden, also beim Aufbau eines neuen COM Ports eine Exception

UTF8 arbeitet nur bis 7F

Unicode zeigt das bisher bekannte Verhalten.

BegEndianUnicode Zeigt nichts an

ASCII bis 7F

und Ansi also default zeigt auch das bekannte Verhalten.

Das merkwürdige ist ja, das ich auch Werte über 7F korekt bekomme, nur halt nicht die mit der führenden 9, bzw auch 8 aber die mit 8 sind mir egal, Ab A vorne geht es ja wieder.

11.03.2008 - 15:26 Uhr
private void auswertung(string str)//str ist das eingelesene des COM Ports
        {
            string ausgabe="";

            Buffer += str;
            befehl tmp=new befehl();
            ausgabe = tmp.Befehl(Buffer);
            if (ausgabe != "" && ausgabe != "ungültig")
            {
                zähler++;
                tb_ausgabe.Text = tb_ausgabe.Text.Insert(17, "\r\n" + DateTime.Now 
                            + " : " + ausgabe + " von:" + tmp.ausgabe_Adr(Buffer) 
                            + zähler.ToString());
            }
            try
            {
                int start = tmp.get_Start(Buffer);
                int ende = tmp.get_Ende(Buffer);
                if (start >= 0 && ende > 0)
                {
                    if (ende - start + 1 <= Buffer.Length)
                    {
                        Buffer = Buffer.Remove(start, ende - start + 1);
                    }
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString()+"Fehler in auswertung");
            }
            
        }

public string Befehl(string eingang)//eingang alles im eigenen Eingabe Puffer
            {
                if (eingang.Length >= 5)
                {
                    get_Positions(eingang);
                    if (OK)
                    {
                        if (pos_befehl > 0)
                        {
                            return ausgabe_Befehl(eingang);
                        }
                    }
                    return "ungültig";
                }
                else
                {
                    return"";
                }
            }

private void get_Positions(string eingang)
            {
                pos_start = get_Start(eingang);
                if (pos_start >= 0)
                {
                    pos_ende = get_Ende(eingang);
                    if (pos_start >= 0 && pos_ende > 0)
                    {
                        pos_befehl = get_Befehl(eingang);
                        pos_adr = get_Adr(eingang);
                    }
                }
                if (pos_start >= 0 && pos_ende > 0 && pos_befehl > 0)
                {
                    OK = true;
                }
            }

public int get_Start(string eingang)
            {
                int pos = 0;
                try
                {
                    pos = eingang.IndexOf("\u0002");
                }
                catch (Exception e)
                {
                    //MessageBox.Show("index 0002 failed " + e.Message);
                    pos = -1;
                }

                return pos;
            }

private int get_Befehl(string info)
            {
                int pos = -1;
                try
                {
                    int min = 3;
                    int max = 6;
                    if (max >= info.Length)
                    {
                        for (; min < info.Length; min++)
                        {
                            for (int i = 0; i < moegl_Befehl.Length; i++)
                            {
                                if (info[min] == moegl_Befehl[i])
                                {
                                    return pos = min;
                                }
                            }
                        }
                    }
                    else
                    {
                        for (; min < max; min++)
                        {
                            for (int i = 0; i < moegl_Befehl.Length; i++)
                            {
                                if (info[min] == moegl_Befehl[i])
                                {
                                    return pos = min;
                                }
                            }
                        }
                    }
                }
                catch (Exception e)
                {
                    //MessageBox.Show("  pos of Befehl Excep" + e);
                    pos = -1;
                }
                return pos;
            }

get_ende und get Adresse sind sehr ähnlich, deshalb Poste ich die der5 übersicht halber nicht

11.03.2008 - 15:19 Uhr

Habe nochmal was ausprobiert.

Habe mal manuell in die Textbox ein ö hinein geschrieben. dieses wurde normal ausgefürt, wenn ich \u0094 schreibe, was unter Winxp und Win200 ebenfalls ein kleines ö ist, erscheint ein Quadrat (Platzhalter??)

11.03.2008 - 14:00 Uhr

Eventuell liegt auch hier was im Argen, aber ich glaube es nicht

public string newsocket()
        {
            try
            {
                if (this.serialPort1 != null && this.serialPort1.IsOpen)
                {
                    this.serialPort1.Close();
                }
                if (!serialPort1.IsOpen)
                {
                    serialPort1.PortName = "COM3";
                    serialPort1.BaudRate = 19200;
                    serialPort1.DataBits = 8;
                    serialPort1.Parity = Parity.None;
                    serialPort1.StopBits = StopBits.One;
                    serialPort1.ReadTimeout = 2000;
                    serialPort1.Encoding = Encoding.Default;
                    serialPort1.Open();
                    connected = true;
                    return "";
                }
                else
                {
                    serialPort1.Close();
                    serialPort1.Open();
                    return "";
                }
            }
            catch(System.IO.IOException)
            {
                return "Bitte überprüfen sie, ob ein anderes Programm auf den COM Port zugreift und beenden sie gegebenen Falls die Verbindung";
            }
        }

Wo anders wird am Port nicht gemacht, außer schließen.

11.03.2008 - 13:23 Uhr

Stehe immernoch vor diesem Problem. Habe schon mit einem zweiten Rechner den Trafic über den COM Port mit getraced. es wird alles wie angegeben versendet. Jedoch werden die Zeichen wie oben beschrieben nicht Korekt eingelesen. Kann es sein, das Win Ce einen Zeichensatz verwendet, bei dem die Zeichen zwischen 80hex und 9Fhex nicht verwendet werden dürfen (windows interne Steuercodes oder weiß der Teufel was auch immer)?

Such mir inzwischen seit 2 stunden nen Wolf

11.03.2008 - 10:03 Uhr

Habe mal nachgeguckt. Ein string, zumindest war das bei C++ beim Ansi string so, hat 4GB kapazität, ich kan darstellen, also das was ich scrollen kann sind 951 Zeilen mit jeweils 63 Zeichen. Das sind aber wenn ein zeichen ein Byte hat nur ca 60kb, das ist ein bischen wenig finde ich, evtl. Zeilen Beschränkung?

11.03.2008 - 09:26 Uhr

Habe mal mit sehr viele Daten geschickt. Mein Code ist Offensichtlich nicht sehr perfomant, Habe aber dadurch feststellen können, Das der Code, je länger er arbeitet immer langsamer wird. Am Anfang wurden etwa 5-7 Auswertungen pro Sekunde durchgeführt, zum Schluss waren es nur noch 2 Auswertungen je Sekunde. Das spricht doch dafür, das sich ein "großer Berg" Daten angesammelt hat, den ich ja nun nicht mehr lösche(glaub ich). Die Hilfe konnte mir zu der Frage ob ich den Einlesespeicher lösche (mit readexisting) nicht weiter Helfen.
Ander zwischen Frage, ich gebe in eine Textbox mit Multiline und Scrollbar aus, ist da die Max Zeilenanzahl vorgegeben? Denn ich kann nur bis zu einer gewissen Stelle herunter scrollen, danach andert sich der inhalt nicht mehr, Obwohl er ja zumindest eine Andere Zeit anzeigen muss. Es sind bis dahin aber bestimmt einige hundert Zeilen.

11.03.2008 - 08:39 Uhr

Danke sehr, das wars Tatsächlich. Löscht ReadExisting den Speicher selber? Also hab ich das dann doppelt gemacht?
Probiere gerade was passiert wenn sehr viele Daten kommen. Aber bis jetzt scheint es keinen überlauf oder so etwas zu geben.