mikrocontroller.net

Forum: PC-Programmierung Bytes senden mi Visual Basic 2005 Express


Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo. Ich habe folgendes Problem.

In Temp ist eine Zahl die auf High und Low Byte aufgeteilt wird.
Diese wird in einem Array gespeichert.

   Dim Zahl(8) As Integer
   Dim Temp as Integer

   Zahl(0) = Int(Temp / 256)
   Zahl(1) = Temp Mod 256

zB steht in Zzahl(0) eine 1 und in Zahl(1) eine 144. Nun will ich diese 
Seriell an meinen µC übertragen. Zahl(0) als ein Byte und Zahl(1) als 
zweites Byte. Wenn ich dies zB it einer Schleife erledige:

   While i <= 7
   SerialPort1.Write(Zahl(i))
   i = i + 1
   End While

empfange ich 0x31 0x31 0x34 0x34, als den ASCII Wert der jeweiligen 
Zahl. Ich will aber den reinen Zahlenwert senden. Also für die 1 eine 
0x01 und für die 144 eine 0x90.

Wie kann ich dies erreichen?

Gruß Matthias

Autor: Klaus Kehrer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Matthias,
arbeite mit Byte-Array. Bitte beachte, das bei VB2005 Express ein int
32 bit und nicht 16 breit ist.

Du könntest wie folgt vorgehen:

   Dim Zahl(8) As Byte
   Dim Temp as short

   Zahl(0) = Int(Temp \ 256)  ' Temp / 256 ist nicht korrekt
                              '   Dim a As Byte = CByte(1000 / 256) 
liefert 4
                              '   Dim b As Byte = CByte(1000 \ 256) 
liefert 3
   Zahl(1) = Temp Mod 256
   ...

   SerialPort1.Write(Zahl, 0, Zahl.Length) ' sende das Array Zahl

Bye Klaus

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK.
Danke so fnktionierts einwandfrei.

Ich hätte noch eine Frage.

Vom  µC sende ich in bestimmten Intervallen einen String zurück. Wie 
muss ich vorgehen damit VB den String empfängt sobald er ankommt. Ich 
will also Werte empfangen und in einem Label darstellen sobald etwas 
angekommen ist.

Guß Matthias

Autor: Klaus Kehrer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!
''Vom  µC sende ich in bestimmten Intervallen einen String zurück.
Ich gehe davon aus, das Dein µC aktive und nicht auf Grund einer Anfrage
Deiner VB-Anwendung sendet. Das heißt aber auch, das Du für die
Empfangsbereitschaften von VB sorgen musst. Ist dieses gewährleistet ?

''Wie muss ich vorgehen damit VB den String empfängt sobald er ankommt.
1. VB muss wissen, wann der String komplett angekommen ist.
   Beispiele:
   - Der String hat IMMER ein bestimmt Länge von n Zeichen
   - Das String-Ende ist IMMER ein bestimmtes Zeichen(z.B ETX = 0x03)
2. VB überprüft im DataReceived-Event, ob der komplette String 
angekommen
   ist. Ist das der Fall, dann gibt es mehrere Möglichkeiten:
   - Direkte Verwendung/Bearbeitung im DataReceived-Event
     Bearbeite den String direkt im DataReceived-Event
     (z.B in eine Textbox schreiben, in Stücke hacken, ... )
   - Trennen von Daten-Empfang und Daten-Verarbeitung
     Es wird ein Event (z.B. StringIstDa) ausgelöst und der String als
     Parameter mitgegeben. StringIstDa liefert Dir automatisch den neuen
     String.
3. Fehlerhafte Datenübertragung, Verbindungsabbrüche, ..
   Ein großes weites und gemeines Thema ...

Wie du bei Punkt 2 vorgeht willst, ist reine Geschmacksache.
Kläre vor allem Punkt 1. Ohne den geht es nicht.

Bye
Klaus

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Genau, der µC ist bei mir der Master, da hab ich mehr Erfahrung. Er 
sendet im 2s Rythmus Daten zum PC. Die Daten haben dabei immer eine 
feste Länge von 12 Byte.
Am PC angekommen muss der empfanene String aufgeteilt und mit nem faktor 
multipliziert werden bevor er angezeigt werden kann.

Gruß Matthias

Autor: Klaus Kehrer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
kann ich davon ausgehen, das die VB-Anwendung nur Daten empfangen aber
niemals Daten senden kann ?
(Sonst müssest Du Kollision- und Deadlock-Probleme beim gleichzeitigen 
Senden von VB und µC rechnen )

Bye
Klaus

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm,
naja dann scheint es ja doch nicht ganz so einfach zu sein wie ich mir 
das dachte.
VB muss Daten senden sowie empfangen können, mein µC misst die IST - 
Temperaturen die ich in VB visualisieren will und bekommt vom PC die 
SOLL - Temperaturen auf die er regeln soll.

Allerdings will ich nur senden nachdem ich eine Taste drücke.

Kann ich mich da vielleicht mit etwas wie:

1)  Wenn Taste gedrückt und gerade nichts empfangen wird, dann   senden, 
sonst warten bis Daten fertig übertragen.

2) Oder ich warte, wenn Daten gesendet werden sollen, bis ich vom µC was 
empfange und sende danach die Daten. Dann hab ich ja genug Zeit zum 
senden.

behelfen?

Gruß Matthias

Autor: Klaus Kehrer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
beide Vorschläge ist zwar machbar, ich würde Sie aber nicht empfehlen.

Für so eine Anwendung würde ich die VB-Anwendung als Master aufbauen und
Deinen µC als Slave.

Der Aufbau könnte wie folgt sein:
 - Temperaturabfrage wird durch einen Timer gesteuert
 - Protokollvorschlag
   Read:
    Anfrage von VB:
         EOT <Code des oder der Parameter> ENQ
    Antwort des µC:
         NAK  für kenne ich nicht oder Fehler
         EOT <Code des oder der Parameter><Datenlänge>STX<DATEN>ETX

   Write:
    Daten von VB  :
          EOT <Code des oder der Parameter><Datenlänge>STX<DATEN>ETX
    Antwort des µC:
          NAK  für kenne ich nicht oder Fehler
          ACK  für Wert übernommen.

   Der Ablauf erfolgt immer im Handshake.
   Vb sende eine etwas und wartet eine gewisse Zeit die Antwort ab.
   Sobald der timeout zu schlägt, geht vb von einer 
Leitungsunterbrechung
   aus.

   Der µC antwortet nur auf korrekte Read/Write Pakete. Alles andere
   ignoriert er. Der

Noch eine Frage. Hast Du schon mal in VB6 oder VB 2005 programmiert ?

Bye
Klaus

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Klaus.

Danke für deine Antwort, hört sich sehr solide und logisch an, dein 
Vorschlag.

Ich mache gerade meine ersten Schritte in VB. Ich hab ein µC System 
entworfen und wollte eigentlich nur kurz noch eine einfache Oberfläche 
für den PC machen.

Das ganze im µC zu realisieren wäre für mich auch kein Problem, 
allerdings sieht es in VB ganz anders aus. Da kämpfe ich gerde noch 
damit meine gesendeten Daten überhaupt empfangen zu können.

Gruß Matthias

Autor: Klaus Kehrer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Matthias,

dann empfehle ich Dir das folgende Buch:
 Michael Kofler, Visual Basic 2005, Addison-Wesley

Die Denkweise ist in VB komplett anders als bei einem µC.
Daran musst Du Dich (leider) gewöhnen.

Ein Beispiel:
Wenn Du bei Deinem µC ein Integer definierst
   int Zahl;
dann sind das einfach 16 auf einander folgende Bits, die irgendwo
im Speicher abgelegt sind.

Wenn Du bei Vb ein Integer definierst
   Dim Zahl as Integer
dann ist das etwas, was
  - eine maximale Obergrenze hat:  Zahl.MaxValue(),
  - eine minimale Untergrenze hat: Zahl.MinValue(),
  - in einem String umgewandelt werden kann: Zahl.ToString(),
  - mit einer anderen Zahl (Zahl1) verglichen werden
    kann: Zahl.CompareTo(Zahl1)
  - usw.

Wenn man sich einmal daran gewöhnt hat, dann ..... :-))


Bye
Klaus

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Klaus.

Das werd ich mir dann mal anschauen. Allerdings brauche ich jetzt eine 
Lösung, die wenigstens funktioniert, damit ich das Projekt zumindest 
vorerst schließen kann.

Ich denke ich versuche mir das so wie schon angedacht zu realisieren.

Ich warte in VB bis ich etwas empfange:

Dim value As String
  While value = 0
      value = SerialPort1.BytesToRead
  End While

Mein µC sendet mit reine Zahlenwerte, immer 12 Byte, 2 
aueinanderfolgende werden zur Temperatur verrechnet. Allerdings empfange 
ich mit:

value = SerialPort1.ReadExisting

nur wirre Zeichen, da VB wahrsceinlich diese als ASCII zeichen 
interpretiert. Was mich jedoch nicht weiterbringt, da ich den Zahlenwert 
von jedem Byte brauche.

Wie kann ich den Zahlenwert der einzelnen Bytes erhalten?

Zudem wäre es mir lieber jedes empfangene Byte in einem Array zu 
speichern, damit ich zur Berechnung besser darauf zugreifen kann.
Kannst du mir da bitte noch mal weiterhelfen.

Danach will ich dann den eingegebenen Wert von VB zum µC senden.

Ist zwar nicht so elegant wie deine Lösung, aber mir fehlt einfach die 
Zeit dazu.

Wenn ich diese Variante hinbekommen könnte wär ich schon mal glücklich.

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
SerialPort hat eine Read-Methode der man Byte-Arrays übergeben kann...

Wenn doch noch mit Events gearbeitet werden soll, daran denken das der 
Event in einem separaten Thread ausgeführt wird...

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, danke.

Ich hab die Funktion gefunden. Ist ja eigentlich echt sehr einfach, wenn 
man sich auskennt.

Mittlerweile funktioniert alles so ich wie ich es geplant hatte.

Danke.

Gruß Matthias

Autor: Klaus Kehrer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Matthias
hier ist eine quick and dirty Lösung:

SerialPort1_DataReceived(): daten vom seriellen Port lesen
Send(): Daten versenden
Open(): Öffenen des Ports
Init_SerialPort(): Init des serielen Ports
Close erfolgt durch SerialPort1.Close()




Private Sub SerialPort1_DataReceived(ByVal sender As Object, _
                              ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles mRs232.DataReceived

    Dim aIData() As Byte                                            ' Buffer für ankommende Daten
    Dim enc As System.Text.Encoding = System.Text.Encoding.UTF8     ' 8-Bit encoding einastellen

    Static Dim IncommingData as String        ' IncommingBuffer
    IncommingData += mRs232.ReadExisting      ' Alle angekommenen Daten einlesen

        Try
           if IncommingData.Length >= 12
              aIData = enc.GetBytes(IncommingData)  ' ByteArray herstellen  
              IncommingData = ""          ' IncommingBuffer leeren

              Deine_Verarbeitungs_Function(aIData)  ' Dein Job
           end if

        Catch ex As Exception
           'todo: Errorhandling
        End Try
End Sub

Private Sub Init_SerialPort()

  with SerialPort1
     .Close()
           '.BaudRate = Deine Baud Rate
           '.Parity = Deine Parity
           '.StopBits = Deine StopBits
           '.DataBits = Deine DataBits

           .DiscardNull = False
           .Handshake = Handshake.None
           .ParityReplace = 63           ' "?"

           .ReceivedBytesThreshold = 1    ' jedes ankommende Zeichen wird sofort eingelesen 
           .Encoding = Encoding.UTF8


           .DtrEnable = False
           .ReadBufferSize = 4096
           .WriteBufferSize = 4096

           .DiscardInBuffer()
           .DiscardOutBuffer()

   
  end with
   
End Sub

Public Sub Open()
    If SerialPort1.IsOpen = False Then
        Try
           SerialPort1.Open()
           SerialPort1.DiscardInBuffer()
           SerialPort1.DiscardOutBuffer()

        Catch ex As Exception
            ' Fehlermöglichkeiten: 
            ' 1. ComPort nicht vorhanden
            ' 2. ComPort vorhanden, aber Zugriff verweigert (Jemand anderes verwendet ihn gerade.)
            ' 3. sonstige Fehler
        End Try
    End If

End Sub

Private Sub Send(Byval vData as integer)
  Dim aSendData(4) as byte
        Try

           with SerialPort1
           
               aSendData(3) = vData mod 256
               vData = vData \ 256

               aSendData(2) = vData mod 256
               vData = vData \ 256
  
               aSendData(1) = vData mod 256
               vData = vData \ 256

               aSendData (0) = vData

              .DiscardInBuffer()    ' Löschen der Buffer
              .DiscardOutBuffer()    ' 

              .Write(aSendData, 0, aSendData.Length) ' versenden
           End with

        Catch ex As Exception
            ' Todo: Error 
        End Try

End Sub

Ich habe nicht mit vb getestet. Vielleicht hilft sie Dir.




Bye
Klaus

Autor: Klaus Kehrer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
da gab es wohl gerade ne Überschneidung :-))

Klaus

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Klaus.

Danke für deine ausführliche Hilfe. Sie hat mir ach noch weitergeholfen, 
denn:

Ich warte solange bis alle 12 Byte empfangen wurden, lese dann alle ein, 
verarbeite sie  und stell sie dar, dann sende ich. Das ganze mache ich 
praktisch in einer Endlosschleife.
Das heißt, sobald etwas empfangen wurde wird das ganze angestoßen. Nur 
hat das bisher nicht funktioniert, dank deinem Vorschlag von oben, weiß 
ich jetzt auch warum. Ich dachte der Eingangspuffer wird automatisch 
gelöscht, wenn ich ihn einlese!
Da ich ihn nicht gelöscht habe, war er ja praktisch immer voll und VB 
ist mit voller Geschwindigkeit wieder und wieder durch s Programm 
gegangen.


Danke für deine hilfe

Gruß Matze

Autor: Klaus Kehrer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Matze,
das kenne ich doch irgend woher ... !
Damals, im Jahre 1836, als ich mit VB anfing, ....

:-))
Klaus

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.

Ich hab doch noch mal eine Frage:

Ich hab bei dem obigen Thema nun die Buffer gelöscht, jedoch 
funktioniert es immer noch nicht, dass VB wartet bis ich etwas neues 
empfange.

Meine Vorgehensweise:

Buttom aktiviert das ganze

do
  While SerialPort1.BytesToRead <= 12
  End While    'soll hier solange verweilen bis 12 Bytes empfangen 
wurden

'  dann kommt empfangsroutine
'  Verarbeitunng
'  Einlesen der Felder
'  umrechnen
'  senden der Daten

   SerialPort1.DiscardInBuffer()
   SerialPort1.DiscardOutBuffer()   'löschen der Puffer
loop

VB soll warten bis es etwas empfängt, dann alles abarbeiten und dann 
wieder warten bis was neues empfangen wurde.

Kann mir jemand weiterhefen?

Gruß Matze

Autor: Bobby (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> do
>>  While SerialPort1.BytesToRead <= 12

Du wartest also bis 13 Zeichen da sind...

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein eigentlich will ich nur 12 Zeichen empfangen.

Aber acuh wenn ich

  do
    While SerialPort1.BytesToRead <= 11

daraus mache, funktioniert es nicht.

Wartet VB an der Stelle nicht, oder was passiert da?

Autor: Bobby (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bin nicht so der VB-Experte, aber:

Während der Warterei werden die Events nicht ausgewertet.
Also kann sich auch der abgefragte Wert nicht ändern.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
HASt du vieleicht einen Vorschlag wie ich dann warten kann bis etwas 
empfangen wurde?

Gruß Matze

Autor: Klaus Kehrer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
setze
  SerialPort1.ReceivedBytesThreshold = 12,
dann meldet sich der DataReceived Event, wenn 12 Zeichen da sind.

Nachteil:
  wenn nach dem 11 Zeichen eine Leitungs- oder Sende-Unterbrechung 
erfolgt,
  dann wartest Du bis .... (DeadLock).

Lösungsmöglichkeit:
baue einen Timer ein, der mit dem Empfang des 1.Zeichen startet.
Das TimeOut musst Du geeignet wählen (z.B 100ms)

Fall 1.:
Die 12 Zeichen sind vor dem Ablauf des TimeOuts angekommen.
Dann Timer stoppen, Daten auswerten, usw.

Fall 2.:
Der Timer Event schlag zu, bevor die 12 Zeichen angekommen sich.
Dann geeignet auf diesen ERROR reagierten,
z.B. evtl. angekommene Daten verwerfen, ...


Bitte beachte noch etwas:

Arbeite nicht mit Konstrukten wie
  While SerialPort1.BytesToRead <= 12
    ....
  End While
um die ankommenden Daten abzufangen.

Die ankommenden Daten liefert Dir der DataReceived Event.(Dazu ist er da 
!!)

Ändere ggf. .ReceivedBytesThreshold. Wenn Du es z.B auf 1 setzt,
dann feuert DataReceived bei jedem Zeichen. Diese einzelnen Zeichen 
musst
Du nur noch geeignet übernehmen.


Bye
Klaus

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Klaus.

Könntest du mir bitte etwas genauer schreiben, wie ich den 
DataRecieveEvent imlementieren kann!

Wäre dir echt sehr dankbar.

Gruß Matze

Autor: Klaus Kehrer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

den DataReceived findest Du oben im Beispiel:
Private Sub SerialPort1_DataReceived(....) Handles mRs232.DataReceived

Stelle .ReceivedBytesThreshold auf 1 und schaue Dir das ganze im 
Debug-Mode
an.

Bye
Klaus

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dabei bekomme flogenden Fehler:

Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, 
ByVal e As System.EventArgs) Handles mRs232.DataReceived

-->Fehler  1:  Die Handles-Klausel erfordert eine WithEvents-Variable, 
die im enthaltenden Typ oder einem seiner Basistypen definiert wird.

Autor: Klaus Kehrer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmmm,
poste mal Deinen Code.

Bye
Klaus

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Public Class Form1

    Dim Temperatur1 As Short
    Dim Temperatur2 As Short
    Dim Temperatur3 As Short
    Dim Temperatur4 As Short
    Dim Zeichenkette(8) As Byte
    Dim empfangen(13) As Byte
    Dim i As Integer = 0

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles MyBase.Load
        SerialPort1.Open()      'serielle Schnittstelle öffnen

        ' ************************************************
        '               Empfänger
        ' ************************************************

        if i == 11 then

  'rechnet die Ist - Temperaturen aus und stellt in Label dar
        Label13.Text = ((empfangen(1) * 256) + (empfangen(0))) * 0.0625
        Label14.Text = ((empfangen(3) * 256) + (empfangen(2))) * 0.0625
        Label15.Text = ((empfangen(5) * 256) + (empfangen(4))) * 0.0625

        Label16.Text = ((empfangen(7) * 256) + (empfangen(6))) * 0.0625
        Label11.Text = ((empfangen(9) * 256) + (empfangen(8))) * 0.0625
        Label12.Text = ((empfangen(11) * 256) + (empfangen(10))) * 
0.0625



        ' ************************************************
        '                   Sender
        ' ************************************************

        ' gewünschte Werte auslesen und mit Faktor multiplizieren
        Temperatur1 = ((Val(TextBox1.Text)) / 0.0625)
        Temperatur2 = ((Val(TextBox2.Text)) / 0.0625)
        Temperatur3 = ((Val(TextBox3.Text)) / 0.0625)
        Temperatur4 = ((Val(TextBox4.Text)) / 0.0625)

        'teilt die Temperaturen in 2 Byte auf
        Zeichenkette(1) = Int(Temperatur1 \ 256)
        Zeichenkette(0) = Temperatur1 Mod 256
        Zeichenkette(3) = Int(Temperatur2 \ 256)
        Zeichenkette(2) = Temperatur2 Mod 256
        Zeichenkette(5) = Int(Temperatur3 \ 256)
        Zeichenkette(4) = Temperatur3 Mod 256
        Zeichenkette(7) = Int(Temperatur4 \ 256)
        Zeichenkette(6) = Temperatur4 Mod 256


        ' sende das Array Zeichenkette
        SerialPort1.Write(Zeichenkette, 0, Zeichenkette.Length)

        ' löschender Ein- und Ausgangspuffer
        SerialPort1.DiscardInBuffer()
        SerialPort1.DiscardOutBuffer()

  else
    'noch keine 12 Bytes empfangen

  End if
    End Sub



     'Das Stück Code dass diesen Fehler verursacht
     Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, 
ByVal e As System.EventArgs) Handles mRs232.DataReceived
       empfangen(i) = SerialPort1.ReadByte()
       i = i + 1
     End Sub

End Class













    End Sub

End Class

Autor: Vedi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen!

Ich möcht das mein VB Programm, mir immer den Status von XOFF und XON 
anzeigt. Wie muss ich das realisieren?
Hoffe das mir jemand weiter helfen kann.

Grüße Vedi

Autor: Klaus Kehrer (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi Matthias,
ich komme erst jetzt dazu, Dir zu antworten.

Schau dir mal den beiliegen Code an.
Ich konnte Ihn leider nicht austesten. Mir fehlt Deine Anwendung.

Bye
Klaus

Autor: Klaus Kehrer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Vedi,
was bezeichnet Du als Status von XOFF und XON ?
Arbeitest Du mit VB6 oder VB2005 ?
Bye
Klaus

Autor: Vedi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Klaus,

ich arbeite mit VB6. Ich habe bei mir auf meiner Oberfläche unteranderen 
Zwei Label mit XOFF und XON falls jetzt XON aktiv ist soll es rot 
aufleuchten wenn  XOFF aktiv ist wird XON wieder schwarz und XOFF rot.

Ich weis nicht wie ich den Zustand von beiden abfragen soll.

Für CTS und DSR gibt es den Befehl DSRHolding und CTSHolding und das ist 
kein Problem aber für XON und XOFF komm ich einfach nicht weiter.

Vielen Dank Klaus für dein Interesse.

Grüße Vedi

Autor: Klaus Kehrer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Vedi,
Du kannst die Property PortOpen verwenden.
Etwa in der folgenden Art:
If MSComm1.PortOpen = True Then
   Label_XON.BackColor = vbRed
   Label_XOFF.BackColor = vbBlack
Else
   Label_XON.BackColor = vbBlack
   Label_XOFF.BackColor = vbRed
End If

Bye Klaus

Autor: Vedi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank Klaus.

Hab es gerade ausprobiert. Wenn XON aktiv ist also am Start des 
Programms den funktioniert es mit XON rot einblenden. Aber das XOFF 
funktioniert nicht.

Habe heute morgen die funktion aus einer vbcom32.DLL gefunden:

If modDLL.ComGetXOutFlow(1) = True Then
    lblXOFF.ForeColor = vbRed
    lblXON.ForeColor = vbBlack
Else
    lblXON.ForeColor = vbRed
    lblXOFF.ForeColor = vbBlack
End If

Aber genau das gleiche Problem wie bei PortOpen erkennt den wechsel 
nicht.
Vielen vielen Dank das du mir Hilfst!!!

Grüße Vedi

Autor: Klaus Kehrer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Vedi,
diese dll kenne ich leider nicht.
Wo hast Du die denn her ?

Bye
Klaus

Autor: Vedi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Klaus,

Hier ist der Link http://www.visualbasic.at/old/downloads/VBCom32.html

Grüße Vedi

Autor: Vedi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Klaus

Ich weis nicht ob der Befehl mir der (1)

If modDLL.ComGetXOutFlow(1) = True Then

überhaupt richtig ist.

Ich weis nicht was für ein Parameter für (BYVAL hCOM AS LONG) rein muss.

Private Declare Function ComGetXOutFlow Lib "vbcom32" _
(BYVAL hCOM AS LONG) AS LONG


Grüße Vedi

Autor: Klaus Kehrer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Vedi,
nach der Beschreibung von der vbcom32.DLL habe ich folgendes 
herausgefunden:
- Der Com-Port wird IMMER mittels eines s.g. Handles angesprochen.
  - Diesen Handle bekommst Du durch die Funktion "ComOpen"
    geliefert (siehe Beschreibung vbcom32).
  - Der Handle muss bei jeder Funktion angegeben werden (ohne Handle 
keine
    Kommunikation).
    Beispiel:
    hCOM = ComOpen("1;9600;7;1;1")

  - Die Abfrage nach der XOFF - Flow Control ist dann :
      If modDLL.ComGetXOutFlow(hCOM) = True Then
         ....
      end if

Wie die Flusskontrolle dll-intern behandelt wird, weis ich nicht.
Mehr findest Du in der Beschreibung der dll.

Bye
Klaus

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.