im Zweifel könnte dein Problem dort liegen, wo du den Port auf machst, wartest du irgendwie auf empfangene Daten? Sorichtig nebenläufig ist die SerialPort Verarbeitung out of the Box dann nämlich auch nicht.
Falsches Forum, aber wie gebunden bist du an WinForms? Evtl. schaust du dir mal die Varianten an, die WPF so mit bringt, das ist dort (wie ich finde) deutlich komfortabler und handhabbarer gelöst. Reichen ja erstmal drei Bilder oder so, die du über ein ander legst un ein bisschen an der Transparenz rum schraubst.
wir arbeiten gerne mal mit Embedded Hardware und "lansamen" aber zeitkritischen Übertragungen, die war in C# visualisieren oder dort einstellungen treffen.
Im Embedded Bereich hat man gerne mal nur wenige kByte Ram. Um dort "aufwändige" Datenstrukturen halten zu können muss man schon mal Bits schubsen und wenn ich einen Rechner habe, der das rückwärts im schlaf kann, dann mache ich das Bit Schubsen natürlich auf dem PC und nicht auf dem embedded Controler.
Das gibt es damit also durchaus auch in der Praxis aber der regelfall wird das wohl eher nicht sein.
ich hab dafür eine Lösung, bin mir nicht sicher, dass es der Weisheit letzter Schluss ist, aber Funktioniert und ich finde auch nicht ganz schlecht.
Ich habe ein DLL Projekt angelegt, dort u.a. eine Form drin.
Ich verwende eine Statische Klasse als interface nach außen, dass passt in meinem Fall am besten, dieser gehört auch das Window. An irgendeiner Stelle muss das ja erzeugt werden. Dann kann ich das ViewModel an an das Window binden und mache den rest des Zugriffs wieder nur darüber.
Wobei diese leider auch teilweise extrem niedrig ist - und man hört ja immer wieder von Fällen, in denen exakte, nicht legitime Kopien anderer Apps durch dritte Parteien eingestellt und akzeptiert wurden.
Das spricht ja nicht für schlechten Code, sondern nur für schlechtes Geschäftsgebaren. Mit mindest Qualität meinte ich eigentlich, dass mein Gerät nicht zerstört wird.[/OFFTOPIC]
Na, damit du nicht deinen eigenen Vertriebskanal generierst.
Grundsätzlich finde ich das Konzept gar nicht schlecht. Man erhält eine mindest Qualität der Software, dafür muss jeder Entwickler die Infrastruktur bezahlen. Bei Apple gibts noch ne Entwicklungsumgebung dazu, für Lau. Wie MS das handhabt weis ich gerade nicht.
Prinzipiell ne gute Idee, nur eben leider nicht für "Bastler" die mal was für sich schreiben wollen.
Unser Lieferant hat die Treibersoftware umgestellt. Mit einem älteren Treiber bin ich unter der 32 Bit Version klar gekommen. Für 64 Bit habe ich aktuell keine Treiber, da muss ich mich drum kümmern.
Portmon ist leider unter Win7 wohl nicht lauffähig und wird anscheinend von Microsoft seit 2006 nicht mehr weiterentwickelt.
Ich habe ein anderes Programm, welches auf diese Hardware zugreift. Dieses ist in C++ geschrieben und läuft ohne Probleme, ich weiß jedoch nicht, ob dieser den SerialPort mehrfach oder nur einmal Öffnet.
Dem Treiber werde ich mich nochmal annehmen. bzw. mal eine andere Hardware Testen.
Ich möchte euch noch ein wenig Code zur Verfügung stellen. Ich habe die Funktion ein wenig gekürzt, aber hoffentlich alles relevate Dringelassen.
private bool SendeEinenEingang( )
{
DateTime aktuell = new DateTime();
TimeSpan timeOut = new TimeSpan(3500000);//=>350ms
//Erstellen einer neuen SerialPort Instanz
SerialPort port = ErstellePort( portname );
if ( port != null )
{
//Lese Eingang aus
int eingang = /*hier wird die Anzahl ermittelt*/;
//Erzeugen der fortlaufenden Nummer für den Eingang, real 1-10, 19-28
if ( eingang > 10 )
{
eingang = eingang - 8;
}
//Erzeugen eines schreibe Puffers, fülle mit Daten
byte[] ausgangsPuffer = new byte[ 6 ];
ausgangsPuffer[ 0 ] = busAdresse;
ausgangsPuffer[ 1 ] = Convert.ToByte( eingang - 1 );
ausgangsPuffer[ 2 ] =/*weitere Daten*/;
/* Noch mehr Daten*/
for(...)
{
try
{
//Öffnen des SerialPorts
port.Open();
string[] ports = System.IO.Ports.SerialPort.GetPortNames();
bool vorhanden = false;
for (int i = 0; i < ports.Length; i++)
{
if (ports[i] == portname)
vorhanden = true;
}
if (!vorhanden)
{
return false;
}
if (port.IsOpen)
{
//Senden des Protokolls
port.Write(ausgangsPuffer, 0, ausgangsPuffer.Length);
int zaehler = 0;
//Hohle aktuelle Systemzeit für Timeout
aktuell = DateTime.Now;
//Warte auf genug Daten oder Timeout
while (!(port.BytesToRead ≥ bytesToRead)
&& ((aktuell + timeOut) > DateTime.Now))
{ zaehler++; }
//Es liegen genug Daten im SerialPort Puffer
if ((port.BytesToRead == bytesToRead)
|| (port.BytesToRead > 12))
{
//Erstellen eines Eingangspuffers
byte[] eingangsPuffer = new byte[bytesToRead];
//Einlesen der empfangenen Daten
port.Read(eingangsPuffer, 0, eingangsPuffer.Length);
//Schließen des SerialPorts
port.Close();
//Festlegen ob ein Offset nötig ist, wenn ja wie groß
int offset = 0;
if (eingangsPuffer[0] != 0xBD)
offset = 6;
//Prüfen ob die Antwort gültig ist, sost Enden
if (!IstKorrekteAntwort(eingangsPuffer,
ausgangsPuffer, offset))
{
//Schließe SerialPort
port.Close();
//Schließe Progress Formular, aktiviere MainForm
fortschrittsUebertragungsForm.Schließen(false, ref hauptForm);
//Öffne Fehlermeldung
ErrorMessage fehlerForm = new ErrorMessage();
fehlerForm.ZeigeFehlerDialog("Fehler",
"Bei der Übertragung kam es zu Komplikationen",
"es wurde nicht geantwortet", true);
return false;
}
}
else
{
//Schließe SerialPort
port.Close();
//Schließe Progress Formular, aktiviere MainForm
fortschrittsUebertragungsForm.Schließen(false, ref hauptForm);
//Öffne Fehlermeldung
ErrorMessage fehlerForm = new ErrorMessage();
fehlerForm.ZeigeFehlerDialog("Fehler",
"Bei der Übertragung kam es zu Komplikationen",
"es wurde nicht geantwortet", true);
return false;
}
//Zeige den Fortschritt an
fortschrittsUebertragungsForm.NaechsterSchritt
(/*Fortschritts Handling*/);
}
else //if ( port.IsOpen )
{
istErfolgreich = false;
}
}
catch (Exception e)
{
if (e is System.UnauthorizedAccessException || e is System.InvalidOperationException || e is System.IO.IOException)
{
if (e is System.InvalidOperationException)
{
//Schließe SerialPort
port.Close();
}
//Schließe Progress Formular, aktiviere MainForm
fortschrittsUebertragungsForm.Schließen(false, ref hauptForm);
//Öffne Fehlermeldung
ErrorMessage fehlerForm = new ErrorMessage();
fehlerForm.ZeigeFehlerDialog("Fehler",
"Bei der Übertragung kam es zu Komplikationen",
"Die USB Verbindung wurde unterbrochen. bitte überprüfen sie "
+ "den Anschluss der Schnittstelle", true);
return false;
}
}
} //for ( ...)
port.Dispose();
return true;
} //if ( port != null )
else
{
return false;
}
}
ich habe ein Problem mit einem meiner Programme beim ausführen unter Win7 (32 und 64 Bit).
Unter Win XP tut es was es soll.
Das Problem hängt mit einem von mir verwendeten SerialPort zusammen. Hardware technisch verwende ich einen USB Converter.
Aus verschiedenen Stellen des Programms greife ich nach ein ander auf dieses Gerät zu. Deshalb öffne ich die Verbindung, mache meine Übertragungen und schließe es wieder.
Nun die Fehlerbeschreibung: Wenn ich das erste mal eine Verbindung herstelle, d.h. USB eingesteckt, Serialport geöffnet, senden, empfangen, schließen, Funktion Ende, funktioniert das ganze tadellos. Aber bereits beim nächsten Verwenden wird nichts mehr empfangen. Senden funktioniert weiterhin. Mit einem anderen Rechner lese ich die Daten auf dem Bus mit, es findet eigentlich eine saubere Kommunikation statt. Aber wie gesagt, es wird nichts empfangen.
Getestet habe ich zusätzlich mit einem anderen .Net bassierten Programm, welches zum Mitschreiben der Busaktivität dient. Hier ist das Verhalten identisch. Wird die Verbindung geschlossen, und wieder geöffnet, wird nicht Empfangen.
Durch entfernen des USB-Steckers und wieder hineinstecken kann das Problem gelöst werden, bis das nächste mal der Serialport geschlossen wird.
Was ich bisher versucht habe, ist dass ich mich nicht wie vorher darauf verlassen habe, dass die Instanz der Serialportklasse am ende der Funktion zerstört wird, sondern ich habe sie "von Hand'" Disposed. Dies hat leider nichts gebracht.
Gibt es hier bekannte Schwierigkeiten? Muss ich noch mehr "von Hand" aufräumen? Oder vermutet ihr ein Treiber Problem?
Die Treiber Problematik möchte ich eigentlich ausschließen, da ein C++ Programm ohne Probleme mit diesem Gerät arbeitet.
Gruß Daniel
edit: Es werden keine Exceptions geworfen. Da ich auf eine Antwort warte, erkennt das Programm selbst, dass nicht geantwortet wurde. Ich habe außerdem ein kleines tool geschrieben, um das Event verhalten zu Testen, dieses Verhält sich gleich.
@ herbivore: unterschiedlich, von 80x80 px bis 600x 300 px
@ winSharper93: ich sitze gerade daran alle bilder aus der momentane anwendung heraus zu schneiden, diese kann ich dann einfach aus und ein blenden und spare mir die transparenz weil die Hintergrundfarbe schon drin ist.
ich arbeite gerade mal wieder an Visualisierungen, wie das dabei so ist kommt man um die ein odere andere Grafik nicht herum. Daraus ergeben sich aber ein paar Probleme.
Ich habe beispielsweise eine Form, mit einem Hintergrundbild (max 94,3kB .png) zwei Bildern (56,9kB .png) und 12 Bildern (47kB .png).
eingebettet habe ich diese im Designer von VS in dem ich eine lokale Resource hinzufüge und dann auf Importieren klicke.
Die Bilder werden nicht immer angezeigt, sondern manchmal setze ich die Visible Eigenschaft auf true oder eben false.
Das ausblenden von 7 Bildern und das einblenden von einem Bild dauert geschlagene 1,5 Sekunden. Bei einem Pentium M 1,73 GHz 1GB Ram gestartet aus VS uim Debug Mode. Das finde ich sehr lang.
Kann mir jemand bitte einen Denkanstoss geben, wonach ich suchen kann?
Danke Daniel
Edit: ich arbeite mit transparenten hintergründen, ist da vieleicht der Pfefferbegraben?
Bau eine Funktion zu Speichern, die du über ein Menü oder sonst wie aufrufst. darin öffnest du den Dialog mit ShowDialog. Wenn du dann das Dialogergebnis auswertest ist doch an der stelle der Dialog schon geschlossen. Wenn du jetzt auf das Ok reagierst und deine Form öffnest, ist der Dialog schon geschlossen.
Entweder ist das kein Problem das so zu machen, oder ich habe das Verhalten bei mir immer falsch Beobachtet.
Ist nicht mein Gebiet, aber kannst du nicht normal einfügen, und dann in TextChanged oder so die Text eigenschaft also den Wert der RTF Eigenschaft zuordnen, du willst doch dass sämtliche formatierung verschwindet oder nicht?
Also ich denke nicht, dass es heute mehr Gewalt gibt als früher, sondern nur der Teil schwerer Gewalt ist deutlich gestiegen. Früher hatten selbst Strassenschläger noch respekt vor ein ander. Hat einer "aufgegeben" oder kam nicht mehr vom Boden hoch, dann wurde aufgehört. Heute fängt man dann erst richtig an.
Das den Jugendlichen die Koinsequenzen ihres Handelns nicht bewusst sind, kann ich nicht bestätigen. Ich fahre mit öffentlichen verkehrsmitteln zur Arbeit und fahre dabei an einem "sozialen Brennpunkt" oder zumindest an der dazu gehörigen schule vorbei. Dort sind immer wieder Kinder in der Bahn, die sehr klar haben, dass sie mit 14 kürzertretten müssen, weil ab dann nicht mehr der Polizist sagt "Du du du..." und es nihct mit einem erhobenen Zeigefinger getan ist. Ob diese Jugendlichen dann den absprung aus der Gewalt schaffen ist fraglich, aber sie nehmen es sich zumindest vor. Ich denke aber auch, dass die Jugendstrafen dann keine ausreichende Abschreckung darstellen.
Danke, Daruaf bin ich auch gekommen, damit bekomme ich einen uralt, also Windows 3.11 Style oder so ähnlich. Im größten Notfall lebe ich damit auch. Was ich gerne hätte wäre der "klasische Style" den ich bei Windows XP auswählen kann. Den müsste es zumindest bei Vista auch noch geben.
Wobei Eigentlich ist das fast nur interesannt bei einer Progressbar die ich habe, den Rest der Anwendung muss ich nur ein wenig größer machen.
Diese macht nämlich aus dem Schönen blauen kontinuierlichen Progress einen ziehmlich hässlichen grünen Block Progress und gerade weil ich in der Progressbar selbst den Fortschritt anzeige ist das nicht sehr schön.
Wobei, wenn es nicht was ganz einfaches gibt, dann shcreib ich den Fortschritt einfach drunter und zieh alle Forms was größer und dann hat sich die Sache.
Edit: Das mit dem Umstellen geht so: Application.VisualStyleState = System.Windows.Forms.VisualStyles.VisualStyleState.NoneEnabled;
Ich habe eine Anwendung, die so aussieht, wie ich es gerne hätte. Nun habe ich mal den Windowstheme verstellt (gut da hätte man auch früher drauf kommen können) und jetzt passt natürlich ne Menge nicht mehr. Muss ich also vor dem Start den verwendeten Style von Windows auslesen und entsprechend darauf reagieren, oder gibt es die Möglichkeit dem Nutzer die Klasischen Style "aufzuzwingen" zumindest für meine Anwendung?
In diesem Beitrag ging es Quasi um das gleiche nu4r anders herum.
Rainbird verlinkt dort einen Artikel aus der MSDN. um in alte Anwendungen neue Styles einzubinden. Ich nutze .Net 2.0 und will genau das verhindern.
Geht sowas? Und wenn ja, hättet ihr nen schlauen Suchbegriff für mich?
Du nimmst deine zwei Zeiten, und prüfst in dem du dir für einen Slot jeweis die Start und endzeitpunkte als Datetime für den gewünschten Tag anlegst, ob deine beieden Zeiten jeweils größes als die untergrenze, bzw. kleiner als die Obergrenze sind.
Ist das der Falls, dann rechnest du zeit2-zeit1 und hast ein TimeSpan.
Ist sagen wir Zeit2 größer, also geht über einen Slot hinweg, dann nimmst du Maxzeit-zeit1
Ist Zeit1 Kleiner nimmst du Zeit2-Minzeit.
Über zwei Tage hinweg kommt noch ein bischen was hinzu.
[offtopic]
Hallo herbivore
Ich meine bei meinem letzten einkauf über mycsharp auf die seite gegangen zu sein und mir bücher angesehen zu haben, als ich von zu hause direkt auf Terashop gegangen bin waren sie m.E. deutlich teurer, ich kann mich aber auch geirrt haben[/offtopic]
ich habe sowohl Visual C# 2005 - Schritt für Schritt also den Vorgänger als auch talas Empfelung Windows Forms-Programmierung mit Visual C# 2005.
Habe sie bisher nur überflogen und sie machen beide einen gescheiten Eindruck. Wenn dir egal ist, dass sie VS 2005 sind, gibt es die für mycsharp nutzer günstiger im Terashop hier unter dem Menü.
edit: oder gibt es das Angebot nicht mehr, hab es gerade nicht finden können
also ich für meinen Teil zocke gerne mal abends oder am WE, Dies liegt daran, dass ich einfach immer über irgendwas nachdenen muss. Ein zur Ruhe kommen und mal nichts im Kopf haben gibt es bei mir nicht. Wenn ich z.B. nen gemütlichen Fernseh abend mache, dann kommen fast immer irgendwelche spekulationen warum die Story nicht realistisch ist o.ä. Ist die Sendung also nicht sehr gut und das ist heute leider selten der Fall, dann schleppe ich die Gedanken darüber ewig manchmal bis spät in die Nacht mit mir rum. Deshalb ist ein Computerspiel oder sowas, was mein Gehirn beschäftigt für mich absolut entspannend, weil es einfach den Kopf frei hält.
Habe ich mal ausversehen nichts zu tun, oder mal keine Lust auf nihcts, werde ich schnell agressiv gelangweilt, das ist der Zustand in dem alles und jeder dafür verantwortlich ist, dass mir langweilig ist und dieser Zustand ist nicht erstrebenswert.
Ein Asuflug oder so ist natürlich auch eine feine Angelegenheit aber meist aus Zeit oder aber Geld mangel (almer Student) nihct drin.
Was das feiern angeht habe ich die Zeiten hinter mir, seit ich 2 Jahre für eine Firma gearbeitet habe, die spezial Events für Diskotheken entwickelt und vertriben hat. Dort habe ich genug laute Musik und schlechte Disco Luft für die nächsten paar Jahre bekommen.
Saufen war noch nie so meins, das tut immer so weh den nächsten Morgen.
der blaue Pfeil - genau genommen der weiße Pfeil auf blauem Grund, aber lassen wird das :-) - also der blau Pfeil nach unten vor dem Titel des Threads in der Themenübersicht oder in den Suchergebnissen springt zum ersten ungelesenen Beitrag.
Ok, das mit dem gelben Pfeil habe ich nicht gewusst und auch nicht wahrgenommen.
Das verhalten der blauen Pfeils vor dem dem Threadtitel kann ich bestätigen, aber den oben beschriebenen blauen Pfeil in der Übersicht sehe ich nicht.
Ich habe an den Einstellungen des Forums nihcts geändert und nutze IE 7.
Dann gibts das Feature ja schon, super wie schnell das hier immer geht^^
Danke für die Erklährung
edit: Jetzt gehts, sehr merkwürdig. Vieleicht leigts an der bomben Internetleitung bei uns im Büro oder so...
Würde ich es über Timeout der Serialportklasse machen dann müsste ich ja mit der TimeoutException arbeiten. Da dies aber ein, naja, halbwegs erwarteter Zustand ist möchte ich das Programm nicht gegen die Wand fahren um es nachher wieder glat zu ziehen sondern umgehe die Ausnahme leiber, so sollte man das doch meines Wissens nach tun.
Verdammte Axt, Augen auf beim Forumsbesuch sag ich nur...
Ok, danke und Erledigt.
Aber das es das gibt zeigt, dass das Feature toll ist.
edit: Nochmal nachgesehen, das ist nicht das Feature, was ich suche, der Blaue Pfeil geht zum Ende der Seite, nicht zum letzten nicht gelesenen Beitrag.
Nehmen wir an, du hast nach 3 Wochen mal wieder Lust auf ein parr Javaprogramierer Witze. DA wurde inzwischen 25 neue Beiträge geschrieben. Du müsstest dir also merken, dass du das letzte mal bis mitte Seite 5 gekommen bist. Jetzt ist ende Seite 6 Erreicht.
Wählst du den Thread an, so landest du auf Seite 1 oben. Mit dem Blauenpfeil kommst du auf Seite 6 unten. Ich hingegen möchte zu Seite 5 Mitte, weil ich da weiter lesen muss.
da ich wegen eines Projektes auch öffter auf Mikrocontroller.net unterwegs bin, ist mir dort etwas aufgefallen.
Wenn ich dort ein Thema nochmals besuche, dann werde ich automatisch zu dem ersten Artikel geschickt, der erstellt wurde, nachdem ich das letzte mal das Thema besucht habe.
Ich lese also als erstens den letzten ungelesenen Beitrag.
Die Nötigen Tags werden hier glaub ich auch gespeichert, da ich irgendwo mal ein Link auf einen Folgebeitrag gesehen habe.
Ich persönlich finde das sehr nett und gerade bei relativlangen artikel äußerst praktisch.
Vielleicht investiert ihr mal einen Gedanke, ob das für dieses Forum evtl. auch erstrebenswert wäre.
Ich finde nicht, dass man wegen 2 gesparten Klicks das ganze Forensystem ümwerfen sollte, aber wenn dieses das Verhalten hergibt finde ich es ein nettes Feature. Aber möglicherweise spricht eine andere Überlegung dagegen.
Habe ich mir schon fast gedacht, als bei Timespan von Ticks die rede war.
Danke dir für das Posting, hat mir zumindest das Brett vorm Kopf weg gerissen.
Auch wenn deins genau so funktioniert wie meine Lösung, bleibe ich bei meiner.
Das sieht mehr nach Zeitmessung aus ;-)