www.mikrocontroller.net

Forum: PC-Programmierung mscomm macht Fehler


Autor: Burns B. (fox1707)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
(Oder ich mache die Fehler)

Hat jemand Erfahrung mit dem MSCOMM Control?

Ich sende vom Mikrocontroller Daten über die serielle Schnittstelle und 
fange diese im Excel ab.

InputLen = 1

Excel untersucht jedes Zeichen:
Zeichen = ;  ==> nächste Spalte
Zeichen = Z  ==> warte auf Zeilennr.
Zeichen = E  ==> Ende Port schließen

Das HTerminal zeichnet die Daten einwandfrei auf:
Z001;025;026;027;028;039:030;
Z002;025;026;027;028;039:030;
Z003;025;026;027;028;039:030;
Z004;025;026;027;028;039:030;E

Mein Problem ist, dass Excel in manchen Feldern nach dem Wert ein 
Symbol (kleines Quadrat) anhängt. Da der Wert im Excel 
weiterverwendet wird ist dieser dann unbrauchbar.

Hat jemand eine Idee oder kennt eine Verbesserung???

Autor: ahnungslos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Fehler ist in Zeile 48 deines Programms...

Das Symbol (kleines Quadrat) bedeutet, dass ein Wert empfangen wurde, zu 
dem es kein Zeichen gibt (z.B. Steuerzeichen).

Erster Tip: Überprüfe mal deine Baudraten. Insbesondere die Fehlerquote 
vom µC (Taktfrequenz, Quarz ja/nein, ...)

Autor: Burns B. (fox1707)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Fehler beträgt 0,2%. (8Mhz ---> 9600Baud)

Habe herausgefunden, wenn ich nach einem gesendten Zeichen ein 
delay_ms(5) mache, dann ignoriert Excel das Zeichen.

Benutze folgende Einstellung im MSCOMM:

AutoLoad       1
DTREnable      True
EOFEnable      True
Handshaking    0
InBufferSize   1024
InputLen       1
InputMode      0
NullDiscard    False
ParrityReplace ?
Placement      2
RThreshold     1
RTSEnable      False
Settings       9600,n,8,1

Ich vermute den Fehler in der MSComm-Einstellung, da es im Terminal nie 
Probleme gibt.

Autor: kosti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
würdest du dein Macro hier reinstellen?

Autor: Burns B. (fox1707)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Private Sub MSComm1_OnComm()
    Dim zeile As Integer
    Dim spalte As Integer
    
    
Select Case MSComm1.CommEvent
        Case comOverrun:   MsgBox "Datenverlust! Overrun"
        Case comRxOver:    MsgBox "Datenverlust! RxOver"
        Case comEvReceive           
        
            
Abfrage:    RxInput = MSComm1.Input
           
        If RxInput = ";" Then
            spalte = Worksheets("Programm").Range("B10").Value + 1
            Worksheets("Programm").Range("B10").Value = spalte
            Rx = ""
            RxInput = ""
                
        ElseIf RxInput = "Z" Then
            Worksheets("Programm").Range("B10").Value = 1
                
            Rx = ""
            RxInput = ""
            Rx = MSComm1.Input
            Worksheets("Programm").Range("B8").Value = Rx
               
            RxInput = MSComm1.Input
                If RxInput = ";" Then
                    Rx = ""
                    GoTo Abfrage
                End If
            Rx = Rx + RxInput
            Worksheets("Programm").Range("B8").Value = Rx
            RxInput = MSComm1.Input
                    If RxInput = ";" Then
                    Rx = ""
                    GoTo Abfrage
                End If
            Rx = Rx + RxInput
            Worksheets("Programm").Range("B8").Value = Rx
                
               
        ElseIf RxInput = "E" Then
            MSComm1.PortOpen = False
            MsgBox ("Übertragung erfolgreich beendet!")
        Else
            Rx = Rx + RxInput
              
            zeile = Worksheets("Programm").Range("B8").Value
            spalte = Worksheets("Programm").Range("B10").Value
            Worksheets("Messwerte").Cells(zeile + 3, spalte + 1).Value = Rx
        End If

                        

   End Select

End Sub


Freue mich über Verbesserungsvorschläge!!!!

Autor: ahnungslos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast RThreshold = 1, gesetzt d. h. es wird ein OnComm-Ereignis bei 
eintreffen eines Zeichens ausgelöst.

Im OnComm-Ereignis holst du aber mehrfach Zeichen mit "RxInput = 
MSComm1.Input".

Beim ersten "RxInput = MSComm1.Input" in deiner OnComm-Ereignis-Prozedur 
wird natürlich das Zeichen gelesen, das das Ereignis ausgelöst hat.

Aber du kannst doch gar nicht sicher ein, dass zu den Zeitpunkten der 
weiteren "RxInput = MSComm1.Input" Zuweisungen auch schon weitere 
Zeichen im Eingangspuffer vorhanden sind. Du must vor dem Abholen der 
Zeichen prüfen, ob auch welche da sind und ggfls. warten, bis eines da 
ist. (Dabei ein timeout nicht vergessen, damit dein Programm nicht 
endloos wartet).

Autor: Burns B. (fox1707)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AHA!

Das heißt, ich kann in einem OnComm Ereignis keine weitere Zeichen 
lesen?!?

Wie kann ich nun prüfen ob weitere Zeichen vorhanden sind?

Oder bietet sich eine ganz andere Lösung an?

Autor: Paul P. (dorpreuss)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

das gehört zwar nur bedingt hier hin, aber ich habe auch ein kleines 
Problem zum Thema.

Ich habe Visiual Studio.net 2003 installiert und MS Excel 2003. Ich habe 
aber diese mscomm.dll nicht. Wo finde ich die, oder ist die da gar nicht 
dabei?

Vielen Dank

Paul

Autor: ahnungslos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Burns B.

Entweder du stellst vor jeder "Rx = MSComm1.Input" Zuweisung sicher, 
dass auch mindestens ein Zeichen da ist
    While Me.MSComm1.InBufferCount < 0
        DoEvents
    Wend
    Rx = MSComm1.Input

Oder (falls du vorher weisst, wieviele Zeichen kommen) du wartest
am Anfang deiner Ereignisprozedur, bis alle Zeichen da sind
    Dim iAnzahlErwarteterZeichen As Integer
    :
    iAnzahlErwarteterZeichen = 5
    While Me.MSComm1.InBufferCount < iAnzahlErwarteterZeichen
        DoEvents
    Wend
    :    
    Rx = MSComm1.Input
    :
    Rx = MSComm1.Input
    :
    Rx = MSComm1.Input
    :
    Rx = MSComm1.Input
    :
    Rx = MSComm1.Input
    :

Autor: ahnungslos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Paul P.

Du kannst das MSComm-Steuerelement irgendwo als Komponente hinzufügen. 
Such mal in der Hilfe nach Komponenten. (War jedenfalls unter VB6 noch 
so, mit .NET hab ich nix mehr/noch nichts am Hut).

Autor: Burns B. (fox1707)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm,
Hab jetzt die erste Variante probiert, aber jetzt geht die Variable 
ZEILE von 0 - 9 und fängt wieder bei 0 an.

Könnte es funktionieren, wenn ich RThreshold = 4 setzte und die 
kommenden Daten so ändere, dass immer 4 Zeichen zusammengehören?



Zeile Nr.     Werte Trennzeichen + 3 Ziffen      Ende der Übertragung
Z001           ;100 ;101 ;102 ;103 ;104 ;105        ;EEE

Die Lösung sollte so einfach wie möglich sein.

Autor: ahnungslos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vorschlag, wenn jede Zeile 29 Zeichen hat:
(VB ist schon Jahre her....)

Private Sub MSComm1_OnComm()
    Dim zeile As Integer
    Dim spalte As Integer
    
    
Select Case MSComm1.CommEvent
        Case comOverrun:   MsgBox "Datenverlust! Overrun"
        Case comRxOver:    MsgBox "Datenverlust! RxOver"
        Case comEvReceive           
        
            
Abfrage:    

        RxInputString = MSComm1.Input
          
        If RxInputString = "Z" Then
          While MSComm1.InBufferCount < 28
              DoEvents
          Wend
          RxInputString = RxInputString & MSComm1.Input 

          '''' Kompletten String empfangen -> Bitte bearbeiten...

        ElseIf RxInputString = "E"

            ' Ende-Kennung

        ElseIf

            ' Verwerfen, da mitten in der Übertragung

        End
                       

End Select

End Sub


Autor: Burns B. (fox1707)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Funktioniert nur, wenn ich DoEvents in die While-Schleife weglasse.
Ansonsten bekomme ich einen BLUESCREEN (verwende RS232-Converter).

Nun hab ich folgendes Problem:
Wenn z.B. der Mikrocontroller die Zeile nicht vollständig ausgibt, oder 
während der Übertragung das Kabel ausgesteckt wird, wartet Excel (und 
hängt sich auf).
Da hilft mir das Timeout auch nicht weiter.
???


Da alle Werte sehr wichtig sind, werde ich ein Zeichen an dem MC 
zurücksenden, wenn eine Zeile erfolgreich Übertragen wurde. Danach 
können die Werte aus dem EEPROM gelöscht werden.

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.