![]() |
|
|||||||
| Newsgroup microsoft.public.de.german.entwickler.dotnet.vb Forum microsoft.public.de.german.entwickler.dotnet.vb |
![]() |
|
|
Themen-Optionen | Ansicht |
|
#1
|
|||
|
|||
|
Hallo,
ich möchte meine Anwendung für einen Moment unterbrechen und wenn ich das richtig verstehe kann ich das mit einem Timer tun. Der Timer wird aktiviert indem ich die Enable Eigenschaft auf TRUE setzte und je nach eingestellter Zeit wird eine Aktion ausgeführt nach dieser Zeit und das solange wie der timer aktiv ist nur bei mir passiert nichts nachdem ich den Timer vermeintlich aktiviert habe. Woran kann das liegen. Im konkreten Fall wird über eine serielle Schnittstelle eine Zeichenkette gesendet wenn sich in dieser Zeichenkette nicht bestimmte Zeichen befinden soll die Schnittstelle geschlossen ein Timer aktiviert werden der auf 1000 Millisekunden eingestellt ist und nach dieser Zeit soll die Schnittstelle wieder geöffnet und ein weiterer Versuch unternohmen werden mit der übertragenen Zeichenkette. Bloß bei mir funktioniert das nicht. |
|
|
||||
|
||||
|
|
|
#2
|
|||
|
|||
|
"Falk Espenhahn" <spinosa*newsgroup.nospam> schrieb: > ich möchte meine Anwendung für einen Moment unterbrechen und wenn ich das > richtig verstehe kann ich das mit einem Timer tun. Nein. Ein Timer löst im eingestellten Intervall das Timer.Tick Ereignis aus. In diesem kannst Du Deinen Code ausführen. Thorsten Dörfler |
|
#3
|
|||
|
|||
|
wie kann ich es dann anstellen das er die Ausführung für einen Moment
unterbricht? Denn die Schnittstelle muß ja erst komplett geschlossen werden um eine etwaige Ausnahme zu vermeiden. "Thorsten Doerfler" <t.doerfler_nospam*bdsw.de> schrieb im Newsbeitrag news:32991CBD-A87B-43B3-960A-30C0694E29AF*microsoft.com... > > "Falk Espenhahn" <spinosa*newsgroup.nospam> schrieb: >> ich möchte meine Anwendung für einen Moment unterbrechen und wenn ich das >> richtig verstehe kann ich das mit einem Timer tun. > > Nein. Ein Timer löst im eingestellten Intervall das Timer.Tick Ereignis > aus. In diesem kannst Du Deinen Code ausführen. > > Thorsten Dörfler |
|
#4
|
|||
|
|||
|
Hallo Falk,
Also: Wenn das Tick-Ereignis ausgelöst wird, dann wird natürlich Deine Schnittstellenroutine unterbrochen. Im Timer-Ereignis schaltest Du dann die Schnittstelle ab. Beste Grüße, Martin On 11.07.2008 22:16, wrote Falk Espenhahn: > wie kann ich es dann anstellen das er die Ausführung für einen Moment > unterbricht? Denn die Schnittstelle muß ja erst komplett geschlossen werden > um eine etwaige Ausnahme zu vermeiden. > > "Thorsten Doerfler"<t.doerfler_nospam*bdsw.de> schrieb im Newsbeitrag > news:32991CBD-A87B-43B3-960A-30C0694E29AF*microsoft.com... >> "Falk Espenhahn"<spinosa*newsgroup.nospam> schrieb: >>> ich möchte meine Anwendung für einen Moment unterbrechen und wenn ich das >>> richtig verstehe kann ich das mit einem Timer tun. >> Nein. Ein Timer löst im eingestellten Intervall das Timer.Tick Ereignis >> aus. In diesem kannst Du Deinen Code ausführen. >> >> Thorsten Dörfler > > |
|
#5
|
|||
|
|||
|
Ich benutzte das Tick Eriegnis eigentlich dazu mich mit der Schnittstelle
wieder zu verbinden, denn ich schließe die Schnittstelle wenn der fehlerhafte String erkannt wird und um ein vollständiges Schließen der Schnittstelle zu gewährleisten will ich eine gewisse Zeit verstreichen lassen bevor ich mich mit der Schnittstelle wieder verbinde. Und ich bin mir nicht sicher ob ein Tick Ereignis ausgelöst wird weil garnichts passiert. "Martin H." <hkshk*gmx.net> schrieb im Newsbeitrag news:48777258$1*127.0.0.1... > Hallo Falk, > > Also: Wenn das Tick-Ereignis ausgelöst wird, dann wird natürlich Deine > Schnittstellenroutine unterbrochen. Im Timer-Ereignis schaltest Du dann > die Schnittstelle ab. > > Beste Grüße, > > Martin > > On 11.07.2008 22:16, wrote Falk Espenhahn: >> wie kann ich es dann anstellen das er die Ausführung für einen Moment >> unterbricht? Denn die Schnittstelle muß ja erst komplett geschlossen >> werden >> um eine etwaige Ausnahme zu vermeiden. >> >> "Thorsten Doerfler"<t.doerfler_nospam*bdsw.de> schrieb im Newsbeitrag >> news:32991CBD-A87B-43B3-960A-30C0694E29AF*microsoft.com... >>> "Falk Espenhahn"<spinosa*newsgroup.nospam> schrieb: >>>> ich möchte meine Anwendung für einen Moment unterbrechen und wenn ich >>>> das >>>> richtig verstehe kann ich das mit einem Timer tun. >>> Nein. Ein Timer löst im eingestellten Intervall das Timer.Tick Ereignis >>> aus. In diesem kannst Du Deinen Code ausführen. >>> >>> Thorsten Dörfler >> >> > |
|
#6
|
|||
|
|||
|
Hallo Falk,
> ich möchte meine Anwendung für einen Moment > unterbrechen und wenn ich das richtig verstehe > kann ich das mit einem Timer tun. Nein, der Timer unterbricht nicht die Programmausführung. Der Timer löst einfach, nachdem er gestartet worden ist im Abstand von Timer.Interval das Ereignis Timer.Tick aus. In der Ereignisprozedur Timer_Tick kannst Du dann irgendwelchen Code ausführen. > Der Timer wird aktiviert indem ich die Enable Eigenschaft auf TRUE setzte Du kannst stattdessen auch einfach Timer.Start ausführen. > und je nach eingestellter Zeit wird eine Aktion ausgeführt Nach dieser Zeit (Timer.Interval) wird das Ereignis Timer.Tick ausgelöst. Das bedeutet, Code welcher in Deiner Sub Timer_Tick() steht wird ausgeführt. Das wiederholt sich solange, bis Du Timer.Stop oder Timer.Enabled = False machst. > nach dieser Zeit und das solange wie der timer aktiv ist nur > bei mir passiert nichts nachdem ich den Timer vermeintlich > aktiviert habe. Es passiert schon was. Eben das Timer.Tick - Ereignis wird ausgelöst. Hier mal ein Beispiel mit einem Windows.Forms.Timer. ' /// Code in einer leeren Form1 Public Class Form1 Private WithEvents mTimer As System.Windows.Forms.Timer Private Sub Form1_Load _ (ByVal sender As System.Object, _ ByVal e As System.EventArgs _ ) Handles MyBase.Load mTimer = _ New System.Windows.Forms.Timer mTimer.Interval = 1000 mTimer.Start() End Sub Private Sub mTimer_Tick _ (ByVal sender As Object, _ ByVal e As System.EventArgs _ ) Handles mTimer.Tick Me.Text = Now.Second.ToString End Sub Private Sub Form1_FormClosing _ (ByVal sender As Object, _ ByVal e As FormClosingEventArgs _ ) Handles Me.FormClosing mTimer.Stop() mTimer.Dispose() End Sub End Class ' \\\ E N T E Im Beispiel wird in Form_Load, also gleich nach dem Programmstart, der Timer mit einem Intervall von 1 Sek. gestartet. Mit jedem Eintreten des Eregnisses Timer.Tick wird der in der Sub Timer_Tick() stehende Code aus- geführt, der jeweils die akt. Sekunde in der Titelleiste der Form anzeigt. > Woran kann das liegen. Vermutlich daran, dass bei Dir in der Sub Timer_Tick kein Code steht. > Im konkreten Fall wird über eine serielle Schnittstelle > eine Zeichenkette gesendet Dein Ablauf ist mir nicht so recht klar. Du sendest also erst mal irgendeine Zeichenkette über Deine ser. Schnittstelle. > wenn sich in dieser Zeichenkette nicht bestimmte > Zeichen befinden Jetzt prüfst Du, ob sich in der bereits gesendeten Zeichenkette bestimmte Zeichen befinden. > soll die Schnittstelle geschlossen Falls in der bereits gesendeten Zeichenkette bestimmte Zeichen enthalten waren, schliesst Du die ser. Schnittstelle. Warum? > ein Timer aktiviert werden der auf 1000 Millisekunden > eingestellt ist Anschliessend startest Du einen Timer mit einem Intervall von 1 Sekunde > und nach dieser Zeit soll die Schnittstelle wieder geöffnet und nach Ablauf dieser Sekunde soll Deine ser. Schnittstelle wieder geöffnet werden? > und ein weiterer Versuch unternohmen werden mit > der übertragenen Zeichenkette. Welcher Versuch soll mit der bereits übertragenen Zeichenkette unternommen werden? > Bloß bei mir funktioniert das nicht. Aus Deiner Beschreibung lässt sich nicht erkennen, was Du wirklich machen möchtest. Ich vermute mal, Du hast sowohl die Funktionalität als auch die der ser. Schnittstelle falsch verstanden. Du solltest Dein Vorhaben mal etwas verständlicher beschreiben, insbesondere was genau Du mit Deiner ser. Schnittstelle machen möchtest. Zum Thema ser. Schnittstelle schau Dir vielleicht schon mal das Beispiel unter www.gssg.de -> Visual Basic -> VB.net -> Serial Port (RS232) Chat. Mit diesem Beispiel kannst Du Texte von einer ser. Schnittstelle zu einer anderen (entweder am gleichen oder auch an einem anderen Rechner) senden bzw. von der Gegenstelle empfangen. Gruß aus St.Georgen Peter Götz www.gssg.de (mit VB-Tipps u. Beispielprogrammen) |
|
#7
|
|||
|
|||
|
Der Anfang vom Ablauf war schon richtig. Die Ser. Schnittstelle wird
geöffnet. Eine angeschlossenes Messgerät sendet eine Zeichenkette an die Schnittstelle im DataRecieve Ereignis prüfe ich ob bestimmte Zeichen an einer bestimmten Stelle in der Zeichenkette vorkommen und zwar am Anfang der Zeichenkette. Wenn nicht schließe ich die Schnittstelle. Und ich habe mal gelesen bei nicht so flinken Rechner kann es sein das das Schließen der seriellen Schnittstelle eine gewisse Zeit dauern kann. Nun will ich solchen Rechnern die Zeit geben die Schnittstelle komplett zu schließen und erst nach ca. 1 Sek. einen erneuten Versuch starten um mich mit der Schnittstelle zu verbinden. Im folgenden habe ich mal die beiden Funktion reinkopiert Private Sub DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles serialPort.DataReceived Dim wert1 As String wert1 = serialPort.ReadTo(Chr(13) & Chr(10)) If InStr(wert1, "G.W.") Then Replace(wert1, " ", "") Else serialPort.DiscardInBuffer() Try serialPort.Close() Catch ex As Exception MsgBox(ex.ToString) End Try Me.Timer2.Enabled = True End If End Sub ------------------------------------------------------------------------------------------------------------------------------------------------------------- Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick Try With serialPort ..PortName = "COM1" ..BaudRate = UsR_BaudRate ..Parity = IO.Ports.Parity.None ..DataBits = UsR_DatenBits ..StopBits = IO.Ports.StopBits.One ..Open() ..ReceivedBytesThreshold = Me.CmbTreshold.Text End With Catch ex As Exception MsgBox(ex.ToString) End Try Timer2.Enabled = False End Sub Oben steht das DataReceive Ereignis von der seriellen Schnittstelle und unten das Timer.Tick Eriegnis.Der Timer ist auf 1000 Millisekunden eingestellt. Aber irgendwie geht nichts. Wenn ich den Timer über eine Schaltfläche aktivieredann funktioniert der Timer ansonsten nicht. Das Programm soll ja nur für eine Weile unterbrochen (angehalten) damit sich das Programm automatisch wieder an der Schnittstelle öffnen kann. "Peter Götz" <gssg_nospam*t-online.de> schrieb im Newsbeitrag news:uQvmCz24IHA.2072*TK2MSFTNGP04.phx.gbl... > Hallo Falk, > >> ich möchte meine Anwendung für einen Moment >> unterbrechen und wenn ich das richtig verstehe >> kann ich das mit einem Timer tun. > > Nein, der Timer unterbricht nicht die Programmausführung. > Der Timer löst einfach, nachdem er gestartet worden ist > im Abstand von Timer.Interval das Ereignis Timer.Tick > aus. In der Ereignisprozedur Timer_Tick kannst Du dann > irgendwelchen Code ausführen. > >> Der Timer wird aktiviert indem ich die Enable Eigenschaft > auf TRUE setzte > > Du kannst stattdessen auch einfach > > Timer.Start > > ausführen. > >> und je nach eingestellter Zeit wird eine Aktion ausgeführt > > Nach dieser Zeit (Timer.Interval) wird das Ereignis Timer.Tick > ausgelöst. Das bedeutet, Code welcher in Deiner > Sub Timer_Tick() steht wird ausgeführt. Das wiederholt sich > solange, bis Du Timer.Stop oder Timer.Enabled = False > machst. > > >> nach dieser Zeit und das solange wie der timer aktiv ist nur >> bei mir passiert nichts nachdem ich den Timer vermeintlich >> aktiviert habe. > > Es passiert schon was. > Eben das Timer.Tick - Ereignis wird ausgelöst. > > Hier mal ein Beispiel mit einem Windows.Forms.Timer. > ' /// Code in einer leeren Form1 > Public Class Form1 > Private WithEvents mTimer As System.Windows.Forms.Timer > > > Private Sub Form1_Load _ > (ByVal sender As System.Object, _ > ByVal e As System.EventArgs _ > ) Handles MyBase.Load > > mTimer = _ > New System.Windows.Forms.Timer > > mTimer.Interval = 1000 > mTimer.Start() > End Sub > > Private Sub mTimer_Tick _ > (ByVal sender As Object, _ > ByVal e As System.EventArgs _ > ) Handles mTimer.Tick > > Me.Text = Now.Second.ToString > End Sub > > Private Sub Form1_FormClosing _ > (ByVal sender As Object, _ > ByVal e As FormClosingEventArgs _ > ) Handles Me.FormClosing > > mTimer.Stop() > mTimer.Dispose() > End Sub > End Class > ' \\\ E N T E > > Im Beispiel wird in Form_Load, also gleich nach dem > Programmstart, der Timer mit einem Intervall von 1 Sek. > gestartet. Mit jedem Eintreten des Eregnisses Timer.Tick > wird der in der Sub Timer_Tick() stehende Code aus- > geführt, der jeweils die akt. Sekunde in der Titelleiste > der Form anzeigt. > > >> Woran kann das liegen. > > Vermutlich daran, dass bei Dir in der Sub Timer_Tick > kein Code steht. > > > Im konkreten Fall wird über eine serielle Schnittstelle >> eine Zeichenkette gesendet > > Dein Ablauf ist mir nicht so recht klar. > Du sendest also erst mal irgendeine Zeichenkette > über Deine ser. Schnittstelle. > >> wenn sich in dieser Zeichenkette nicht bestimmte >> Zeichen befinden > > Jetzt prüfst Du, ob sich in der bereits gesendeten > Zeichenkette bestimmte Zeichen befinden. > >> soll die Schnittstelle geschlossen > > Falls in der bereits gesendeten Zeichenkette > bestimmte Zeichen enthalten waren, schliesst > Du die ser. Schnittstelle. > > Warum? > >> ein Timer aktiviert werden der auf 1000 Millisekunden >> eingestellt ist > > Anschliessend startest Du einen Timer mit einem Intervall > von 1 Sekunde > >> und nach dieser Zeit soll die Schnittstelle wieder geöffnet > > und nach Ablauf dieser Sekunde soll Deine ser. > Schnittstelle wieder geöffnet werden? > >> und ein weiterer Versuch unternohmen werden mit >> der übertragenen Zeichenkette. > > Welcher Versuch soll mit der bereits übertragenen > Zeichenkette unternommen werden? > >> Bloß bei mir funktioniert das nicht. > > Aus Deiner Beschreibung lässt sich nicht erkennen, was > Du wirklich machen möchtest. Ich vermute mal, Du hast > sowohl die Funktionalität als auch die der ser. Schnittstelle > falsch verstanden. > > Du solltest Dein Vorhaben mal etwas verständlicher > beschreiben, insbesondere was genau Du mit Deiner > ser. Schnittstelle machen möchtest. > > > Zum Thema ser. Schnittstelle schau Dir vielleicht schon > mal das Beispiel unter > > www.gssg.de -> Visual Basic -> VB.net > -> Serial Port (RS232) Chat. > > Mit diesem Beispiel kannst Du Texte von einer ser. > Schnittstelle zu einer anderen (entweder am gleichen > oder auch an einem anderen Rechner) senden bzw. > von der Gegenstelle empfangen. > > Gruß aus St.Georgen > Peter Götz > www.gssg.de (mit VB-Tipps u. Beispielprogrammen) > > |
|
#8
|
|||
|
|||
|
"Falk Espenhahn" <spinosa*newsgroup.nospam> schrieb
> Der Anfang vom Ablauf war schon richtig. Die Ser. Schnittstelle wird > geöffnet. Eine angeschlossenes Messgerät sendet eine Zeichenkette an > die Schnittstelle im DataRecieve Ereignis prüfe ich ob bestimmte > Zeichen an einer bestimmten Stelle in der Zeichenkette vorkommen und > zwar am Anfang der Zeichenkette. Wenn nicht schließe ich die > Schnittstelle. Und ich habe mal gelesen bei nicht so flinken Rechner > kann es sein das das Schließen der seriellen Schnittstelle eine > gewisse Zeit dauern kann. Nun will ich solchen Rechnern die Zeit > geben die Schnittstelle komplett zu schließen und erst nach ca. 1 > Sek. einen erneuten Versuch starten um mich mit der Schnittstelle zu > verbinden. Abgesehen davon, dass du Option Strict einschalten solltest: Was funktioniert denn nicht? Wird Timer2_Tick nicht ausgeführt? Wird die Zeile "timer2.enabled = true" überhaupt erreicht? > If InStr(wert1, "G.W.") Then Wenn /was/ mit Instr ist? > Replace(wert1, " ", "") Replace ist eine Function. Armin |
|
#9
|
|||
|
|||
|
> Der Anfang vom Ablauf war schon richtig. Die Ser. Schnittstelle wird
> geöffnet. Eine angeschlossenes Messgerät sendet eine Zeichenkette an die > Schnittstelle im DataRecieve Ereignis prüfe ich ob bestimmte Zeichen an > einer bestimmten Stelle in der Zeichenkette vorkommen und zwar am Anfang > der Zeichenkette. Wenn nicht schließe ich die Schnittstelle. Und ich habe > mal gelesen bei nicht so flinken Rechner kann es sein das das Schließen > der seriellen Schnittstelle eine gewisse Zeit dauern kann. Nun will ich > solchen Rechnern die Zeit geben die Schnittstelle komplett zu schließen > und erst nach ca. 1 Sek. einen erneuten Versuch starten um mich mit der > Schnittstelle zu verbinden. Hallo Falk, kann es sein, das Du noch nicht allzuviel mit Schnittstellen gemacht hast? Normalweise verwendet man ein Protokoll für die Kommunikation um die Übertragung zu synchronisieren. Das hrißt es gibt einen Master und ein Slave(oder Talker und Listner). Der Master ist i.d.R. der PC und die angeschlossene Peripherie der Slave. Der Master fordert den Slave auf ihm Daten zu senden. Passiert das nicht oder die Daten sind unlesbar weiderholt der Master nach einer gewissen Zeit(Timeout) seine Anfrage. Nach bestimmten Kriterien und immerwieder auftretenden Fehlern wird dann die Verbindung aufgegeben und eine Message generiert, die User darauf aufmerksam macht, dass keine Verbindung zustande kam. Wie so ein Protokoll aufgebaut hängt von der Peripherie und steht normalerweise in der technischen Beschreibung der Peripherie, ansonsten beim Hersteller anfragen. Ohne Kenntnisse dieses Protokolls wird es nahezu unmöglich eine funktionierende Übertragung zu ermöglichen. Schleißen und öffnen der Schnittstelle während einer Verbindung führt defintiv zur Zerstörung des Datenfluss. solange Du Umwelteinflüsse die sich negativ auf die Verbindung auswirken ausschließen kannst und die Hardware ansonsten i.O. ist, brauchst Du Schnittstelle nur einmal öffnen und am Ende der Anwendung wieder schließen. Ein Timer wird lediglich dazu gebraucht um das Timeout zu erkennen. Schau Dir nochmal das Handbuch an, da steht bestimmt wie die Übertragung zu erfolgen hat. Ach mit Protokoll meine ich nicht bspw. die Einstellung 9600, 8, N , 1 oder sowas, das sind die Einstellungen für das Hardwareprotokoll. Ohne genaue Angaben und das Aussehen des "Software"-Protkolls kann man Dir so schlecht weiterhelfen, selbst wenn es nur um eine Testroutine geht. -- Gruß Scotty |
|
#10
|
|||
|
|||
|
Hallo Falk,
> Der Anfang vom Ablauf war schon richtig. Die Ser. > Schnittstelle wird geöffnet. Eine angeschlossenes > Messgerät sendet eine Zeichenkette an die Schnittstelle Das heisst also Du empfängst Daten. Dein ursprüngliches Posting hat den Eindruck erweckt, als würdest Du Daten senden. > im DataRecieve Ereignis prüfe ich ob bestimmte Zeichen > an einer bestimmten Stelle in der Zeichenkette vorkommen > und zwar am Anfang der Zeichenkette. Wenn nicht schließe > ich die Schnittstelle. Warum schliesst Du die Schnitstelle? > Und ich habe mal gelesen bei nicht so flinken Rechner kann > es sein das das Schließen der seriellen Schnittstelle eine > gewisse Zeit dauern kann. Wie lange das Schliessen der Schnittstelle dauert, ist in der Tat unterschiedlich, hat aber nicht nur was mit einer schnellen oder weniger schnellen Hardware zu tun. > Nun will ich solchen Rechnern die Zeit geben die Schnittstelle > komplett zu schließen Da die konkrete Zeit nicht bekannt ist, macht es auch wenig Sinn, mit starren Zeitspannen arbeiten zu wollen. Die Abläufe an einer Schnittstelle (nicht nur an der ser. Schnittstelle) regelt man sinnvollerweise per Ereignissteuerung und durch Statusabfragen. > und erst nach ca. 1 Sek. einen erneuten Versuch starten > um mich mit der Schnittstelle zu verbinden. Es macht überhaupt keinen Sinn, die ser. Schnittstelle in diesem Zusammenhang ständig zu öffnen, wieder zu schliessen und gleich wieder zu öffnen. 1.) Öffne Deine Schnittstelle, wenn Du das erste mal Daten auf dieser Empfangen willst. 2.) Empfange Daten von der Schnittstelle indem Du auf das Ereignis DataReceived reagierst. 3.) Schliesse die Schnittstelle erst wieder, wenn Du keine weiteren Empfangsdaten mehr erwartest. > Im folgenden habe ich mal die beiden Funktion reinkopiert > > Private Sub DataReceived(ByVal sender As Object, ByVal e As > System.IO.Ports.SerialDataReceivedEventArgs) > Handles serialPort.DataReceived > > Dim wert1 As String > > wert1 = serialPort.ReadTo(Chr(13) & Chr(10)) > > If InStr(wert1, "G.W.") Then > > Replace(wert1, " ", "") Was soll dieses Replace? Ohne den Rückgabewert von Replace zu verwerten ist diese Befehlszeile sinnlos. > > Else > > serialPort.DiscardInBuffer() > > Try > > serialPort.Close() Wozu dieses Close? > > Catch ex As Exception > > MsgBox(ex.ToString) > > End Try > > Me.Timer2.Enabled = True Dieser Timer ist völlig überflüssig, wenn die Schnittstelle sinnvollerweise solange geöffnet bleibt, wie sie auch in Benutzung ist. > End If > > End Sub > > -------------------------------------------------------------------------- ---------------------------------------------------------------------------- ------- > > Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As > System.EventArgs) Handles Timer2.Tick > > Try > > With serialPort > > .PortName = "COM1" > > .BaudRate = UsR_BaudRate > > .Parity = IO.Ports.Parity.None > > .DataBits = UsR_DatenBits > > .StopBits = IO.Ports.StopBits.One > > .Open() > > .ReceivedBytesThreshold = Me.CmbTreshold.Text > > End With > > Catch ex As Exception > > MsgBox(ex.ToString) > > End Try > > Timer2.Enabled = False > > End Sub s.oben: Diese ganze Timergeschichte ist überflüssig, wenn Du sinnvollerweise Deine Schnittstelle erstmalig z.B. beim Programmstart öffnest und sie erst dann, wenn sie nicht mehr benötigt wird, z.B. beim Programmende, wieder schliesst. Da Du Deine Kommunikation zwischen Deinem Messgerät offenbar ohne Protokoll abwickelst, birgt das Schliessen der Schnittstelle ja auch die Gefahr, dass Du vom Messgerät gesendete Daten gar nicht mitbekommst, weil die ser. Schnittstelle gerade geschlossen ist. > Oben steht das DataReceive Ereignis von der seriellen > Schnittstelle und unten das Timer.Tick Eriegnis.Der > Timer ist auf 1000 Millisekunden eingestellt. Aber > irgendwie geht nichts. Was heisst "irgendwie geht nichts"? Hast Du mal geprüft, ob Dein Sub DataReceived überhaupt aufgerufen wird? Solange dies nicht der Fall ist, wird natürlich auch Dein (ohnehin überflüssiger) Timer nicht gestartet. > Wenn ich den Timer über eine Schaltfläche aktivieredann > funktioniert der Timer ansonsten nicht. Der Fehler ist sicher nicht beim Timer zu suchen, sondern eben in Deinem Programmablauf. Sprich, Du musst erst mal prüfen, ob Deine Sub_DataReceived, in welcher der Timer gestartet wird, überhaupt aufgerufen wird. > Das Programm soll ja nur für eine Weile unterbrochen > (angehalten) Warum willst Du denn Dein Programm anhalten? > damit sich das Programm automatisch wieder an der > Schnittstelle öffnen kann. Das Programm kann sich sicher nicht an der Schnittstelle öffnen. Du meinst vermutlich, das Programm soll Deine Schnittstelle wieder öffnen. Wenn Du eine Kommunikation zwischen Deinem PC und einem via ser. Schnittstelle angeschlossenen externen Gerät realisieren willst, ist es sinnvoll erst mal zu überlegen, wie, sprich nach welchen Regeln, diese Kommunikation ablaufen soll. Ein solches Regelwerk nennt man "Übertragungsprotokoll". Dabei kann vereinbart werden, dass eine Datenübertragung immer nur von einer Seite aus angestossen wird. Die Gegenstelle reagiert dann jeweils immer nur auf einen solchen Anstoss. Es gibt aber auch Protokolle, bei denen jede Seite gleichberechtigt eine Datenübertragung einleiten kann. Ob überhaupt und wenn ja welches Protokoll zum Einsatz kommen kann, hängt vor allem von den Fähigkeiten Deines Messgerätes ab. Du solltest mal in der Dokumentation zu diesem Gerät nachsehen, ob und wenn ja, welches Übertragungsprotokoll dieses Gerät beherrscht. Ein solches Übertragungsprotokoll sieht im wesentlichen so aus: A sendet Nachricht an B, dass eine Nachrichtenübertragung stattfinden soll. B quittiert diese Aufforderung durch eine entspr. Quittungsnachricht an A und/oder beginnt mit dem Senden von Daten (z.B. Messdaten). A quittiert den Empfang der von B gesendeten Daten, wenn alle Daten fehlerfrei und vollständig empfangen worden sind durch eine Gut-Quittung (Ack). Sind die empfangenen Daten fehlerhaft oder unvollständig angekommen, quittiert A den Empfang mit einer Schlecht-Quittung (Nak), was für die Gegenstelle bedeutet, dass sie die zuletzt gesendeten Daten nochmal senden muss. Ein solches Protokoll vereinbart in der Regel auch eine max. Zeitspanne, in der eine Quittung empfangener Daten erfolgen muss (TimeOut). Wird diese Zeit überschritten, bedeutet dies, für den auf die Quittung Wartenden, dass er seine letzte Nachricht nochmal senden muss, da sie offenbar bei der Gegenstelle nicht angekommen ist. Gruß aus St.Georgen Peter Götz www.gssg.de (mit VB-Tipps u. Beispielprogrammen) |
|
|
|
|
![]() |
| Themen-Optionen | |
| Ansicht | |
|
|
Ähnliche Themen
|
||||
| Thema | Erstellt von | Forum | Antworten | Letzter Beitrag |
| Timer | Peter Schürer | Newsgroup microsoft.public.de.excel | 4 | 01-20-2009 04:55 PM |
| Timer ohne Timer-Control | Herrmann Müller | Newsgroup microsoft.public.de.vb | 4 | 11-14-2008 12:10 PM |
| Timer | Norbert Stellberg | Newsgroup de.comp.lang.delphi.misc | 3 | 09-05-2008 03:41 PM |
| timer.enabled vs. timer.start() | Andreas Hohn | Newsgroup microsoft.public.de.german.entwickler.dotnet.vb | 5 | 08-25-2008 05:15 PM |
| Timer | Andi | Newsgroup microsoft.public.de.vb | 1 | 06-18-2008 11:57 PM |