Forum: PC-Programmierung Probleme beim Einlesen von Daten in Excel von COMx


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Fritz H. (fritzhelmut)


Lesenswert?

Guten Abend.
Ich habe da ein komisches Problem beim Dateimport in Excel über VBA von 
einer Seriellen Schnittstelle (USB).

Ich übertrage von einem ARDUINO MEGA über Serial3 bestimmte Werte über 
TTL-USB Wandler an einen USB-Port an einen PC 32-BIT, Windows 7, Excel 
2013.
Es sind nur kurze Sequenzen z.B. "W01:0","W01:1", SYS:1" etc.

Dort lese ich die Daten über Excel mit einem VBA Makro von COM5 in eine 
Exceltabelle ein.
Klappt soweit gut bis auf ein Problem.

Das ist:
Wenn ich die Exceldatei öffne und das Einlese-Makro starte, kann Excel 
(VBA) scheinbar die USB-Schnittstelle z.Z. COM5 nicht "öffnen", es 
werden keine Daten eingelesen, das Makro hängt sich auf und Excel stürzt 
ab (steht dann - Excel Fenster erste Zeile - keine Rückmeldung und das 
Fenster wird grau).
Es kommt kein Datei oder Namensfehler, also ist COM5 ansprechbar.

Das Makro hängt dann in der Input Anweisung fest, zeigt der Debugger.

Mal die wichtigsten Codeteile
Variabledeklaration
...
Close #1
Open "COM5:9600,N,8,1" For Binary Access Read As #1

' Open "COM5:9600,N,8,1" For INPUT As #1
' da funktioniert gar nix, weder noch

...

Do
...
Egal welche der Inputvariante ich nehme ...
=> Input #1, Meldung
oder
=> Line Input #1, Meldung
oder
' einlesen der Daten solange kein ENTER
Meldung = ""
zeichen = ""
While (zeichen <> Chr(13))
  => zeichen = Input(1, #1)
   If (zeichen > Chr(31)) Then Meldung = Meldung + zeichen
Wend

  ... Aufbereitung und abspeichern der Werte ...
Loop

Erst wenn ich die COM5 mit der ARDUNIO IDE und dem Seriellen Monitor 
"geöffnet" und einige Datensätze angeschaut habe,
dann den Seriellen Monitor wieder schließe,
jetzt die Exceldatei öffne,
dann das Makro starte,
=> dann funktioniert das einlesen mit dem Makro aus der COM5 und die 
gesamte anschließende Datenverarbeitung.

Hat jemand eine Idee woran das liegt, ich bin ratlos?
Würde mir sehr helfen auch weil ich bei GOOGLE und co bisher nicht 
fündig geworden bin.


Viele Grüße
Fritz

von IT-Abteilung (Gast)


Lesenswert?

Was haben diese Daten in Excel verloren? Die gehören da nicht hin.

von c-hater (Gast)


Lesenswert?

IT-Abteilung schrieb:

> Was haben diese Daten in Excel verloren? Die gehören da nicht hin.

Warum nicht? Es kommt doch wohl auf die Daten an. Du weisst darüber 
nicht mehr als wir. Du erfrechst dich aber, zu entscheiden, dass sie 
nicht in Exel gehören würden.

Das zeugt genau von Einem: du bist vollkommen inkompetent. Hast den 
Schuss nicht gehört. Hast keine Ahnung, was wirklich wichtig für so eine 
Entscheidung sein könnte. Fazit: bist ein Bläho.

von Dirk B. (dirkb2)


Lesenswert?

Lass dir mal den Status der Steuerleitungen anzeigen.

von FritzHelmut (Gast)


Lesenswert?

Da ich das nur Hobbytechnisch mache weiß ich nicht wie. Kannst du mir 
sagen wie ich das unter VBA machen muss?
Und für den Fall das diese inkorrekt stehen wie ich diese dann richtig 
setze?
Gruss Fritz

von Dirk B. (dirkb2)


Lesenswert?

Nein.
VBA mache ich nicht sehr häufig.

Aber es gab einige Programme, die unter Windows 7 noch mit der seriellen 
Schnittstelle liefen, unter Windows 10 (oder nach einem Update) nicht 
mehr.

Eine Reduzierung auf 3 Leitungen (Rx, Tx, Gnd) hat da geholfen.
Ist bei einer virtuellen Schnittstelle über USB etwas schwierig.

von Jim M. (turboj)


Lesenswert?

Könnte übrigens auch die Benamsung der Schnittstelle selbst sein, ich 
öffne COM Ports unter Windows immer als  "\\.\COMx".

von Dirk B. (dirkb2)


Lesenswert?

Jim M. schrieb:
> Könnte übrigens auch die Benamsung der Schnittstelle selbst sein, ich
> öffne COM Ports unter Windows immer als  "\\.\COMx".

Das macht erst ab x >= 10 Probleme

von Yalu X. (yalu) (Moderator)


Lesenswert?

Da ist anfangs vermutlich der Hardware-Handshake aktiv, weswegen das
Senden von Daten blockiert wird. Startest du vorher ein anderes
Programm, das den Handshake deaktiviert, funktioniert das Ganze.

Ich bin kein Windows- und erst recht kein VBA-Experte, aber du kannst
mal versuchsweise dem "COM..."-String ein ",N" anhängen, das den
Handshake deaktivieren sollte:

1
Open "COM5:9600,N,8,1,N" For Binary Access Read As #1

Wenn das auch nicht funktioniert, kannst du die Schnittstelle auch mit
entsprechenden Win32-Funktionen öffnen, so wie es wohl die meisten
Programme tun, da das Öffnen mit Open und dem "COM..."-String schon
immer (seit MS-DOS-Zeiten) etwas hakelig war. Das ist aber etwas
komplizierter, aber im Netz findest du Beispiele dazu.

von Fritz H. (fritzhelmut)


Lesenswert?

Hallo
habe ich ausprobiert!

Vorschlag 1:
Open "\\.\COM5:9600,N,8,1" For Binary Access Read As #1
=> Laufzeitfehler 53, Dateiname nicht gefunden

Vorschlag 2:
Open "COM5:9600,N,8,1,N" For Binary Access Read As #1
selbe Effekt wie bisher aber ohne Fehlermeldung!

Dank bisher an alle die hier Ideen eingebracht haben!

Ich habe jetzt gelesen das das so einfach wohl sowieso nicht geht. Mann 
muss über irgendwelche DLL da irgendwelche Zugriffe auf die PORTS 
freischalten usw.
Wahrscheinlich macht der Seriell Monitor von der Arduino IDE das und ich 
habe bisher im Huckepack sozusagen dann diese Funktionalitäten nur 
nutzen können!

Also Weitersuchen oder hat jemand ein funktionierendes Beispiel incl. 
aller Handlungschritte wenn dort zusätzliche DLL's installiert und 
angemeldet werden müssen. Bisher habe ich nur immer irgendwelche 
Teilfragmente gefunden die dann bei mir nicht liefen weil irgend etwas 
fehlte.

Muss ich weiter suchen.
Gruß Fritz

von Fritz H. (fritzhelmut)


Lesenswert?

Hallo Dirkb2,

eigentlich Nutze ich nur 2 Leitung.
Arduino             Serial-USB-Wandler    PC
Sender TX    zu Rx  TTL-USB-Wandler - steckt im USB-Anschluss des PC
Sender GND   zu GND TTL-USB-Wandler

Sender Rx ist offen weil bisher ja keine Rückmeldung vom PC an den 
Sender erfolgt.
Mehr ist da gar nicht verkabelt!
Der Wandler ist ein CP2102 TTL zu USB Konverter HW-598.
Der hat eingangseitig sowieso nur 5 Anschlüsse
1 x +5V
1 x GND
1 x Rx
1 x Tx
1 x 3,3V
und auf der anderen Seite den USB-Stecker.

Gruß
Fritz

von Schlaumaier (Gast)


Lesenswert?

Ich vermute die initialisiert den Port nicht.

Hier mal ein Code mit VB 2010 der Funktioniert.

Der sollte in VBA fast das selbe sein. Kannst ihn ja mal testen.

Public Class hp
  Dim S_Port As New IO.Ports.SerialPort  ' das ini den Port

Sub einlesen
 If S_Port.IsOpen Then ' schliest ein möglicherweise offnen Port
      S_Port.Close()
    End If
    S_Port.PortName = "COM10"
    S_Port.BaudRate = 9600
    S_Port.Open()

    lauf = true
    do while lauf = true
       S_Port.read(tx$)
      if tx$ = "ende" then lauf = false' hier abbruchbedingung sonst 
todesschleife
    loop
    S_Port.Close()
end sub

von Schlaumaier (Gast)


Lesenswert?

Fritz H. schrieb:
> Ich habe jetzt gelesen das das so einfach wohl sowieso nicht geht. Mann
> muss über irgendwelche DLL da irgendwelche Zugriffe auf die PORTS
> freischalten usw.

Unsinn. Unter VB reicht völlig.

Imports System.IO


Wenn du es mit VBA nicht hin bekommst machst du einfach folgendes.

Sauge dir die VB-version runter bei MS.

Dann das INTEROP Packet von Excel in dein Projekt einfügen.

Imports Microsoft.Office.Interop.Excel.XlApplicationInternational
am Anfang des Projekt

Danach noch folgende Befehle in die lesende Sub :

 excel_pfad = hp_e_codierte_exceldatei_pfad.Text
 excel.Workbooks.Open(excel_pfad)  ' das öffnet die Excel-Datei wo ein 
rein soll
excel.visible = true  ' dann hast du Excel in der Tastleiste.

excel.Rows(zeile).cells(spalte).value = tx$  ' schreibt in die Excel 
Datei in die angebene Zelle.


Ist nur eine Alternative Lösung.

Ich mag kein VBA deshalb mach ich alles so. Das ist viel besser und 
flexibler.

Einziger Nachtteil. Du darf NICHT während das Programm läuft in Excel 
eine Zelle anklicken. Das führt sonst zu sofortigen Absturz.

Um das zu verhindern einfach excel.visible = false setzen, und am ende 
der Sub (oder mit einen Anzeige Routine und doevents im Programm)
excel.visible = true  setzen.

Ich persönlich frage ein Checkbox-Teil ab nach seinen Status.

Ach und nur so nebenbei. Du kannst JEDEN Excel-Befehl o. Eigenschaft 
über VB so steuern. Die befehle sind fast die selben, du musst sie nur 
an das EXCEL-Objekt (s.o.) übergeben.

Wenn ich den VBA-Befehl nicht weiß, zeichne ich unter Excel ein Makro 
dafür auf, dann editiere ich das Makro und lese den Befehl aus, bzw. 
kopiere ihn nach VB.

Ich benutze diese Technik allerdings meist um Excel-Daten in Datenbanken 
zu schreiben, also als Schnittstelle. Ihr würdet euch wundern welche 
Datenmengen manche Leute in Excel verarbeiten anstatt in einer 
Datenbank.

Aber ich habe in der Firma auf diese Weise auch Daten aus einer AS-400 
gelesen, mit VB vorbereitet und am Ende kam eine schöne Tabelle mit 
Diagramm aus Excel raus, Ohne das ich Excel auch nur angeklickt habe. ;)

von Fritz H. (fritzhelmut)


Lesenswert?

Funktioniert so auch nicht, kommt gleich Fehler

Option Explicit

 Public Class hp  => erwatet Anweisungsende
   Dim S_Port As New IO.Ports.SerialPort  ' das ini den Port
...

von Fritz H. (fritzhelmut)


Lesenswert?

,,,
Wenn du es mit VBA nicht hin bekommst machst du einfach folgendes.

Sauge dir die VB-version runter bei MS
...

Danke für den Vorschlag, aber ich will doch nur einige Daten über die 
USB-Schnittstelle in Excel einlesen ohne vorher immer irgendwelche 
Klimmzüge machen zu müssen. Die Weiterverarbeitung dieser Daten in Excel 
und die Visualisierung funktioniert doch schon alles.

Meine VB-Kenntnisse sind = 0 und alles nochmal umbauen ... :-( ?
Gruß Fritz

von Yalu X. (yalu) (Moderator)


Lesenswert?

Fritz H. schrieb:
> eigentlich Nutze ich nur 2 Leitung.

Ach so, der PC sendet überhaupt nicht, sondern empfängt nur?

Ok, dann kann das von mir oben erwähnte Handshake-Problem nicht die
Ursache sein.

von Schlaumaier (Gast)


Lesenswert?

Fritz H. schrieb:
> Public Class hp  => erwatet Anweisungsende

OK. Das ist VB. Die Zeile kannst du löschen. Es kommt nur auf den 
DIM-Befehl an. Der init die Serielle Schnittstelle.

von Schlaumaier (Gast)


Lesenswert?

Fritz H. schrieb:
> Meine VB-Kenntnisse sind = 0 und alles nochmal umbauen ... :-( ?
> Gruß Fritz

Falsch. Deine VB Kenntnisse sind genau so gut/Schlecht wie deine 
VBA-Fähigkeiten. Weil das ist das selbe. Der einige Unterschied sind die 
intregierten Module der jeweiligen APP.

was ich in meinen Beispiel mit INTEROP mache, machst du in VBA direkt. 
Der Vorteil von VB selbst ist, das es mächtiger ist, und 10000 x mehr 
Möglichkeiten bietet.

Und man kann schönere Oberflächen bauen, als in VBA.

VBA ist nur eine abspeckte Version von VB, oder anders gesagt eine total 
überdimensioniertes Makro-Sprache.  Weshalb sie auch als Unsicher in 
Dateien (NICHT PROGRAMMEN) gilt.

Wenn du die Sicherheitseinstellungen in Excel nicht verstellt hast, 
bekommst du kein Marko ans laufen was sich in einer nicht mit deiner 
Office-Version erstellten Datei befindet.

MS ist da einfach wieder mal über das Ziel hinausgeschossen. Mit den 
Ergebnis das jedes Kiddy perfekte Viren coden kann die kaum ein 
Anti-Viren-Teil findet. Der berühmteste ist übrigens I-LOVE-YOU hast 
Millarden Euro an REALEN Schaden angerichtet. ;)

Ergo hat MS die Blockade eingeführt und schiebe den Schwarzen-Peter den 
User zu. ;) Aber das nur so nebenbei.

von c-hater (Gast)


Lesenswert?

Schlaumaier schrieb:

> was ich in meinen Beispiel mit INTEROP mache, machst du in VBA direkt.
> Der Vorteil von VB selbst ist, das es mächtiger ist, und 10000 x mehr
> Möglichkeiten bietet.

Nein, das ist Unsinn. Alles, was man mit VB.net machen kann, kann man 
auch mit VBA machen. Man muss es halt nur oft anders machen.

Im Übrigen nähert sich beides immer weiter an. MS arbeitet daran, 
letztlich VBA vollständig durch VB.net zu ersetzen, ist aber noch nicht 
ganz so weit. Viel fehlt aber wohl nicht mehr.

> Und man kann schönere Oberflächen bauen, als in VBA.

Who cares? Bei VBA-Anwendungen geht es i.d.R. darum, die zusätzliche 
Funktionalität in der durch die Office-Anwendung vorgegebene Oberfläche 
zu integrieren. Nicht darum, irgendwas daran vorbei zu bauen.

> VBA ist nur eine abspeckte Version von VB, oder anders gesagt eine total
> überdimensioniertes Makro-Sprache.

Unsinn. Du hast offensichtlich keine Ahnung.

> Wenn du die Sicherheitseinstellungen in Excel nicht verstellt hast,
> bekommst du kein Marko ans laufen was sich in einer nicht mit deiner
> Office-Version erstellten Datei befindet.

Unsinn. Aber klar: wenn man keine Ahnung hat, was man da tut, dann 
können solche "Beobachtungen" rauskommen...

von Fritz H. (fritzhelmut)


Lesenswert?

Hallo an Alle,

ich finde es eigentlich schade das die Diskussion zu einem was ist 
besser oder schlechter -  VB oder VBA - entartet ist. Zur Lösung meines 
Problems hat dies leider nicht beigetragen.

Aber egal, zwischenzeitlich habe ich die Lösung gefunden!

Wie bereits DirkB vermutete war die Leitung nicht richtig gesetzt.
Bevor ich die Exceldatei starte, setze ich jetzt mit
c:\windows\system32\mode com5: baud=9600 parity=n data=8 stop=1 to=off 
xon=off dtr=on rts=on
meine USB-Schnittstelle.
Im Normalmodus ist dtr=off und rts=off.
Der serielle Monitor der Arduino-IDE hat wohl auch nur diese beiden 
Parameter geändert.

Und es funktioniert!!!
Zwar verschluckt Excel das 1. Zeichen der Meldung - ist aber nicht 
weiter schlimm. Ich setzte vor die Nutzdaten im Microcontroler einfach 
noch ein Dummyzeichen und gut. Ich suche jetzt nicht weiter woran das 
nun wieder liegt.

Zur Sicherheit habe ich am Ende der Schleife noch ein kleine Pause 
eingefügt.

sub einlesen()
   ...
   do
     ...
     input #1, Meldung
     ...
     Application.Wait (Now + 0.000001)  '0.0001 = 10 s, 0,00001 1s, 
0.000001 1/10
    Loop
End Sub

Dank an alle für die Lösungshilfen.

Gruß
Fritz

von Schlaumaier (Gast)


Lesenswert?

c-hater schrieb:
> nsinn. Aber klar: wenn man keine Ahnung hat, was man da tut, dann
> können solche "Beobachtungen" rauskommen...

Sicher hast du eine Erklärung dafür das ich bei JEDER Datei mit Makros 
eine Warnung bekomme und ich extra "Makros aktivieren" anklicken muss.

c-hater schrieb:
> Bei VBA-Anwendungen geht es i.d.R. darum, die zusätzliche
> Funktionalität in der durch die Office-Anwendung vorgegebene Oberfläche
> zu integrieren.

VBA ist eine MAKRO-Sprache mit zu viel Funktionsumfang. Nicht mehr und 
auch nicht weniger.


Davon abgesehen habe ich nur den TO eine Alternative Lösung angeboten, 
von der ich weiß das sie funktioniert weil ich sie selbst schon getestet 
habe.

Das einzige was DU hier gesagt hast, ist die übliche Lästerei über mich 
und den TO.

von c-hater (Gast)


Lesenswert?

Schlaumaier schrieb:

> Sicher hast du eine Erklärung dafür das ich bei JEDER Datei mit Makros
> eine Warnung bekomme und ich extra "Makros aktivieren" anklicken muss.

Das liegt entweder daran, dass du zu blöd warst, deiner 
Office-Installation zu sagen, dass sie signierten Code ausführen darf, 
ohne rückzufragen oder aber daran, dass du zu blöd bist, deinen Code zu 
signieren (und dem Office zu ermöglichen, diese Signatur dann auch 
erfolgreich zu verifizieren).

Ist alles kein Hexenwerk. Man muss halt nur wissen, wie's geht. Das kann 
man LERNEN.

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]
  • [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.

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